Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 与C++;,为什么方法可见性可以';覆盖时不能缩小?_Java_Oop_Inheritance - Fatal编程技术网

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

将派生方法设置为受保护/私有作品


<强> >问题:java为什么不让你进一步限制子类中的访问?< /强>我将它与C++有了完全相反的规则进行对比。

< P>所有java方法都是虚拟的。因此,假设您得到一个
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