Java中的爆米花:多態style

(這篇文章我已移動到了.net學習的欄目下,多態的思想是相通的,您看時如果對代碼不解,只求您理解多態的思想就行,c#的多態思想借鑑此博文即可……)

老早就想寫寫對於多態的一些所思所想,這裏沒有多少教程般的俗話,就是一些自己的一些拙思吧……

多態(動態綁定)Style!(借鑑馬士兵老師的教程所寫,僅向馬老師致敬!)

多態是Java中的一個重要的思想,不要覺得難,其實畫畫圖就簡單了,掌握好多態對於程序的健壯性及靈活性都是有好處的,不多說啦,談談我們的釣魚島吧!

例子代碼:(程序只爲最直觀地簡述多態的思想,不必細究。)

public class OwnerOfDiaoYuDao {
 public static void main(String[] args) { 
  DiaoYuDao diaoyudao = new DiaoYuDao();
  China china = new China();
  diaoyudao.getHelp(china);  //注意:此處子類china做爲實參。
            //即爲父類的引用DiaoYuDao d指向了子類的對象。
 }

}

class DiaoYuDao {    //釣魚島
 public void owner() {
  System.out.println("Who is my owner?");
 }
 public void getHelp(DiaoYuDao d) {
  d.owner();
 }
}

class China extends DiaoYuDao{  //中國繼承了釣魚島
 public void  owner() {  //重寫了owner()方法。
  System.out.println("I'am your owner!");
 }
}

內存分析:

 

 

一:多態,即爲動態綁定,主要出現在父類的引用指向子類的對象中。如例中:diaoyudao.getHelp(china);此處的實參china能傳遞給父類的形參,就是因爲china對象是DiaoYuDao的一個子類。diaoyudao.getHelp(china);執行完後內存見圖中(1)線。注意(1)線指向china這個對象的父類對象,即d引用只認識china對象中的父類對象,而不認識china這個對象,這也就是所謂的“父類的引用指向子類的對象”。

二:如內存分析圖,當執行diaoyudao.getHelp(china);時,會調用d.owner();問題出現了!如圖,倒底是調父類的owner()還是調用子類的owner()呢?先看看運行結果吧!

 

 

 

 哇,運行結果顯示的是“I ' am your owner!”,由例子程序就知道,實際調用了子類中的owner()。爲什麼呢,按理說引用d只認識子類對象china中的父類對象,那麼d.owner()應該調用父類owner()纔對,但事實是你的這種想法確實是錯了。這就是下面第三條要講的動態綁定機制了!

三:多態真相(動態綁定):兩個owner()都存在於代碼區,調用方法時是去代碼區去找相對應的方法。一開始時heap區中的china對象中的紅色小區域指針是指向code segment中的父類owner()的,但當執行diaoyudao.getHelp(china);後,由於實際傳的參數爲子類對象china,所以會出現圖中指針由(2)指向(3)的一個過程,此即爲動態綁定的過程。所謂動態綁定的動態,即爲只有在new出一個對象,如本例new出子類對象china後,實參傳的是哪個對象,就調用哪個對象的方法。如本例,實參傳的是子類對象,就調用的是子類中的owner();

總結:要想構成多態的存在要素,必須存在:

(1)存在繼承。如China繼承了父類DiaoYuDao。

(2)存在重寫。如 China子類重寫了父類的owner()方法。

(3)父類的引用要指向子類的對象。如diaoyudao.getHelp(china);如圖中的(1)線處。

 最後關於多態(動態綁定)的一點補充:釣魚島是中國的!

 

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