Java:使用子类成员变量调用父类方法

huangapple go评论70阅读模式
英文:

Java: Calling a parent's method with child's member variable

问题

假设我有一个抽象的父类,其中有在一个方法中使用的成员变量。

public abstract class Person{
    public String jobTitle;
    public void printJob(){
        System.out.println(jobTitle);
    }
}

如果现在我有两个子类:

public class Teacher extends Person{
    public String jobTitle = "Teacher";
}
public class Janitor extends Person{
    public String jobTitle = "Janitor";
}

而且我想避免代码克隆,即在这两个类中实现相同的 printJob() 方法,我现在有一个问题,因为 printJob() 方法无法访问子类的成员变量。

是否有办法调用父类的方法,但让方法使用子类的成员变量?

英文:

Let's say I have an abstract parent class that has member variables which are used in a method.

public abstract class Person{
    public String jobTitle;
    public void printJob(){
        System.out.println(jobTitle);
    }
}

If I now have two child classes

public class Teacher extends Person{
    public String jobTitle = "Teacher";
}
public class Janitor extends Person{
    public String jobTitle = "Janitor";
}

and I want to avoid code cloning, i.e. implementing the same printJob()-method in both classes, I now have a problem, since the printJob()-method is unable to access member variables of the child classes.

Is there any way that i can call a parent classes' method but have the method use the child classes' member variables?

答案1

得分: 2

你可以像这样使用抽象方法:

public abstract class Person {
   public void printJob() {
      System.out.println(getJobTitle());
   }

   protected abstract String getJobTitle();

   public static void main(String[] args) {
      Person teacher = new Teacher();
      Person janitor = new Janitor();

      System.out.println(teacher.getJobTitle());
      System.out.println(janitor.getJobTitle());
   }
}

class Teacher extends Person {
   @Override
   protected String getJobTitle() {
      return "Teacher";
   }
}

class Janitor extends Person {
   @Override
   protected String getJobTitle() {
      return "Janitor";
   }
}

在根据 op 的评论更新代码后...

public class Person {
   public static void main(String[] args) {
      System.out.println(new Teacher().job);
      System.out.println(new Janitor().job);
   }

   private static class Teacher extends Person {
      private String job = "Teacher";
   }

   private static class Janitor extends Person {
      private String job = "Janitor";
   }
}
英文:

You can use abstract methods like this

public abstract class Person {
   public void printJob() {
      System.out.println(getJobTitle());
   }

   protected abstract String getJobTitle();

   public static void main(String[] args) {
      Person teacher = new Teacher();
      Person janitor = new Janitor();

      System.out.println(teacher.getJobTitle());
      System.out.println(janitor.getJobTitle());
   }
}

class Teacher extends Person {
   @Override
   protected String getJobTitle() {
      return "Teacher";
   }
}

class Janitor extends Person {
   @Override
   protected String getJobTitle() {
      return "Janitor";
   }
}

Updated after op's comment for code cloning...

public class Person {
   public static void main(String[] args) {
      System.out.println(new Teacher().job);
      System.out.println(new Janitor().job);
   }

   private static class Teacher extends Person {
      private String job = "Teacher";
   }

   private static class Janitor extends Person {
      private String job = "Janitor";
   }
}

huangapple
  • 本文由 发表于 2020年3月16日 23:40:31
  • 转载请务必保留本文链接:https://go.coder-hub.com/60708954.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定