java – 为什么我们不能用私有扩展类方法覆盖基类方法?
发布时间:2020-12-15 04:54:17 所属栏目:Java 来源:网络整理
导读:class One { void foo() { }}class Two extends One { private void foo() { /* more code here */ }} 为什么上面的代码片段错了? 解决方法 我将尝试将其他答案中的想法结合起来,得出一个答案. 首先,我们来看看代码中发生了什么. 看一下代码 One类有一个pac
class One { void foo() { } } class Two extends One { private void foo() { /* more code here */ } } 为什么上面的代码片段错了? 解决方法
我将尝试将其他答案中的想法结合起来,得出一个答案.
首先,我们来看看代码中发生了什么. 看一下代码 One类有一个package-private foo方法: class One { // The lack of an access modifier means the method is package-private. void foo() { } } Two类是One类的子类,foo方法是覆盖的,但是访问修饰符是私有的. class Two extends One { // The "private" modifier is added in this class. private void foo() { /* more code here */ } } 问题 Java语言不允许子类降低子类中方法,字段或类的可见性,因此,降低foo方法可见性的Two类是不合法的. 为什么降低能见度是个问题? 考虑我们想要使用One类的情况: class AnotherClass { public void someMethod() { One obj = new One(); obj.foo(); // This is perfectly valid. } } 在这里,在One实例上调用foo方法是有效的. (假设AnotherClass类与One类在同一个包中.) 现在,如果我们要实例化Two对象并将其放在类型One的obj变量中,该怎么办? class AnotherClass { public void someMethod() { One obj = new Two(); obj.foo(); // Wait a second,here... } } Two.foo方法是私有的,但One.foo方法允许访问该方法.我们在这里遇到了问题. 因此,在考虑继承时允许降低可见性没有多大意义. 链接 > Controlling Access to Members of a Class – “Java教程”中访问修饰符的说明. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |