让我们说:
interface A{
void foo();
}
class B implements A{
void foo(){}
void doNothing(){}
}
我创建了一个B实例
A object=new B();
为什么在object.doNothing()调用时会引发编译错误?
答案 0 :(得分:2)
您正在使用" polymorphism" 。当您使用对象作为其父对象时,这是一种技术。 假设这个实现:
public interface Animal {
public void go();
}
class Dog implements Animal {
public void go() {
walk();
}
}
class Fish implements Animal {
public void go() {
swim();
}
}
class Duck implements Animal {
public void go() {
fly();
}
}
现在您可以执行以下操作:
Animal[] animals = {new Dog(), new Fish(), new Duck()};
现在,只要你想要一只动物去,你可以简单地将首选数组元素的go();
方法称为动物(不用担心它们的移动类型)
到现在为止,你能让鱼走路吗?不,因为并非所有动物都知道走路。
这就是为什么你不能在父对象上调用孩子的方法,因为父母看到它的孩子相同而它只知道去而不是行走等
在您的问题中,A
界面只知道void foo();
方法,并且不了解void doNothing();
方法。
答案 1 :(得分:1)
因为在编译时,Compilter检查引用类型方法绑定。因此,doNothing()
A
在编译时,编译器无法确定对这些引用上的方法doNothing()
的调用是否实际引用了该方法的哪个版本 - 超类版本或子类版本。
答案 2 :(得分:1)
因为对象是A而A没有名为doNothing的方法。如果要执行doNothing方法,请将其添加到接口A:
interface A {
void foo();
void doNothing();
}
或将对象创建为B而不是A.
B object = new B();
答案 3 :(得分:0)
因为类型A
没有#doNothing
方法,变量object
的编译时类型为A
。
答案 4 :(得分:0)
由于object
为A
且class A
,因此您没有任何名为doNothing
的函数。
答案 5 :(得分:0)
您的代码看到object
的外部接口为A
,而A
没有方法doNothing
出现编译错误。