国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

JAVA中動態性實例解釋

2019-11-18 11:50:37
字體:
來源:轉載
供稿:網友

  //下面我結合實例解釋一下java中動態性實現問題
  class base
  {
  public int ageOfBase=10;
  
  public void display()
  {
   System.out.  }
  
  public void display1()
  {
   System.out.println("display1() in base!");
  }
  
  private void show()
  {
   System.out.println("show() in base!");
  }
  }
  
  class test extends base
  {
  public int ageOfTest=10;
  
  /*這個函數改寫父類方法
   但是他并不是簡單完成自己的功能;
   在實現自己的應該實現的功能同時他還保留了父類的功能
   *************************************
   重要的是假如你沒有改寫這個父類方法的話, 子類test還是存在這樣的方法的,只是存在的方法實際上是從父類繼續來的,只是簡單的實現父類實現的功能。
  */
  public void display()
  {
   System.out.println("display() in test!");
   super.display();
  }
  
  //注重我并沒有改寫方法display1(),但是這個方法由于繼續的原因
  //子類test中還是存在的
  
  //我寫一個新的方法為子類
  public void display2()
  {
   //這里引用父類的私有方法
   //這個方法在子類中并不存在的
   //但是一定要記?。?br />   //訪問父類的私有成員是不答應的
   //super.show();
  
   //這里引用父類的共有方法
   //實際上這里引用是子類中的方法
   //因為這個方法已經從父類繼續了
   display1();
  
   //下面這樣引用也可以的
   //這里是真正引用父類的方法的
   // super.display1();
  
  
   //上面這一點可能講的不是很清楚的
   //下面我換一種例子
  
   //這個是子類的
   display();
  
   //這個是父類的方法
   super.display();
  
   System.out.println("display2()in test!");
  }
  
  public static void main(String args[])
  {
   test t=new test();
   base b=new base();
   //下面這一句是多態性的根本
   //一個父類的引用指向子類
   b=t;
  
   //這樣通過父類的引用調用方法的話
   //實際上是執行子類中實現的方法
  
   /*
   下面我結合我對面向對象編程的把握和研究情況談一下我的經驗和看法其間我不能保證我說的每一點都正確,只是給你參考對于多態性這個面向對象編程領域很重要的概念。我結合c++以及針對java中的實際情況做幾點說明。
  
   (1)最好對于虛擬指針以及虛擬指針表格有一定了解。不了解的話,你只能是記住我說的,但是不一定能理解很好。
  
   (2)父類引用指向子類。方法調用的時候執行的是子類的方法。這個說法是有很多前提和意外的。
   下面我舉一個例子
   */
  
   b.display();
  
   // 下面調用會出錯的
   //t.display2();
   //應該象下面那樣
   ((test)b).display2();
  
   int temp1=b.ageOfBase;
  
   // 下面調用會出錯
   //int temp2=t.ageOfTest;
   //應該向下面那樣
   int temp2=((test)b).ageOfTest;
  
  
   /*
   現在解釋上面兩個會出錯的原因,這個原因是動態性的根本所在。
   我盡力能解釋清楚一點。
  
   **************要害一********************
  
   因為父類和子類的對象在內存中的大小是不一樣的,當然了不同的對象本身就不可能是同一塊內存地址的。
   這個應該沒有問題的吧,當然了要是子類中只是簡單的繼續而沒有都沒有做的話,可能是一樣的,但是在c++中各家編譯器還有會有一點差異的,可能也會不一樣的。
  
   ***************要害二************************
  
   引用本質上是通過指針來實現的,更深入一點是引用是指向指針的指針,而不同類型的指針所治理的內存空間大小是不一樣的,這一點跟上面聯系很緊的。注重這里是說指針治理的內存而不是指針,我想大家都
   知道指針只有4個字節長度的。這里我們可以簡單的說是變量的可見性問題,因為變量雖然存在但是并不一定是可見的。
  
   ***************要害三************************
  
   多態性的要害是動態綁定,說白了就是虛擬函數虛擬指針虛擬指針表等幾個重要的概念。簡單講一下,這里很復雜的,但是每一個真正的面向對象編程人員必須花時間很好的理解這一點。java 中只有靜態函數和虛擬函數兩種,c++中還有一種 非靜態非虛擬函數。所以java的動態綁定要輕易一點的。 你可以不精確的這樣理解(因為解釋精確我也很懶,可以寫很長的文章了),每次類編譯的時候都會生成一個虛擬函數表,表里面保存自己類中所有的虛擬函數地址,同時要是這個類存在父類 (不管是extends class 還是implements interface)的話,同時他會把從父類繼續來的虛擬函數表也繼續過來(這里我只是大概解釋,不是很準確)。
   這個地方請注重:
   ************************************************
   要是子類沒有改寫父類繼續的方法,父類虛擬函數中對應虛擬函數地址被變成子類自己的虛擬函數地址;假如沒有改變則不需要改變繼續來的虛擬函數表對應函數的地址。
   *************************************************
  
   ***************開始解釋************************
   當父類引用指向子類對象的時候,父類引用治理的內存空間,是要比子類真實的內存空間小的。所以子類中比父類中多的東西對于這個父類引用來說是不可見的。所以也就沒有辦法引用。
  
   上面的那個變量引用和函數引用就是這樣的,因為父類中沒有變量ageOfTest和函數display2()的。但是我們可以知道父類指針實際上是指向子類的,所以我們解決這個問題的方法就是:強制轉換類型(java中叫造型)。
  
   同時可能有人要問,子類中那個函數地址不是也在虛擬函數表中嗎?很興奮你問這樣的問題,但是父類引用看到的虛擬函數表是沒有那個函數項目的,因為他對于父類引用絕對是不可見。
  
   對于另外一個虛擬函數調用,假如你看了說明很仔細的話,你現在一定知道雖然是父類引用治理內存范圍小,但是那個虛擬函數表,父類中有的,但是由于函數被子類中改寫了,所以那個表中函數地址編程子類的拉,當然就是引用子類的方法了。
  
  
   /****************重要補充************************
   java中靜態函數是沒有動態性,因為靜態函數不能被繼續,也不能被改寫為非靜態方法。因為靜態就意味著類的所有實例共享一個實體。
   **************************************************
   */
  }
  }

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 辛集市| 杭锦后旗| 铁岭县| 海门市| 上杭县| 皮山县| 泰兴市| 海南省| 两当县| 大同市| 阿克陶县| 斗六市| 革吉县| 兰州市| 收藏| 开远市| 嘉荫县| 司法| 奉化市| 兴仁县| 古田县| 新宁县| 右玉县| 贵阳市| 定襄县| 伊宁县| 左云县| 甘德县| 奇台县| 恩平市| 田东县| 竹溪县| 甘孜县| 鲁山县| 依安县| 曲沃县| 五台县| 贺兰县| 深水埗区| 抚宁县| 城固县|