靜態(tài)類(lèi)型和動(dòng)態(tài)類(lèi)型
任何一個(gè)引用變量都有兩個(gè)類(lèi)型:一個(gè)叫靜態(tài)類(lèi)型杖们,也就是定義該引用變量的類(lèi)型苍苞;另一個(gè)叫動(dòng)態(tài)類(lèi)型凤薛,也就是該引用實(shí)際指向的對(duì)象類(lèi)型一膨。
A a = new B();
那么座泳,引用a的靜態(tài)類(lèi)型就是A惠昔,動(dòng)態(tài)類(lèi)型就是B。
編譯看左邊挑势,運(yùn)行看右邊镇防。
java中引用的靜態(tài)類(lèi)型再編譯的時(shí)候就可以確認(rèn),但是編譯器無(wú)法得知這個(gè)引用的動(dòng)態(tài)類(lèi)型薛耻;只有程序運(yùn)行時(shí)营罢,通過(guò)RTTI(run time type identification, 運(yùn)行時(shí)類(lèi)型檢查)就可檢查出引用的動(dòng)態(tài)類(lèi)型饼齿。
-
綁定
對(duì)于一個(gè)程序饲漾,可以有很多的方法。這些方法的名稱(chēng)缕溉、參數(shù)類(lèi)型和參數(shù)數(shù)量都可能相同或者不同考传,那么再調(diào)用一個(gè)方法的時(shí)候,如何將一個(gè)方法和該方法所在的類(lèi)關(guān)聯(lián)起來(lái)证鸥,這就是綁定僚楞。java中的綁定分為動(dòng)態(tài)綁定和靜態(tài)綁定勤晚。
-
靜態(tài)綁定
所有依賴(lài)于靜態(tài)類(lèi)型來(lái)將方法和該方法所在的類(lèi)關(guān)聯(lián)起來(lái)的動(dòng)作就是靜態(tài)綁定。因?yàn)殪o態(tài)綁定發(fā)生在編譯時(shí)期泉褐,所以又叫前期綁定赐写。
-
動(dòng)態(tài)綁定
所有依賴(lài)動(dòng)態(tài)類(lèi)型來(lái)將方法和方法所在的類(lèi)進(jìn)行關(guān)聯(lián)的動(dòng)作就是動(dòng)態(tài)綁定。以為動(dòng)態(tài)綁定實(shí)在程序運(yùn)行時(shí)膜赃,通過(guò)RTTI實(shí)現(xiàn)挺邀,所以又叫后期綁定。
-
舉個(gè)栗子
有父類(lèi)Father和子類(lèi)Son跳座,子類(lèi)重寫(xiě)了父類(lèi)中的某個(gè)方法method()端铛。
Father father = new Son();
father.method();
在這個(gè)栗子中,靜態(tài)綁定的過(guò)程是:java文件編譯時(shí)疲眷,編譯器檢查出引用father的靜態(tài)類(lèi)型時(shí)Father類(lèi)禾蚕,于是將method()方法和父類(lèi)Father關(guān)聯(lián)起來(lái)。也就是說(shuō)狂丝,程序運(yùn)行前編譯器是無(wú)法檢查出引用father的動(dòng)態(tài)類(lèi)型的换淆,所以會(huì)直接調(diào)用靜態(tài)類(lèi)型中的方法。
而動(dòng)態(tài)類(lèi)型的過(guò)程是:當(dāng)這個(gè)java程序運(yùn)行起來(lái)了美侦,RTTI檢查出引用father的動(dòng)態(tài)類(lèi)型是Son類(lèi)時(shí)产舞,會(huì)將method()方法和子類(lèi)Son關(guān)聯(lián)起來(lái),也就是確定調(diào)用動(dòng)態(tài)類(lèi)型Son類(lèi)中的method方法菠剩。具體過(guò)程為:1. JVM提取對(duì)象的實(shí)際類(lèi)型的方法表;2. JVM搜索方法簽名耻煤;3. 調(diào)用方法具壮。
java中的類(lèi)的屬性都是靜態(tài)綁定。這是因?yàn)殪o態(tài)綁定是有很多的好處哈蝇,他可以讓我們?cè)诰幾g器就發(fā)現(xiàn)程序中的錯(cuò)誤棺妓,而不是在運(yùn)行期。這樣就可以提高程序的運(yùn)行效率炮赦!而對(duì)方法采用動(dòng)態(tài)綁定是為了實(shí)現(xiàn)多態(tài)怜跑。