public class test
{
public static void main(String[] args)
{
new Person().printPerson();
new Student().printPerson();
}
}
class Student extends Person
{
public String getInfo()
{
return "Student";
}
}
class Person
{
private String getInfo()
{
return "Person";
}
public void printPerson()
{
System.out.println(getInfo());
}
}
输出到:
Person
Person
为什么第二行不是学生?父getInfo()
是私有的,但这是否意味着printPerson()
的第二次调用无法找到子getInfo()
(公共)?我认为子方法不能继承私有getInfo()
,所以不会发生覆盖。
答案 0 :(得分:3)
父getInfo()是私有的,但这是否意味着阻止printPerson()的第二次调用找到子getInfo()(这是公共的)?
是。子类的getInfo()
方法不是覆盖超类的方法,因为它甚至没有逻辑知道关于它。私有方法无法覆盖。
在类C中声明的实例方法m1将覆盖在类A中声明的另一个实例方法m2,如果以下所有条件都为真:
- C是A的子类。
- m1的签名是m2签名的子签名(§8.4.2)。
- 或者:
- m2在与C或
相同的包中是公共的,受保护的或声明的,具有默认访问权限- m1会覆盖方法m3(m3与m1不同,m3与m2不同),这样m3会覆盖m2。
请注意第一个子项目 - 在您的情况下,m2
为Person.getInfo
,并且不是公共,受保护或在同一个包中声明为默认访问权限 - 因此子弹不适用。另一个子项也不适用,因此您无法满足覆盖的所有要求。
当你试图覆盖超类中的方法时,你应该使用@Override
注释 - 这样如果你做错了什么,你会得到一个编译时错误,而不仅仅是意外执行时的行为。
答案 1 :(得分:0)
如果该方法旨在被子类重写,则该方法应该对子类可见。
即。您应该将getInfo()
方法声明为受保护而非私有。
答案 2 :(得分:0)
getInfo
类不会覆盖Student
方法,因此当调用printPerson进入getInfo时,它会执行本地getInfo方法。