Java 基礎【06】 Super 用法


     路漫漫其修遠兮,吾將上下而求索。——屈原《離騷》

     昨天寫this用法總結的時候,突然產生了一個問題,請教別人之后,有了自己的一點認識。還是把它寫下來,為大家更好的認識提供一點思路。

1)有人寫了個很好的初始化屬性的構造函數,而你僅僅想要在其中添加另一些自己新建屬性的初始化,這樣在一個構造函數中調用另外一個構造函數,可以避免重復的代碼量,減少工作量;

2)在一個構造函數中調用另外一個構造函數的時候應該用的是同一塊內存空間,在默認的構造函數中先初始化變量,調用另一個的時候覆寫已經初始化的變量的值;

3)整個調用的過程和遞歸調用函數有點類似,不斷充氣球,直到整個氣球膨脹起來,不斷的深層遞進,遇到停止標記,逐層的跳出來。

     寫了段代碼,解釋我上面的敘述:

 1 class JavanTiger {
 2     int age;      // 年齡
 3     int hight;    // 身體高度
 4 
 5     public JavanTiger() {
 6         print();
 7         this.age=2;   //這里初始化 age 的值 ,但遞歸返回的時候,這個值會被覆寫
 8     }
 9     
10     public JavanTiger(int age) {
11         this();      // 調用自己的第一個構造函數,下面的兩個語句數不執行的
12         this.age = age;
13         print();
14     }
15 
16     public JavanTiger(int age, int hight) {
17         this(age);   // 調用自己第二個構造函數  ,下面的兩個語句數不執行的
18         this.hight = hight;
19         print();
20     }
21 
22     public void print() {  //打印函數
23         System.out.println("I'am a " + age + "歲 " + hight + "尺高 tiger!");
24     }
25     public static void main(String[] args) {
26         new JavanTiger(3,3);
27     }
28 }
29 //output
30 //I'am a 0歲 0尺高 tiger!
31 //I'am a 3歲 0尺高 tiger!
32 //I'am a 3歲 3尺高 tiger!  

      個人理解就是這樣了,可能里面還有問題,比如構造函數遞歸調用和程序函數遞歸調用的機制是否似乎相同的?構造函數同對象一起產生,也就是同時會分配內存空間出來,那門這樣的遞歸調用會不會打亂分配內存的順序?希望看到的大牛們拍板,給個最好的解釋。

     今天要總結的是 super 這個關鍵字的使用,super 在構造函數中出現的時候一般是當前這個類繼承了其他的類,super 的出現就是為了調用父類的構造函數,貼段代碼先

 1 class Tiger {
 2     int age; // 年齡
 3     int hight; // 身體高度
 4 
 5     public Tiger() {
 6         print();
 7     }
 8 
 9     public void print() {
10         System.out.println("I'am a " + age + "歲 " + hight + "尺高 tiger!");
11     }
12 }
13 public class JavanTiger extends Tiger {    
14     public JavanTiger() {
15         super();    // 調用父類無參數的構造函數
16     }
17     public static void main(String[] args) {
18         new JavanTiger();
19     }
20 }

    其實在類JavanTiger 中的構造函數中的 super()可以不寫,JAVA會默認調用父類的無參數的構造函數,但如果父類沒有定義無參數的構造函數,沒有語法錯誤,程序會自動退出,沒有任何打印語句,這時候你需要手動調用其他父類的構造函數,貼段代碼:

 1 class Tiger {
 2     int age; // 年齡
 3     int hight; // 身體高度
 4 
 5     public Tiger(int age) {
 6     this.age = age;
 7     print();
 8     }
 9     public void print() {
10         System.out.println("I'am a " + age + "歲 " + hight + "尺高 tiger!");
11     }
12 }
13 public class JavanTiger extends Tiger {    
14     public JavanTiger() {
15         super(1);    // 調用父類有參數的構造函數
16     }
17     public static void main(String[] args) {
18         new JavanTiger();
19     }
20 }

      這段代碼中的 super(1)必須要寫進去,否則編譯器會報錯。所以我簡單的總結了一下,“this()是調用自己其他的構造函數,super()是調用自己繼承的父類的構造函數“,如果只想調用默認無參數的父類構造函數,不用在子類的構造函數當中寫出來,但是實際編程的時候,總是會忽略這一點。

     那門這兩個關鍵字能不能同時出現在子類的一個構造函數當中納?答案肯定是不能。先說下自己的理解:

1)在新建一個基類的時候,不論遞歸調用幾次自身的構造函數,最終你都會去調用父類的構造函數,(不是顯式調用的話,系統會調用默認無參數的父類構造函數);

2)JAVA 中規定使用 this 和 super 時必須放在構造函數第一行,只有一個第一行;

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM