为了账号安全,请及时绑定邮箱和手机立即绑定

为什么子类的方法更容易访问?

为什么子类的方法更容易访问?

Smart猫小萌 2021-10-28 15:54:15
一个简单的例子class A {    protected int foo(int x){        return x;       }}class B extends A {    public int foo(int x){        return x*x;     }}这在 Java 中是允许的,并且没有任何问题。但是让我们说在另一个包中你声明A b = new B();int z = b.foo(5);那么这将不起作用,因为显然 A foo() 是受保护的。但是,为什么首先要允许在子类中有更多可访问的方法呢?是否有这种情况有帮助?
查看完整描述

3 回答

?
RISEBY

TA贡献1856条经验 获得超5个赞

一般来说,子类可以向它们从父类继承的接口添加方法。使方法更易于访问是有效地添加到接口中。


但是,为什么首先要允许在子类中有更多可访问的方法呢?


因为它对于包含子类引用的代码很有用。


是否有这种情况有帮助?


一个很好的例子是Object.clone(),一种受保护的方法。所有 Java 类都是Object. 支持克隆的子类可以选择公开这个方法。


Foo foo1 = new Foo();

Foo foo2 = foo1.clone(); // Sometimes you're holding a subclass reference.


查看完整回答
反对 回复 2021-10-28
?
慕的地6264312

TA贡献1817条经验 获得超6个赞

因为分类应该允许您将子类视为其超类的实例。我认为这称为is-a关系(即B is-a A,但不是相反)。我真的不知道简洁地解释这一点的好方法。

在您的示例中,所有实例B也是 实例A(请注意,这可能过于简单化,但我认为对于此示例就足够了)。A仅保证在其自己的定义中具有公开的方法。B只是碰巧创建了一个受保护的方法public,但假设您有另一个C未执行此操作的类调用。好吧,您可以同时将BC转换为A,但是如果您被允许调用受保护的方法 onA因为B将其公开,那么您在传递C.

在另一个包中,您将强制转换BA,因此您的对象有效地采用了 的接口,A因此您只能使用由 提供给您的接口A。在JVM可以顺利通过的麻烦和通知:1)A其实B和2)B使foo公众,所以foo应该是可调用的?我的意思是我可以假设,但是在 JVM 中实现需要多少努力以及它有多容易出错?把事情简单化。如果类型为A,则接口为A。如果类型为B,则接口为A以及B除此之外的任何其他内容。


查看完整回答
反对 回复 2021-10-28
  • 3 回答
  • 0 关注
  • 131 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信