在java中使用接口

时间:2010-05-04 18:41:43

标签: java

假设有一个Displaceable接口和一个实现Displaceable的类Circle。 Displaceable有一个名为move()的方法,当然是在Circle中实现的。

以下情况会发生什么?

Circle a =  new Circle(..);
Displaceable b = a;
b.move()

对象是否会引用Circle的移动方法?

4 个答案:

答案 0 :(得分:11)

是的,b.move()与在您的场景中调用a.move()相同。这是polymorphism

答案 1 :(得分:4)

Displaceable b可以 b 做什么。编译器可以(并且确实)在编译时检查该方法是否可用于该类型(Displaceable)。

如何这样做在编译时不一定清楚。这取决于在运行时实现它(移动)。

在编译时,检查承诺(我可以移动!)。在运行时,代码必须证明它确实可以:)

即使Displaceable而不是接口,并且实现了move本身,实际的move调用运行时仍然是实现(如果该实现Circle,将覆盖Displaceable实现。

当一个方法被定义为静态时,唯一一次将调用(例如move)与实际实现进行编译时绑定。这也是为什么静态方法不能在接口中定义的原因,因为它们不能保持实现。

答案 2 :(得分:2)

是的,绝对。

和做这个一样

void move(Displaceable b){
    b.move();
}

//somewhere else
move (new Circle(args));

move (new Square(args));

move (new Triangle(args));

如果你考虑一下,它相当于有一个抽象的超类图

public abstract class Figure{
     public abstract move();
}
//Circle extends Figure;

Figure f = new Circle(args);

f.move();

答案 3 :(得分:2)

是。很酷,不是吗?这就是多态性的美妙。

为了完整起见,我应该补充说,如果Circle扩展了其他具有move()方法的类,则Circle中可能没有定义被调用的方法。 },但是有些超类。

但总的来说,你有正确的想法。