1. 程式人生 > >父類方法中使用的this,那麼這個this指的是誰?

父類方法中使用的this,那麼這個this指的是誰?

一直在用一些東西,卻總是感覺有一些疑惑,今天發現了自己一個及其致命的意識錯誤。關於父類中this關鍵字到底是誰的問題。請看程式碼

父類Parent

  1. publicclass Parent {  
  2.     public Parent(){  
  3.         System.out.println("父類自己---->"+this);  
  4.     }  
  5.     publicvoid onCreate(){  
  6.         System.out.println("父類中的---->"+this);  
  7.         ObjectCollectionUtils.addObject(this
    );  
  8.     }  
  9. }  

子類Son

  1. publicclass Son extends Parent{  
  2.     public Son() {  
  3.         onCreate();  
  4.     }  
  5.     @Override
  6.     publicvoid onCreate() {  
  7.         super.onCreate();  
  8.     }  
  9. }  

工具類ObjectCollectionUtils
  1. publicclass ObjectCollectionUtils {  
  2.     privatestatic List<Object> list = 
    new ArrayList<>();  
  3.     publicstaticvoid addObject(Object object){  
  4.         System.out.println("工具類add--->"+object);  
  5.         list.add(object);  
  6.     }  
  7. }  

測試類test
  1. publicclass test {  
  2.     publicstaticvoid main(String[] args) {  
  3.         Son son1 = new Son();  
  4.         System.out.println("子類---->"
    +son1);  
  5.         Son son2 = new Son();  
  6.         System.out.println("子類---->"+son2);  
  7.         Son son3 = new Son();  
  8.         System.out.println("子類---->"+son3);  
  9.     }  
  10. }  

因為我是搞android的,所以這幾個類其實就是簡單的模仿android中常用功能技巧BaseActivity和ActivityCollection的類的使用。不說這幾個類為什麼要這樣寫了,我們就來看看父類中this這個關鍵字打印出的東西到底是什麼?如果不明白onCreate方法是幹什麼的,那就忽略就行,咱們看建構函式中輸出的this是什麼吧。

我們最常聽到的一句話就是不管在哪,this關鍵字指的都是當前物件,那麼在父類Parent建構函式中輸出的this一個喝子類Son建構函式中輸出的this分別是父類當前引用和子類的當前引用。那麼我們來看一下輸出結果:

  1. 父類自己---->[email protected]  
  2. 父類中的---->[email protected]  
  3. 工具類add--->[email protected]  
  4. 子類---->[email protected]  
  5. 父類自己---->[email protected]  
  6. 父類中的---->[email protected]  
  7. 工具類add--->[email protected]  
  8. 子類---->[email protected]  
  9. 父類自己---->[email protected]  
  10. 父類中的---->[email protected]  
  11. 工具類add--->[email protected]  
  12. 子類---->[email protected]  

不知道大家有沒有猜對這個結果呢?不管是父類中呼叫工具類的時候傳入的this,還是父類中構造方法的this,亦或者是父類中普通方法onCreate中的this,都是指子類物件的this。因為我個人在平時的使用過程中,對this和super的使用也不會出現錯誤,都能正確使用,但是最近這個疑惑一直讓我覺得很可疑,所以今天寫幾個類測試一下。我說一下我為什麼會覺得父類中的this應該是父類本身物件的this(這是錯誤的想法),子類例項化的過程會先去執行父類的建構函式,這個大家肯定都是知道,但我過去錯誤的以為,執行了父類的建構函式意味著新建了父類的物件.......,所以我才會覺得父類中的this指的應該是父類的物件引用。但是,其實我上面寫的這些類的過程中,僅僅的是建立了son1,son2,son3這個子類物件,雖然都走了父類的建構函式,但是並不建立父類物件,所以父類中的this便指的是他子類的具體this。over!!!

注意:我做的測試是,例項化子類,看父類中this關鍵字是誰。若你們正常去是例項化父類,那麼你執行父類中相應的方法,那麼方法中的this值得就是父類物件本身的引用,希望有些人看了以後不要被誤導,所以強調一下。