在Java中使用接口

3
假设有一个接口Displaceable和一个实现了Displaceable接口的类Circle。Displaceable接口中有一个名为move()的方法,当然在Circle类中也实现了该方法。
在以下场景中会发生什么?
Circle a =  new Circle(..);
Displaceable b = a;
b.move()

这个对象会引用圆的移动方法吗?

4个回答

11

是的,在你的情境下调用b.move()和调用a.move()是一样的。这就是多态性的体现。


1
它也被称为“动态分派”。 - ehdv

4

是的。

Displaceable b 表示可以对 b 进行什么操作。编译器可以(并且会)在编译时检查该类型(Displaceable)上是否存在该方法(move)。

如何做到这一点在编译时不一定清楚。运行时实现移动(move)的方式由具体实现决定。

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

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

只有当方法被定义为静态方法时,调用(例如 move)与实际实现之间才会有编译时绑定。这也是为什么静态方法不能在接口中定义,因为它们没有实现。


2

是的,绝对没问题。

这就相当于这样做:

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

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

move (new Square(args));

move (new Triangle(args));

如果您仔细思考,它相当于有一个抽象的超类Figure。

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

Figure f = new Circle(args);

f.move();

2

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

为了完整起见,我应该补充一下,如果Circle扩展了某个具有move()方法的其他类,则调用的方法可能不是在Circle中定义的,而是在某个超类中定义的。

总的来说,你的想法是正确的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接