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

时间:2018-10-05 17:25:19

标签: java access-modifiers

一个简单的例子

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);

然后这将不起作用,因为显然foo()受保护。但是,为什么首先要允许子类具有更多可访问的方法呢?在这种情况下有帮助吗?

3 个答案:

答案 0 :(得分:3)

通常,子类可以向从其父类继承的接口中添加方法。使方法更易于访问是有效地添加到界面中。

  

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

因为它对于保存子类引用的代码很有用。

  

在这种情况下有帮助吗?

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

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

答案 1 :(得分:1)

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

在您的示例中,B的所有实例也都是A的实例(请注意,这可能是过于简单化了,但对于此示例,我认为足够了)。 A仅保证拥有自己定义的公共方法。 B刚好成为其中一个受保护的方法public,但是让我们假设您有另一个名为C的类没有这样做。好吧,您可以将BC都转换为A,但是如果由于A使其公开而被允许在B上调用protected方法,那么您在传递C时会收到错误消息。

在另一个包中,您将B强制转换为A,因此您的对象有效地采用了A的接口,因此您只能使用给定的接口由A。 JVM是否可以解决问题并注意到1)A实际上是B,而2)B使得foo是公开的,所以foo应该是可以打电话吗?我的意思是我想可以,但是要在JVM中实施需要花费多少精力,并且容易出错?把事情简单化。如果类型为A,则接口为A。如果类型为B,则接口为A,除此之外,其他任何B都包括在内。

答案 2 :(得分:0)

如果您将A替换为B,则您可以 编译第二个示例。关键是:B可以在A可以使用的任何地方使用,但是也可以添加其他功能(例如将方法公开)。