一个简单的例子
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()受保护。但是,为什么首先要允许子类具有更多可访问的方法呢?在这种情况下有帮助吗?
答案 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
的类没有这样做。好吧,您可以将B
和C
都转换为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可以使用的任何地方使用,但是也可以添加其他功能(例如将方法公开)。