假如有兩個類,如下:
class life }
class animal extends life
}
life 類和 animal 類中都有 tostring() 方法,如果發生下面的情況,會呼叫哪個 tostring() 方法呢:
life a = new animal();
system.out.println(a.tostring());
輸出結果為:
animal從結果看出,a 呼叫了 animal 類中的 tostring() 方法。
a 的宣告型別是 life ,a 被指向使用 new animal() 建立的物件,所以 a 的實際型別應該為 animal 。a 呼叫哪個 tostring() 方法是由它的實際型別決定的。這就是動態繫結。
假設 piggy 是 pig 的子類,pig 是 animal 的子類,animal 是 life 的子類,而 life 是 object 的子類。如果物件 g 是類 piggy 的例項,那麼當你呼叫乙個方法 m 時,jvm 會依次在類 piggy 、pig 、animal 、life 、object 中尋找方法 m,直到找到乙個方法 m 便會停止尋找,然後呼叫這個最先找到的方法。這就是動態繫結的工作機制。
下面是關於動態繫結機制的乙個例子:
public class test
public static void printstring(life life) }
class life
class animal extends life }
class pig extends animal }
class piggy extends pig
輸出結果為:
pig最後輸出的 life@15db9742 是 object 類中 tostring() 的返回結果。piganimal
life@15db9742
java動態繫結
class father class son extends father public static void main 1.當子類重寫了父類的方法時,f 會呼叫子類的方法。class father class son extends father public static void main ...
java動態繫結與靜態繫結
首先需要了解方法的呼叫過程 1.編譯器檢視物件宣告型別與方法。假設呼叫x.f param 且隱式引數型別x宣告為c型別的物件。需要注意的是 可能存在多個名稱為f的方法,但是引數型別不一樣,例如f string f int 這時編譯器會列舉 出c類中方法名為f和c類的父類中修飾符為public的f方法...
Java之動態繫結
動態繫結就是多型。class1繼承了class2,class2繼承了class3,一直到class n 1 定義class1的物件。class1 class1test new class1 class1test.funtionname 編譯器就會從class1開始尋找這個方法,如果在class1中不...