假設有一個接口可移位和一個實現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