this关键字的作用
在Java中this關鍵字的作用有兩個:
1.當成員變量與局部變量同名時,用來區分成員變量和局部變量;
2.在構造函數中調用構造函數。
下面我們來詳細解釋一下這兩句話:
1.區分成員和局部變量:
有時我們為了讓變量更具有語義化,經常會出現成員變量和局部變量同名的問題,這時候就要用到this了,比如以下代碼:
如果我們不加this關鍵字,打印出的結果是null;如果我們用this.name打印出的結果是張三,為什么呢?
當創建新對象的時候,構造函數會被自動調用,我們傳的參數是“張三”,在構造函數Demo()里會定義一個名稱為name的變量來接收這個數據“張三”,然后進行賦值的動作。
如果寫成name=name;就相當于我們把“張三”這個值又賦給了它自己,這個棧里的變量對自己進行重寫,這是毫無意義的,所以我們怎么才能把它賦值給堆里的變量name(也就是成員變量name)呢?這就要用到關鍵字this了。
其實每個函數里面其實都有一個默認的this引用,當對象調用函數的時候,將對象的地址賦給this關鍵字,此時this關鍵字可以指向對象,通過this就可以訪問成員變量了(就是對象的屬性)。用語言解釋可能比較蒼白,我們先舉例后上圖:
所以說,其實this放的是對象的地址,我們可以打印出this的結果:
可以看到this的結果是一個哈希地址,@左邊代表Demo類型,右邊是地址(我的理解是,this就是一個萬能引用變量,當函數被某種類型的對象調用時,默認的this就引用某種類型的對象,存放其地址,以此來達到指向對象,修改對象屬性的目的)。
其實我們平時寫函數的時候,如果局部變量沒有和成員變量沖突的情況時,是可以不用寫this的,因為棧中沒有這個變量名,它會去堆中找這個變量,當去堆中找的時候,其實是幫我們默認加上this了,即:
和
public void speak(){System.out.println(name+":"+age);}是一樣的,雖然我們不寫,但是其實默認是有的。
2.this的第二種使用方式:在構造函數中調用另一個構造函數。
我們知道,構造函數只能在對象創建的時候調用僅調用一次,但是利用this關鍵字可以在構造函數中調用構造函數:
在第二個構造函數中調用第一個構造函數,如果當一個對象創建的時候調用第二個構造函數,那么此時this 就指向這個對象(可以說是這個對象的名稱吧),如果this(name),可以調用第一個構造函數,此時第一個構造函數里的this也有了這個對象的地址,可以初始化對象。我們畫出內存圖解。
但是值得注意的一點是:調用構造函數的語句一定要寫在第一行,因為構造函數的作用是初始化,不能將初始化語句放在后面。函數是一個封裝體,如果傳的參數進去得到另一個值,那么功能就改變了,是一種極其不嚴謹的行為,所以將初始化語句放在后面是會編譯報錯的。這也是為什么不能在普通函數中調用構造函數的原因,一定要先初始化。
總結
以上是生活随笔為你收集整理的this关键字的作用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hmm进行英文词性标注
- 下一篇: JAVA第五课:正则表达式