2014-04-16 45 views
1

我的Java书有以下做法问题:重写私有方法

public class Person(){...} 

public class Teacher extends Person{...} 

而且它要求以下哪些是真实的陈述的:

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

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

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

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

我读过,子类确实继承私有方法和成员字段,但他们不能直接访问。所以我的问题是,如果不能直接访问,那么如何覆盖现有的私有方法?为什么要重写私有方法,如果它们可能因为一个很好的原因而被私有化?

+0

这是什么书? – Scott

+0

@斯科特巴隆的AP计算机科学第6版 –

+0

他们可能意味着保护?或者这只是一个错误。当你有很多信息时,一些错误必然会漏掉。 – immibis

回答

4

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

这是错误的。

超级类的私有方法/字段不可见/被继承到子类。所以,你不能重写它们。

用一个例子试试看

+0

嗯,我的AP的CS书是错的? –

+2

非常非常。只要输入这个例子,看看你试图编译时会发生什么。 – csmckelvey

+0

@SimionMita看到我的文章我不认为这本书是错的,也许是错误的选择只是 – mel3kings

1

方法继承,只有当他们是publicprotected或没有访问修饰符。 private不能被继承。我认为这本书意味着Teacher可以通过创建一个类似的方法名称来更改私有方法Person,因为教师没有看到该方法。这就是所谓的方法阴影。 这是要么选择错误的词使用覆盖而不是阴影,或者给出了错误的答案。

例子:

public class Person(){ 
    private void sayHello(){...}  
} 

public class Teacher extends Person{ 
    public void sayHello(){...} 
} 
+5

我不确定这是否真的算作重写。会吗? –

+2

这不称为覆盖。 –

+1

nope这是方法阴影,无论是选择错误的词使用覆盖而不是阴影,或者给出错误的答案。 – mel3kings

0

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

1

JLS §8.2被声明为private类的

成员不是由类的子类继承。