this是乙個引用,它指向自身的這個物件。
看記憶體分析圖
假設我們在堆記憶體new了乙個物件,在這個物件裡面你想象著他有乙個引用this,this指向這個物件自己,所以這就是this,這個new出來的物件名字是什麼,我們不知道,不知道也沒關係,因為這並不影響這個物件在記憶體裡面的存在,這個物件只要在記憶體中存在,他就一定有乙個引用this。
看下面的例子分析:
在記憶體中分析main方法的執行過程
首先逐個分析:leaf.increament(),這裡是呼叫increament()方法,是對new出來的那個leaf物件呼叫的,leaf是leaf物件的引用物件,因此通過這個引用物件來呼叫increament()方法,即相當於是leaf物件自己呼叫了increament()方法。increament()方法的定義如下:
leaf increament()
因此leaf物件呼叫increament()方法時,首先執行方法體裡面的第一句話i++;這樣就把leaf物件的成員變數i的值由原來的100變成了101。此時的記憶體布局如下圖所示。
所以leaf.increament().increament().print();這句話裡面的left.increament()這一小句話執行完之後,記憶體中的布局如下圖所示。
leaf.increament().increament().print();這句話裡面的left.increament()這一小句話執行完之後,返回乙個this,此時leaf.increament().increament().print();就相當於是this.increament().print();
接著棧裡面的儲存在臨時空間裡面的this呼叫increament()方法,而this指的就是leaf物件,所以又是leaf物件呼叫increament()方法。leaf物件呼叫increament()方法時,又會執行方法體裡面的i++,所以此時i又由原來的101變成了102。然後又執行return this,所以棧記憶體裡面又多了一塊臨時儲存空間,裡面裝的值也是this,這個this又是指向堆記憶體裡面的leaf物件。因此此時這個leaf物件有了四個指向他自己的引用物件。
leaf.increament().increament().print();這句話裡面的leaf.increament().increament()這一小句話執行完之後,都返回了乙個this,所以此時的leaf.increament().increament().print();就相當於是這樣子的:this.this.print();
接下來又是棧裡面的那個新的this呼叫print()方法,使用this來呼叫,那就相當於是leaf物件來呼叫,leaf物件自己呼叫print()方法將自己的i屬性的值列印出來,所以列印出來的結果應該是102。
因此main方法裡面的整個程式執行完之後,記憶體中的布局如下圖所示:
this的總結:this一般出現在方法裡面,當這個方法還沒有呼叫的時候,this指的是誰並不知道。但是實際當中,你如果new了乙個物件出來,那麼this指的就是當前這個物件。對哪個物件呼叫方法,this指的就是呼叫方法的這個物件(你對哪個物件呼叫這個方法,this指的就是誰)。如果再new乙個物件,這個物件他也有自己的this,他自己的this就當然指的是他自己了。
Java基礎 08 物件導向(續3)
1 多型 可以理解為事物存在的多種體現形式。例如 人 男人 女人。動物 貓 狗。eg 貓 x new 貓 動物 x new 貓 2 特徵 輸出結果 吃魚 吃骨頭吃魚 吃骨頭飼料 吃魚前例中的 animal a new cat 我們稱為型別提公升,也叫向上轉型。如果想要呼叫貓的特有方法時,如何操作?強...
java物件導向總結
面對物件的概念 物件導向是相對於面向過程而言的,它早期是面向過程,經過不斷演化到了現在的物件導向。相同的地方是物件導向與面向過程都是一種思想,是思考問題的一種思考方式。不同點 面向過程 強調功能的行為 物件導向 將功能封裝進物件,強調具備了功能的物件 物件導向是基於面向過程的。物件導向是一種對現實世...
Java基礎 物件導向
1.理解物件導向 強調的是功能行為 將功能封裝進物件,強調具備了功能的物件。1.1 物件導向的好處 先要去找具有所需的功能的物件來用。如果該物件不存在,那麼建立乙個具有所需功能的物件。這樣簡化開發並提高復用。1.2 物件導向開發,設計,特徵 開發的過程 其實就是不斷的建立物件,使用物件,指揮物件做事...