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

huangapple 未分类评论59阅读模式
标题翻译

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

问题

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

  1. public abstract class Person{
  2. public String jobTitle;
  3. public void printJob(){
  4. System.out.println(jobTitle);
  5. }
  6. }

如果现在我有两个子类:

  1. public class Teacher extends Person{
  2. public String jobTitle = "Teacher";
  3. }
  4. public class Janitor extends Person{
  5. public String jobTitle = "Janitor";
  6. }

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

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

英文翻译

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

  1. public abstract class Person{
  2. public String jobTitle;
  3. public void printJob(){
  4. System.out.println(jobTitle);
  5. }
  6. }

If I now have two child classes

  1. public class Teacher extends Person{
  2. public String jobTitle = "Teacher";
  3. }
  4. public class Janitor extends Person{
  5. public String jobTitle = "Janitor";
  6. }

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

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

  1. public abstract class Person {
  2. public void printJob() {
  3. System.out.println(getJobTitle());
  4. }
  5. protected abstract String getJobTitle();
  6. public static void main(String[] args) {
  7. Person teacher = new Teacher();
  8. Person janitor = new Janitor();
  9. System.out.println(teacher.getJobTitle());
  10. System.out.println(janitor.getJobTitle());
  11. }
  12. }
  13. class Teacher extends Person {
  14. @Override
  15. protected String getJobTitle() {
  16. return "Teacher";
  17. }
  18. }
  19. class Janitor extends Person {
  20. @Override
  21. protected String getJobTitle() {
  22. return "Janitor";
  23. }
  24. }

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

  1. public class Person {
  2. public static void main(String[] args) {
  3. System.out.println(new Teacher().job);
  4. System.out.println(new Janitor().job);
  5. }
  6. private static class Teacher extends Person {
  7. private String job = "Teacher";
  8. }
  9. private static class Janitor extends Person {
  10. private String job = "Janitor";
  11. }
  12. }
英文翻译

You can use abstract methods like this

  1. public abstract class Person {
  2. public void printJob() {
  3. System.out.println(getJobTitle());
  4. }
  5. protected abstract String getJobTitle();
  6. public static void main(String[] args) {
  7. Person teacher = new Teacher();
  8. Person janitor = new Janitor();
  9. System.out.println(teacher.getJobTitle());
  10. System.out.println(janitor.getJobTitle());
  11. }
  12. }
  13. class Teacher extends Person {
  14. @Override
  15. protected String getJobTitle() {
  16. return "Teacher";
  17. }
  18. }
  19. class Janitor extends Person {
  20. @Override
  21. protected String getJobTitle() {
  22. return "Janitor";
  23. }
  24. }

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

  1. public class Person {
  2. public static void main(String[] args) {
  3. System.out.println(new Teacher().job);
  4. System.out.println(new Janitor().job);
  5. }
  6. private static class Teacher extends Person {
  7. private String job = "Teacher";
  8. }
  9. private static class Janitor extends Person {
  10. private String job = "Janitor";
  11. }
  12. }

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

发表评论

匿名网友

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

确定