Java:从超类继承的公共方法调用私有方法。

时间:2015-01-08 23:36:46

标签: java inheritance polymorphism private

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()的{​​{1}}。但事实证明并非如此。 IDE告诉我

Student

从未使用过。

有人可以帮我吗?

2 个答案:

答案 0 :(得分:2)

在Java中,private methods are not inherited

  

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

您无法通过创建其他getInfo方法来覆盖getInfo,因为它不会被继承。这就是为什么你的IDE给了你"从未使用过"警告,因为Student中没有任何内容使用它。来自getInfo的{​​{1}}被调用,因为它可用于Person的{​​{1}}方法,因此会打印Person

要覆盖方法,它不能是printPerson。您可以Person包私有(无访问修饰符),privategetInfo。然后protected将能够覆盖它。

答案 1 :(得分:2)

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

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