"編譯看左邊,執行看右邊"(多型執行)
含義:animal c = new cat(); 左邊是 animal 類(或介面) 右邊是 cat()類; 在編譯的時候編譯器不管你右邊是什麼類,只要左邊的animal類(或介面)能編譯通過就不會報錯。但是執行的時候就要按照右邊的cat()類實際情況來執行。
(對物件導向語言中理解多型、繼承很有幫助~~~)
老畢在講到多型執行問題時,結合下面的例子,給我們總結了一套口訣:「成員變數,靜態方法看左邊;非靜態方法:編譯看左邊,執行看右邊。」意思是:當父類變數引用子類物件時(fu f = new zi();),在這個引用變數f指向的物件中,他的成員變數和靜態方法與父類是一致的,他的非靜態方法,在編譯時是與父類一致的,執行時卻與子類一致(發生了複寫)。
例:
class fu
void method3()
}class zi extends fu
void method3()
}class duotaidemo4
}//輸出結果:
5fu method_4
zi method_3
8zi method_4
zi method_3
個人分析:
fu f = new zi();----------首先了解變數f到底是什麼,把這句子分2段:fu f;這是宣告乙個變數f為fu這個類,那麼知道了f肯定是fu類。然後我們f=newzi();中建立乙個子類物件賦值給了f,結果是什麼??
結果是,擁有了被zi類函式覆蓋後的fu類物件----f------。
也就是說:
只有子類的函式覆蓋了父類的函式這乙個變化,但是f肯定是fu這個類,也就是說f不可能變成其他比如zi這個類等等(突然f擁有了zi類特有函式,成員變數等都是不可能的)。所以f所代表的是函式被複寫後(多型的意義)的乙個fu類,而fu類原來有的成員變數(不是成員函式不可能被複寫)沒有任何變化。
獲得結論:
但是f的fu類函式被複寫了。
對於靜態方法:編譯和執行都看fu!!
其實很簡單,首先我們要理解靜態情況下發生了什麼?當靜態時,fu類的所有函式跟隨fu類載入而載入了。也就是fu類的函式(是先於物件建立之前就存在了,無法被後出現的zi類物件所複寫的,所以沒發生複寫,那麼獲得:
Java編譯時多型和執行時多型
編譯時多型 主要是方法的過載,通過引數列表的不同來區分不同的方法。執行時多型 也叫作動態繫結,一般是指在執行期間 非編譯期間 判斷引用物件的實際型別,根據實際型別判斷並呼叫相應的屬性和方法。主要用於繼承父類和實現介面時,父類引用指向子類物件。例如 public class polymorphismt...
java的編譯時多型和執行時多型
1 執行時多型和編譯時多型的區別?編譯時的多型,是指引數列表的不同,來區分不同的函式,在編譯後,就自動變成兩個不同的函式名.在執行時談不上多型 執行時多型 用到的是後期繫結的技術,在程式執行前不知道,會呼叫那個方法,而到執行時,通過運算程式,動態的算出被呼叫的位址.動態呼叫在繼承的時候,方法名 引數...
編譯期多型和執行期多型
所謂的多型是通過乙個單一的識別符號支援不同的特定行為的能力。靜態多型 編譯期多型 動態多型 執行期多型 虛函式過載 模板 轉換 型別別名 今天我們就只討論從繫結時間來分的多型種類,即編譯期多型和執行期多型。執行期多型可以說只要學了c 的人都是知道的。因為執行期多型就是我通俗所說的多型,它的提出可以歸...