【发布时间】:2015-08-13 18:17:49
【问题描述】:
我在两个单独的文件中有以下代码。
package animal;
public class Frog
{
protected void ribbit()
{
System.out.println("In Frog class!");
}
}
package other;
import animal.*;
public class Tadpole extends Frog
{
protected void ribbit()
{
System.out.println("In Tadpole class!");
}
public static void main(String[] args)
{
Tadpole t = new Tadpole();
t.ribbit();
Frog f = new Tadpole();
f.ribbit(); // Does not compile
}
}
分配给Tadpole 类型的第一个Tadpole 对象显然编译得很好,对ribbit() 的调用将是Tadpole 的ribbit() 实现。创建并分配给Frog 引用的第二个Tadpole 对象。但是,对ribbit() 的调用会导致编译器错误。
我知道,如果你在子类中创建一个子类对象,并分配给一个在子类的包之外的超类引用,并尝试调用超类的方法,这是不允许的。但是在这种情况下,由于分配了Tadpole 对象,多态性不应该使对象引用“f”调用Tadpole 的ribbit() 方法吗?为什么这会导致编译器错误,为什么不允许这样做?
【问题讨论】:
标签: java inheritance polymorphism protected