以下程序失败:
abstract class A {
protected void method() {}
}
class B extends A {
private void method() {}
}
public class main{
public static void main(String []args) {}
}
使用:
main.java:6: error: method() in B cannot override method() in A
private void method() {}
^
attempting to assign weaker access privileges; was protected
1 error
将派生方法设置为protected / private。
问题:Java之所以不允许您进一步限制子类中的访问权限是什么原因?我将此与C ++形成鲜明对比,而C ++则完全相反。
答案 0 :(得分:7)
在Java中,默认情况下所有方法都是virtual
(private
和static
方法除外)。因此,在用Java重写方法时,必须使用对象引用的类中的定义。通过Java中的这个规则,您无法缩小被覆盖方法的可见性,只需保持相同的可见性或扩大它。
答案 1 :(得分:5)
所有Java方法都是虚拟的。因此,假设您获得的A
实际上是B
的实例。你不知道这个。您拨打A.method()
,但因为method
是虚拟的,它会尝试拨打B.method()
。但是B.method
是私有的,现在是什么?
编辑:显然,Java方法现在只是虚拟的 ,正如Luiggi Mendoza在他的回答中指出的那样。
进一步编辑:我想我所描述的场景是A.method
是公开的,你将其视为受保护的场景。但是你明白了。