在學習this和super關鍵字時,發現它們有諸多相同點,同時這兩個關鍵字非常常用,現對它們做以下的總結。
一、概況
This:
This指代當前對象,this()指代當前對象的其他構造函數
Super:
Super指代父類對象,super()指代父類的構造函數;
二、具體用法,對比super和this理解
1、this用作指代當前對象,super指代父類對象
A、this.成員變量,可調用當前對象的成員變量,一般是在當前類的某個方法的形參和當前的對象成員變量同名的時候用到
super.成員變量,調用父類的成員變量。
請觀察以下代碼,順便討論下繼承的問題。
1 public class BokeCode{ 2 public static void main(String [] args){ 3 //另外,順便觀察下其他繼承的特性 4 Bmw bmw1 = new Bmw(30); 5 System.out.println(bmw1.size);//輸出的是子類的size 6 Car bmw2 = new Bmw(); 7 System.out.println(bmw2.size);//輸出的是父類的size 8 } 9 } 10 11 class Car{ 12 int size; 13 public Car(int size){ 14 his.size = size; 15 System.out.println("我是Car的構造方法"); 16 } 17 } 18 19 class Bmw extends Car{ 20 /* 21 *重新定義size(其實意義不大,因為父類也有一個size了,成員變量不可以重載 22 *其實他們就是兩個毫無關系的變量而已,只是名字一樣 23 */ 24 int size; 25 public Bmw(int size){ 26 //調用父類構造方法 27 super(20); 28 System.out.println("我是父類對象的size " + super.size);//輸出父類變量,值是20 29 /初始化子類的size 30 this.size = size; 31 System.out.println("我是子類對象的size " + this.size);//輸出子類變量,值是30 32 System.out.println("我是初始化子類對象之后的父類對象的size " + super.size);//父類的size不受影響,輸出還是20 33 34 } 37 }
B、this可以指代當前對象的方法,調用方法時可以用this.menthod();當然,在沒有混淆的情況下,一般無需如此;當this后跟參數的時候,代指當前對象的對應相同參數的其他構造方法
Super.menthod()類似,指代調用父類的方法;當super后跟參數時,指代對應父類中有相同參數的構造方法。
二、使用注意事項
1、this和super在用於構造函數中(一般this和super后面跟參數是用於構造函數中調用其他構造函數)時,只能是構造函數的第一條語句,因為子類本身就繼承了父類的所有方法還有屬性,只有在父類對象被構造出來后再執行子類的構造方法的其他語句才是合理得,而this為什么也必須寫在第一條語句中,是因為可以通過this調用其他構造方法,而其他構造方法有可能會有以super()的形式調用父類構造方法。
2、在子類中重載父類構造方法的時候,如果父類的構造方法時無參數的,可以不必寫出supe();有參數是必須寫出的;
調用本對象的屬性方法時,可以以this.屬性,this.方法來調用,但是一般不畫蛇添足。
接着上面例子,補充幾條下語句
class Car{ int size; public Car(int size){ this.size = size; System.out.println("我是Car的構造方法"); } public void drive(){ System.out.println("我是方法drive()"); } } class Bmw extends Car{ /* *重新定義size(其實意義不大,因為父類也有一個size了,成員變量不可以重載 *其實他們就是兩個毫無關系的變量而已,只是名字一樣 */ int size; public Bmw(int size){ //調用父類構造方法 super(20); System.out.println("我是父類對象的size " + super.size);//輸出父類變量,值是20 //初始化子類的size this.size = size; System.out.println("我是子類對象的size " + this.size);//輸出子類變量,值是30 System.out.println("我是初始化子類對象之后的父類對象的size " + super.size);//父類的size不受影響,輸出還是20 } public void drive_fast(){ super.driver(); //調用父類方法 System.out.println("我是方法drive_fast()"); } public void method_test(){ this.driver_fast();//調用之類方法,但一般省略this } }