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

时间:2014-05-09 20:07:10

标签: 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) {}
}

使用:

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 ++则完全相反。

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:5)

所有Java方法都是虚拟的。因此,假设您获得的A实际上是B的实例。你不知道这个。您拨打A.method(),但因为method是虚拟的,它会尝试拨打B.method()。但是B.method是私有的,现在是什么?

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

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