在學習this和super關鍵字時,發現它們有諸多相同點,同時這兩個關鍵字很是經常使用,現對它們作如下的總結。函數
1、概況學習
This:this
This指代當前對象,this()指代當前對象的其餘構造函數spa
Super:code
Super指代父類對象,super()指代父類的構造函數;對象
2、具體用法,對比super和this理解blog
一、this用做指代當前對象,super指代父類對象繼承
A、this.成員變量,可調用當前對象的成員變量,通常是在當前類的某個方法的形參和當前的對象成員變量同名的時候用到ast
super.成員變量,調用父類的成員變量。class
請觀察如下代碼,順便討論下繼承的問題。
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後跟參數時,指代對應父類中有相同參數的構造方法。
2、使用注意事項
一、this和super在用於構造函數中(通常this和super後面跟參數是用於構造函數中調用其餘構造函數)時,只能是構造函數的第一條語句,由於子類自己就繼承了父類的全部方法還有屬性,只有在父類對象被構造出來後再執行子類的構造方法的其餘語句纔是合理得,而this爲何也必須寫在第一條語句中,是由於能夠經過this調用其餘構造方法,而其餘構造方法有可能會有以super()的形式調用父類構造方法。
二、在子類中重載父類構造方法的時候,若是父類的構造方法時無參數的,能夠沒必要寫出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 } }