假设有一个Displaceable接口和一个实现Displaceable的类Circle。 Displaceable有一个名为move()的方法,当然是在Circle中实现的。
以下情况会发生什么?
Circle a = new Circle(..);
Displaceable b = a;
b.move()
对象是否会引用Circle的移动方法?
答案 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
中可能没有定义被调用的方法。 },但是有些超类。
但总的来说,你有正确的想法。