Java動態綁定機制詳解

java動態綁定機制詳解  
動態綁定意思是目前正在調用的方法正是最適用於要操作對象的那個方法。爲了執行動態綁定,java使用一小段特殊的代碼來替代絕對地址的調用,這樣,根據這段代碼的內容
,每個對象都可以具有不同的行爲表現。當向一個對象發送消息時,該對象就能夠知道這條消息應該做些什麼。
舉個例子;
首先創建一個父類Shape,方法有draw()、erase()、move()、getColor()和setColor(),子類Circle()、Square()和Triangle()分別繼承父類的draw()和erase()方法。編寫一個方法:
void doSomething(Shape shape) {
Shape.erase();
//...
Shape.draw();
}
這個方法可以與任何Shape(即Circle、Square和Triangle)對話,因此它是獨立於任何它要draw和erase的對象的具體類,如果程序中其他部分調用dosomething()方法:
Circle circle = new Circle();
Triangle triangle = new Triangle();
Square square = new Square();
doSomething(circle);
doSomething( triangle);
doSomething( square);
對doSomething()的調用會自動地調用相應的類。如:
Circle可以被doSomething()看做Shape,Shape.erase()並不是說“如果是Circle,請這麼做;如果是Squre,請那麼做”。如果編寫了那種檢查Shape所有實際可能的子類的代碼,那麼這段代碼肯定雜亂不堪,則例要表達的僅僅是“你是一個Shape,我知道你可以erase你自己,那麼去做吧,但是要注意細節的正確性。”
這裏是把子類作爲參數傳入到doSomething(),然後調用裏面的方法。調用Circle的draw()和調用Squre的draw()方法所執行的代碼是不同的,即所謂的多態就出現了。
當Java編譯器在編譯doSomething()的代碼時,並不能確切知道doSomething()要處理的確切的子類,所以通常會期望它的編譯結果是調用父類Shape的erase()和draw()方法,而不是子類的方法。


本文絕大部分參考《Java編程思想》。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章