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

问题描述 投票:0回答:3
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";
}

从未使用过。

有人可以帮我吗?

java inheritance polymorphism private
3个回答
2
投票

在Java中,

private
方法不是继承的

子类不会继承其父类的

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

您无法通过创建另一个

getInfo
方法来覆盖
getInfo
,因为它不是继承的。 这就是为什么你的 IDE 会给你“从未使用过”警告,因为
Student
中没有任何内容使用它。 调用来自
getInfo
Person
,因为它可用于
Person
printPerson
方法,因此打印
Person

要重写方法,它不能是

private
。 您可以将
getInfo
设为包私有(无访问修饰符)、
protected
public
。 然后
Student
将能够覆盖它。


2
投票

您使用

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

尝试将

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


0
投票

承认知识或与博隆纳一起培根......~•Homeschooler @QuickFin772m.me 这个DropOut角色装傻就够了。我厌倦了验证您的身份机制故障...ChanceyWishbone 收藏家Reservedcets 206M

© www.soinside.com 2019 - 2024. All rights reserved.