19年1.19
內容主要:從方法重寫和重載淺淺的理解下java多態機制
方法重寫與重載的區別等等,已經有前人鋪好了路,走就好了.這裏只是分享下個人淺顯的見解.歡迎指正
多態的機制:
本質上多態分爲兩種:
1.編譯時多態(又稱靜態多態)
2.運行時多態(又稱動態多態)
1.編譯時多態
重載(Overloading)就是編譯時多態的一個例子,編譯時多態在編譯時就已經確定,運行時運行的時候調用的是確定的方法。
2.運行時多態
重寫(Overriding)
運行時多態分爲兩種:
1.子類繼承父類(extends)
2.類實現接口(implement)
無論是哪種方法,其核心之處就在於對父類方法的改寫或對接口方法的實現,以取得在運行時不同的執行效果。
要使用多態,在聲明對象時就應該遵循一條法則:聲明的總是父類類型或接口類型,創建的是實際類型。舉例來說,假設我們要創建一個ArrayList對象,聲明就應該採用這樣的語句:
List list =newArrayList();
而不是
ArrayList list =newArrayList();
在定義方法參數時也通常總是應該優先使用父類類型或接口類型,例如某方法應該寫成:
publicvoid doSomething(List list);
而不是
publicvoid doSomething(ArrayList list);
這樣聲明最大的好處在於結構的靈活性:假如某一天我認爲ArrayList的特性無法滿足我的要求,我希望能夠用LinkedList來代替它,那麼只需要在對象創建的地方把new ArrayList()改爲new LinkedList即可,其它代碼一概不用改動。
多態的用途:
在於對設計和架構的複用.更進一步來說,面向接口編程,而不是面向實現編程
多瞭解一些:
動態綁定具體的調用過程爲:
1.首先會找到被調用方法所屬類的全限定名
2.在此類的方法表中尋找被調用方法,如果找到,會將方法表中此方法的索引項記錄到常量池中(這個過程叫常量池解析),如果沒有,編譯失敗。
3.根據具體實例化的對象找到方法區中此對象的方法表,再找到方法表中的被調用方法,最後通過直接地址找到字節碼所在的內存空間。