2010-05-04 65 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)的編譯時綁定到實際的實現是當一個方法被定義爲靜態的。這也是爲什麼靜態方法不能在接口中定義的原因,因爲它們不包含實現。