我的java书有以下练习题:
public class Person(){...}
public class Teacher extends Person{...}
它询问下列哪一项是真实陈述:
1:教师继承了Person
的构造函数。
2:教师可以添加新方法和私有实例变量。
3:教师可以覆盖Person
的现有私人方法。
这本书说2和3都是真的。我说只有2是真的。
我已经读过,子类确实继承了私有方法和成员字段,但却无法直接访问它们。所以我的问题是,如果无法直接访问现有私有方法,将如何覆盖它们?为什么人们想要覆盖私有方法,如果他们可能因为一个充分的理由被私有化?
答案 0 :(得分:5)
3:教师可以覆盖现有的私人私人方法。
那是错的。
超类的私有方法/字段不可见/继承到子类。所以,你无法覆盖它们。
尝试使用示例
答案 1 :(得分:2)
方法只有在public
或protected
或没有访问修饰符的情况下才会继承。 private
无法继承。我认为这本书的意思Teacher
可以覆盖'私有方法Person
通过使用更广泛或类似的访问修饰符创建类似的方法名称,因为教师没有看到该方法。这称为方法阴影。 这本书使用覆盖而不是阴影选择了错误的单词,或给出了错误的答案。
示例:
public class Person(){
private void sayHello(){...}
}
public class Teacher extends Person{
public void sayHello(){...}
}
答案 2 :(得分:1)
JLS §8.2
声明为private的类的成员不会被该类的子类继承。
答案 3 :(得分:0)
正如其他人所说,子类不能覆盖继承类的私有方法。这特别是受保护关键字的目的。它适用于应该对其他对象是私有的,但仍可由子类访问的函数和数据成员。如果子类可以访问私有函数,那么受保护的关键字就没有用处。