与C++相比,为什么在覆盖时不能缩小方法可见性?

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++具有完全相反的规则.

Lui*_*oza 7

在Java中,virtual默认情况下都是所有方法(除了privatestatic方法).因此,在使用Java重写方法时,它必须使用对象引用的类中的定义.通过Java中的这个规则,您无法缩小被覆盖方法的可见性,只需保持相同的可见性或扩大它.


adv*_*v12 5

所有Java方法都是虚拟的.所以假设你得到的A实际上是一个实例B.你不知道这个.你打电话A.method(),但因为method是虚拟的,它会试着打电话B.method().但是B.method是私人的,所以现在呢?

编辑:显然,Java方法现在默认是虚拟,正如Luiggi Mendoza在他的回答中指出的那样.

进一步编辑:我想我所描述的场景是一个A.method公开的场景,你将它作为受保护的场景.但是你明白了.