覆盖私有方法

时间:2014-04-16 03:19:01

标签: java oop inheritance private override

我的java书有以下练习题:

public class Person(){...}

public class Teacher extends Person{...}

它询问下列哪一项是真实陈述:

1:教师继承了Person的构造函数。

2:教师可以添加新方法和私有实例变量。

3:教师可以覆盖Person的现有私人方法。

这本书说2和3都是真的。我说只有2是真的。

我已经读过,子类确实继承了私有方法和成员字段,但却无法直接访问它们。所以我的问题是,如果无法直接访问现有私有方法,将如何覆盖它们?为什么人们想要覆盖私有方法,如果他们可能因为一个充分的理由被私有化?

4 个答案:

答案 0 :(得分:5)

  

3:教师可以覆盖现有的私人私人方法。

那是错的。

超类的私有方法/字段不可见/继承到子类。所以,你无法覆盖它们。

尝试使用示例

答案 1 :(得分:2)

方法只有在publicprotected或没有访问修饰符的情况下才会继承。 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)

正如其他人所说,子类不能覆盖继承类的私有方法。这特别是受保护关键字的目的。它适用于应该对其他对象是私有的,但仍可由子类访问的函数和数据成员。如果子类可以访问私有函数,那么受保护的关键字就没有用处。