假设有一个接口可移位和一个实现Displaceable的类Circle。 Displaceable有一个名为move()的方法,当然这是在Circle中实现的。在java中使用接口..Newb问题
以下情况会发生什么情况?
Circle a = new Circle(..);
Displaceable b = a;
b.move()
对象是否会引用Circle的移动方法?
假设有一个接口可移位和一个实现Displaceable的类Circle。 Displaceable有一个名为move()的方法,当然这是在Circle中实现的。在java中使用接口..Newb问题
以下情况会发生什么情况?
Circle a = new Circle(..);
Displaceable b = a;
b.move()
对象是否会引用Circle的移动方法?
是,b.move()将是相同的在你的场景中调用a.move()。这是polymorphism的行动。
是的,绝对。
它同样的事情,这样做
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();
是的。很酷,不是吗?这就是多态的美妙之处。
为了完整起见,我要补充的是,如果Circle
延伸具有move()
方法一些其他的类,它有可能是被调用的方法Circle
没有规定,但一些超。
总的来说,你有正确的想法。
是的。
Displaceable b
说什么可以做才能b。编译器可以(并且)在编译时检查该方法是否可用于该类型(Displaceable)。
这是怎么做的,在编译时不一定清楚。在运行时需要执行(移动)。
在编译时,检查承诺(我可以移动!)。在运行时,代码必须证明它真的能:)
即使Displaceable
是一个类,而不是一个接口,并实现move
本身的实际move
称为运行时仍然会实现(如果该实现Circle
将会覆盖Displaceable
实现)。
唯一有一个调用(例如move
)的编译时绑定到实际的实现是当一个方法被定义为静态的。这也是为什么静态方法不能在接口中定义的原因,因为它们不包含实现。
它也被称为“动态调度” – ehdv 2010-05-04 20:15:48