use*_*084 3 java oop inheritance
以下程序失败:
abstract class A {
protected void method() {}
}
class B extends A {
private void method() {}
}
public class main{
public static void main(String []args) {}
}
Run Code Online (Sandbox Code Playgroud)
有:
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
Run Code Online (Sandbox Code Playgroud)
将派生方法设置为protected/private.
问题:Java不允许您进一步限制子类中的访问权限的原因是什么?我将此与C++形成对比,C++具有完全相反的规则.
在Java中,virtual默认情况下都是所有方法(除了private和static方法).因此,在使用Java重写方法时,它必须使用对象引用的类中的定义.通过Java中的这个规则,您无法缩小被覆盖方法的可见性,只需保持相同的可见性或扩大它.
所有Java方法都是虚拟的.所以假设你得到的A实际上是一个实例B.你不知道这个.你打电话A.method(),但因为method是虚拟的,它会试着打电话B.method().但是B.method是私人的,所以现在呢?
编辑:显然,Java方法现在默认是虚拟的,正如Luiggi Mendoza在他的回答中指出的那样.
进一步编辑:我想我所描述的场景是一个A.method公开的场景,你将它作为受保护的场景.但是你明白了.