Java 与C++;,为什么方法可见性可以';覆盖时不能缩小?
以下程序失败:Java 与C++;,为什么方法可见性可以';覆盖时不能缩小?,java,oop,inheritance,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) {} } 与: 将派生方法设置为受保护/私有作品 >问题:java为什么不让你进一步限制子类中的访问?< /强>我将它与C++有了完全相反的规则进行对
abstract class A {
protected void method() {}
}
class B extends A {
private void method() {}
}
public class main{
public static void main(String []args) {}
}
与:
将派生方法设置为受保护/私有作品
A
,它实际上是B
的一个实例。你不知道这个。您调用A.method()
,但由于method
是虚拟的,因此它尝试调用B.method()
。但是B.method
是私有的,那么现在呢
编辑:正如Luiggi Mendoza在他的回答中指出的那样,显然Java方法现在只是默认的虚拟方法
进一步编辑:我猜我所描述的场景是
A.method
是公共的,您将其作为受保护的。但是你明白了。在Java中,默认情况下,所有方法都是虚拟的
(除了私有的
和静态的
方法)。因此,在Java中重写一个方法时,它必须与对象引用类中的定义一致。根据Java中的这条规则,您不能缩小重写方法的可见性,只需保持相同的可见性或扩大它。请参阅@Vishrant不是重复的。这个问题问的是如何在Java中实现这种行为。这个问题问为什么Java有这种行为。@Bheshgurhung看起来是一个不完整的解释。@P.K普 问题是java为什么有这种行为,而不是C++。解释是Java中的方法是virtual
。在C++中,您必须手动声明方法为“代码>虚拟< /COD>”以允许多态性。这就是解释。@ LigigimimZZ:我对C++不太熟悉。但我明白你的意思。我还编辑了标题IMHO,它现在更好地代表了这个问题。
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