【问题标题】:Java: A public method inherited from superclass invokes a private method.Java:从超类继承的公共方法调用私有方法。
【发布时间】:2015-03-07 05:45:39
【问题描述】:
public class Test {
  public static void main(String args[]){
      Student s = new Student();
      s.printPerson();
  }
}

class Person{
  private String getInfo(){
      return "Person";
  }
  public void printPerson(){
      System.out.println(getInfo());
  }
}

class Student extends Person{
  private String getInfo(){
      return "Student";
  }
}

输出为Person。我对这个结果感到困惑。在 main 方法中,引用类型为Student。所以在执行s.printPerson()时,应该执行Student的方法。关键是,在继承自超类的公共方法中,调用了哪个私有方法?为什么?

我认为在s.printPerson() 中,它调用了getInfo()Student。但事实证明不是。 IDE 告诉我

private String getInfo(){
      return "Student";
}

从未使用过。

谁能帮我解决这个问题?

【问题讨论】:

  • 如果我从 Person 类中调用 getInfo(),我知道它会输出“Person”。但在我的代码中,我从类Student 中调用getInfo(),而不是Person。我从Student调用getInfo(),它似乎调用了PersonprintPerson()方法,而不是Student。我对这个问题感到困惑。
  • 我稍微修改一下代码。我用Person 中完全相同的代码覆盖Student 中的getInfo()。现在输出是“学生”。我想知道继承方法的机制。我认为输出应该是一样的,因为无论我是否覆盖getInfo(),方法的内容都是一样的,所以输出应该是一样的。有没有人可以帮我解决这个问题?非常感谢。

标签: java inheritance polymorphism private


【解决方案1】:

在 Java 中,private methods are not inherited

子类不继承其父类的private 成员。但是,如果超类具有访问其私有字段的公共或受保护方法,则子类也可以使用这些方法。

您不能通过创建另一个 getInfo 方法来覆盖 getInfo,因为它不是继承的。这就是为什么您的 IDE 给您“从未使用过”警告的原因,因为 Student 中没有任何内容使用它。调用来自PersongetInfo,因为它可用于PersonprintPerson 方法,所以会打印Person

要覆盖一个方法,它不能是private。您可以将getInfo 包私有(无访问修饰符)、protectedpublic。然后Student 将能够覆盖它。

【讨论】:

    【解决方案2】:

    您使用private 修饰符。这个修饰符意味着该方法只能在类本身中可见,而不是其他类,甚至它的子类和超类。因此,当您从类Person 调用getInfo() 时,唯一可见的方法是Person 类中定义的方法。实际上,这意味着私有方法不会在 Java 中继承。

    尝试将private 修饰符更改为protected。然后子类可以从超类中看到方法,因此它们可以覆盖该方法。

    【讨论】:

    • 我认为子类中的方法在其超类中永远不可见(不仅对于私有方法)。我错了吗?
    • 感谢您的回答。我还是不明白。我称Student 类的getInfo() 方法不是Person。它应该调用Student 类的printPerson() 吗?更多细节在原帖的cmets中。谢谢。
    猜你喜欢
    • 2014-08-06
    • 2011-10-17
    • 2011-09-19
    • 2014-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多