为什么动态类型方法不可见?

时间:2015-01-06 08:32:17

标签: java

让我们说:

interface A{
    void foo();
}

class B implements A{
    void foo(){}
    void doNothing(){}
}

我创建了一个B实例

 A object=new B();

为什么在object.doNothing()调用时会引发编译错误?

6 个答案:

答案 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)

由于objectAclass A,因此您没有任何名为doNothing的函数。

答案 5 :(得分:0)

您的代码看到object的外部接口为A,而A没有方法doNothing出现编译错误。