2010-05-04 67 views
3

假设有一个接口可移位和一个实现Displaceable的类Circle。 Displaceable有一个名为move()的方法,当然这是在Circle中实现的。在java中使用接口..Newb问题

以下情况会发生什么情况?

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

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

回答

11

是,b.move()将是相同的在你的场景中调用a.move()。这是polymorphism的行动。

+1

它也被称为“动态调度” – ehdv 2010-05-04 20:15:48

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(); 
2

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

为了完整起见,我要补充的是,如果Circle延伸具有move()方法一些其他的类,它有可能是被调用的方法Circle没有规定,但一些超。

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

4

是的。

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

这是怎么做的,在编译时不一定清楚。在运行时需要执行(移动)。

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

即使Displaceable是一个类,而不是一个接口,并实现move本身的实际move称为运行时仍然会实现(如果该实现Circle将会覆盖Displaceable实现)。

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