加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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教程”中访问修饰符的说明.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读