this關鍵字 轉(孤傲蒼狼)

2021-08-03 19:40:31 字數 2912 閱讀 8854

this是乙個引用,它指向自身的這個物件。

看記憶體分析圖:

假設我們在堆記憶體new了乙個物件,在這個物件裡面你想象著他有乙個引用this,this指向這個物件自己,所以這就是this,這個new出來的物件名字是什麼,我們不知道,不知道也沒關係,因為這並不影響這個物件在記憶體裡面的存在,這個物件只要在記憶體中存在,他就一定有乙個引用this。

看下面的例子分析:

在記憶體中分析main方法的執行過程

首先分析第一句話:leaf leaf = new leaf(100);

程式執行到這裡的時候,棧空間裡面有乙個變數leaf,它指向了我們new出來的在堆空間裡面的leaf物件。new這個leaf物件的時候,呼叫了構造方法leaf(),這個構造方法裡面有乙個形參i,所以在棧空間裡面給構造方法分配有一小塊記憶體,名字叫i用來裝傳遞過來的實參。這裡傳過來的實參是100,所以i裡面裝的值就是100。得到這個值之後,構造方法繼續執行,執行this.i = i;這裡就是把棧空間裡面的i的值通過值傳遞給leaf物件裡面的成員變數i,所以成員變數i的值也變成了100。記憶體中的布局如下圖所示:

構造方法執行完之後,為這個構造方法分配的記憶體消失,所以棧裡面的i所標記的那一小塊記憶體會消失。因此第一句話執行完之後,記憶體中的布局如下圖所示:

接下來分析第二句話:leaf.increament().increament().print();

首先逐個分析:leaf.increament(),這裡是呼叫increament()方法,是對new出來的那個leaf物件呼叫的,leaf是leaf物件的引用物件,因此通過這個引用物件來呼叫increament()方法,即相當於是leaf物件自己呼叫了increament()方法。increament()方法的定義如下:

ortant;">leaf increament()
因此leaf物件呼叫increament()方法時,首先執行方法體裡面的第一句話i++;這樣就把leaf物件的成員變數i的值由原來的100變成了101。此時的記憶體布局如下圖所示。

接下來執行方法體裡面的第二句話:return this;

這裡把this作為返回值,當有返回值的時候,首先會在棧裡面給這個返回值分配一小塊臨時的儲存空間。這塊儲存空間裡面的內容是this裡面的內容。this指向它自身,所以棧記憶體裡面的那塊臨時儲存空間裡面裝的this也是指向堆記憶體裡面的leaf物件。

所以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就當然指的是他自己了。

《轉》C explicit關鍵字詳解

要文 首先,c 中的explicit關鍵字只能用於修飾只有乙個引數的類建構函式,它的作用是表明該建構函式是顯示的,而非隱式的,跟它相對應的另乙個關鍵字是implicit,意思是隱藏的,類建構函式預設情況下即宣告為implicit 隱式 那麼顯示宣告的建構函式和隱式宣告的有什麼區別呢?我們來看下面的例...

《轉》C explicit關鍵字詳解

要文 首先,c 中的explicit關鍵字只能用於修飾只有乙個引數的類建構函式,它的作用是表明該建構函式是顯示的,而非隱式的,跟它相對應的另乙個關鍵字是implicit,意思是隱藏的,類建構函式預設情況下即宣告為implicit 隱式 那麼顯示宣告的建構函式和隱式宣告的有什麼區別呢?我們來看下面的例...

new關鍵字 this關鍵字 base關鍵字

使用new,所做的三件事 1.類是引用物件,引用物件是在堆中開闢空間 在堆中開闢空間 2.在開闢的堆空間中建立物件 3.呼叫物件的構建函式 4.隱藏父類成員 子類的成員可以與隱藏從父類繼承的成員,類似於重寫。public new void sayhello this關鍵字的使用 1.代表當前類的物件...