父類方法中使用的this,那麼這個this指的是誰?
阿新 • • 發佈:2019-01-04
一直在用一些東西,卻總是感覺有一些疑惑,今天發現了自己一個及其致命的意識錯誤。關於父類中this關鍵字到底是誰的問題。請看程式碼
父類Parent
- publicclass Parent {
- public Parent(){
- System.out.println("父類自己---->"+this);
- }
- publicvoid onCreate(){
- System.out.println("父類中的---->"+this);
-
ObjectCollectionUtils.addObject(this
- }
- }
子類Son
- publicclass Son extends Parent{
- public Son() {
- onCreate();
- }
- @Override
- publicvoid onCreate() {
- super.onCreate();
- }
- }
工具類ObjectCollectionUtils
- publicclass ObjectCollectionUtils {
-
privatestatic List<Object> list =
- publicstaticvoid addObject(Object object){
- System.out.println("工具類add--->"+object);
- list.add(object);
- }
- }
測試類test
- publicclass test {
- publicstaticvoid main(String[] args) {
- Son son1 = new Son();
-
System.out.println("子類---->"
- Son son2 = new Son();
- System.out.println("子類---->"+son2);
- Son son3 = new Son();
- System.out.println("子類---->"+son3);
- }
- }
因為我是搞android的,所以這幾個類其實就是簡單的模仿android中常用功能技巧BaseActivity和ActivityCollection的類的使用。不說這幾個類為什麼要這樣寫了,我們就來看看父類中this這個關鍵字打印出的東西到底是什麼?如果不明白onCreate方法是幹什麼的,那就忽略就行,咱們看建構函式中輸出的this是什麼吧。
我們最常聽到的一句話就是不管在哪,this關鍵字指的都是當前物件,那麼在父類Parent建構函式中輸出的this一個喝子類Son建構函式中輸出的this分別是父類當前引用和子類的當前引用。那麼我們來看一下輸出結果:
- 父類自己---->[email protected]
- 父類中的---->[email protected]
- 工具類add--->[email protected]
- 子類---->[email protected]
- 父類自己---->[email protected]
- 父類中的---->[email protected]
- 工具類add--->[email protected]
- 子類---->[email protected]
- 父類自己---->[email protected]
- 父類中的---->[email protected]
- 工具類add--->[email protected]
- 子類---->[email protected]
不知道大家有沒有猜對這個結果呢?不管是父類中呼叫工具類的時候傳入的this,還是父類中構造方法的this,亦或者是父類中普通方法onCreate中的this,都是指子類物件的this。因為我個人在平時的使用過程中,對this和super的使用也不會出現錯誤,都能正確使用,但是最近這個疑惑一直讓我覺得很可疑,所以今天寫幾個類測試一下。我說一下我為什麼會覺得父類中的this應該是父類本身物件的this(這是錯誤的想法),子類例項化的過程會先去執行父類的建構函式,這個大家肯定都是知道,但我過去錯誤的以為,執行了父類的建構函式意味著新建了父類的物件.......,所以我才會覺得父類中的this指的應該是父類的物件引用。但是,其實我上面寫的這些類的過程中,僅僅的是建立了son1,son2,son3這個子類物件,雖然都走了父類的建構函式,但是並不建立父類物件,所以父類中的this便指的是他子類的具體this。over!!!
注意:我做的測試是,例項化子類,看父類中this關鍵字是誰。若你們正常去是例項化父類,那麼你執行父類中相應的方法,那麼方法中的this值得就是父類物件本身的引用,希望有些人看了以後不要被誤導,所以強調一下。