java不理解this?一分鐘徹底弄懂this關(guān)鍵字
this ,翻譯為:這、這個(gè),在java中應(yīng)該翻譯為 “本對象” 或 “對象本身” ,指向的是對象自己
類似于日常的稱呼,比如,別人稱呼你的時(shí)候應(yīng)該用姓名,比如稱呼“趙云”,趙云很帥、趙云武功很強(qiáng),但是趙云自己稱呼自己應(yīng)該用“我”,趙云:我很帥、我武功很強(qiáng)。而“我”就相當(dāng)于this。
this 其實(shí)就是一個(gè)變量,本質(zhì)上和普通的引用類型變量一樣。
比如上面的稱呼,無論稱呼“趙云”、“我”、“你”,本質(zhì)都是稱呼,而且稱呼的對象都是趙云。
this也是如此, 和其他該類的引用類型變量一樣,本質(zhì)都是變量,指向的也是同一個(gè)對象,只不過this是內(nèi)置的變量而已。
為了讓大家更清楚的理解,我們簡單介紹下對象的創(chuàng)建過程,以及如何與變量關(guān)聯(lián)的。
比如下面的代碼:

當(dāng)main方法開始運(yùn)行時(shí),java虛擬機(jī)會為方法創(chuàng)建“本地變量表”,用于存儲方法參數(shù)值、方法內(nèi)的局部變量,比如args、u、u2。
之后運(yùn)行方法內(nèi)的代碼,new User(), 創(chuàng)建User對象,虛擬機(jī)會在內(nèi)存的堆中創(chuàng)建,比如創(chuàng)建的對象內(nèi)存地址為:00000001? , 之后調(diào)用類構(gòu)造方法初始化對象。
然后將創(chuàng)建的對象賦值給變量u,實(shí)際在本地變量表中,變量u存放的是對象的內(nèi)存地址:00000001
之后?User u2 = u, 將u賦值給變量u2, 也就是將00000001? 賦值給u2。這樣,變量u、u2指向的就是同一個(gè)對象。
其實(shí)this和變量u、u2是一樣的,也會存儲到本地變量表中,存儲的也是對象的地址。比如:
當(dāng)運(yùn)行到u.toString()方法時(shí),java虛擬機(jī)也會為該方法創(chuàng)建本地變量表,如圖:
注:java虛擬機(jī)會為每個(gè)正在運(yùn)行的方法都會創(chuàng)建一個(gè)本地變量表。

變量表中第一個(gè)位置存放的就是this,值也是對象的內(nèi)存地址。由此可見,this和其他引用變量是沒有本質(zhì)區(qū)別的。
此時(shí),u、u2、this指向的是同一個(gè)對象,驗(yàn)證一下:
調(diào)用compare方法,將變量u作為參數(shù)傳入, 讓其與this比較。
由于==運(yùn)算符用于引用類型時(shí),只有當(dāng)引用指向的是同一個(gè)對象時(shí)才為真,運(yùn)行輸出:

為什么要有this?
通過代碼可以發(fā)現(xiàn),當(dāng)局部變量與對象屬性同名時(shí),由于局部變量的優(yōu)先級高于對象屬性,優(yōu)先使用局部變量。
如果要訪問對象屬性,就必須要使用“對象.” 的方式,而this就是指向當(dāng)前對象的引用。
this使用注意事項(xiàng)
this 的作用范圍是對象內(nèi)部,可以在對象方法、構(gòu)造方法中使用
也可用于給屬性賦值
this不能用于靜態(tài)方法中
由于靜態(tài)方法是屬于整個(gè)類的,調(diào)用通過類名訪問,不需要?jiǎng)?chuàng)建對象,方法內(nèi)如果有this的話,是沒辦法確認(rèn)這個(gè)this是指向哪個(gè)對象的。
詳細(xì)的也可以觀看視頻教程:https://www.bilibili.com/video/BV1XM4y1X79j