this关键字的作用
在Java中this關(guān)鍵字的作用有兩個(gè):
1.當(dāng)成員變量與局部變量同名時(shí),用來(lái)區(qū)分成員變量和局部變量;
2.在構(gòu)造函數(shù)中調(diào)用構(gòu)造函數(shù)。
下面我們來(lái)詳細(xì)解釋一下這兩句話:
1.區(qū)分成員和局部變量:
有時(shí)我們?yōu)榱俗屪兞扛哂姓Z(yǔ)義化,經(jīng)常會(huì)出現(xiàn)成員變量和局部變量同名的問(wèn)題,這時(shí)候就要用到this了,比如以下代碼:
如果我們不加this關(guān)鍵字,打印出的結(jié)果是null;如果我們用this.name打印出的結(jié)果是張三,為什么呢?
當(dāng)創(chuàng)建新對(duì)象的時(shí)候,構(gòu)造函數(shù)會(huì)被自動(dòng)調(diào)用,我們傳的參數(shù)是“張三”,在構(gòu)造函數(shù)Demo()里會(huì)定義一個(gè)名稱為name的變量來(lái)接收這個(gè)數(shù)據(jù)“張三”,然后進(jìn)行賦值的動(dòng)作。
如果寫(xiě)成name=name;就相當(dāng)于我們把“張三”這個(gè)值又賦給了它自己,這個(gè)棧里的變量對(duì)自己進(jìn)行重寫(xiě),這是毫無(wú)意義的,所以我們?cè)趺床拍馨阉x值給堆里的變量name(也就是成員變量name)呢?這就要用到關(guān)鍵字this了。
其實(shí)每個(gè)函數(shù)里面其實(shí)都有一個(gè)默認(rèn)的this引用,當(dāng)對(duì)象調(diào)用函數(shù)的時(shí)候,將對(duì)象的地址賦給this關(guān)鍵字,此時(shí)this關(guān)鍵字可以指向?qū)ο?#xff0c;通過(guò)this就可以訪問(wèn)成員變量了(就是對(duì)象的屬性)。用語(yǔ)言解釋可能比較蒼白,我們先舉例后上圖:
所以說(shuō),其實(shí)this放的是對(duì)象的地址,我們可以打印出this的結(jié)果:
可以看到this的結(jié)果是一個(gè)哈希地址,@左邊代表Demo類型,右邊是地址(我的理解是,this就是一個(gè)萬(wàn)能引用變量,當(dāng)函數(shù)被某種類型的對(duì)象調(diào)用時(shí),默認(rèn)的this就引用某種類型的對(duì)象,存放其地址,以此來(lái)達(dá)到指向?qū)ο?#xff0c;修改對(duì)象屬性的目的)。
其實(shí)我們平時(shí)寫(xiě)函數(shù)的時(shí)候,如果局部變量沒(méi)有和成員變量沖突的情況時(shí),是可以不用寫(xiě)this的,因?yàn)闂V袥](méi)有這個(gè)變量名,它會(huì)去堆中找這個(gè)變量,當(dāng)去堆中找的時(shí)候,其實(shí)是幫我們默認(rèn)加上this了,即:
和
public void speak(){System.out.println(name+":"+age);}是一樣的,雖然我們不寫(xiě),但是其實(shí)默認(rèn)是有的。
2.this的第二種使用方式:在構(gòu)造函數(shù)中調(diào)用另一個(gè)構(gòu)造函數(shù)。
我們知道,構(gòu)造函數(shù)只能在對(duì)象創(chuàng)建的時(shí)候調(diào)用僅調(diào)用一次,但是利用this關(guān)鍵字可以在構(gòu)造函數(shù)中調(diào)用構(gòu)造函數(shù):
在第二個(gè)構(gòu)造函數(shù)中調(diào)用第一個(gè)構(gòu)造函數(shù),如果當(dāng)一個(gè)對(duì)象創(chuàng)建的時(shí)候調(diào)用第二個(gè)構(gòu)造函數(shù),那么此時(shí)this 就指向這個(gè)對(duì)象(可以說(shuō)是這個(gè)對(duì)象的名稱吧),如果this(name),可以調(diào)用第一個(gè)構(gòu)造函數(shù),此時(shí)第一個(gè)構(gòu)造函數(shù)里的this也有了這個(gè)對(duì)象的地址,可以初始化對(duì)象。我們畫(huà)出內(nèi)存圖解。
但是值得注意的一點(diǎn)是:調(diào)用構(gòu)造函數(shù)的語(yǔ)句一定要寫(xiě)在第一行,因?yàn)闃?gòu)造函數(shù)的作用是初始化,不能將初始化語(yǔ)句放在后面。函數(shù)是一個(gè)封裝體,如果傳的參數(shù)進(jìn)去得到另一個(gè)值,那么功能就改變了,是一種極其不嚴(yán)謹(jǐn)?shù)男袨?#xff0c;所以將初始化語(yǔ)句放在后面是會(huì)編譯報(bào)錯(cuò)的。這也是為什么不能在普通函數(shù)中調(diào)用構(gòu)造函數(shù)的原因,一定要先初始化。
總結(jié)
以上是生活随笔為你收集整理的this关键字的作用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: hmm进行英文词性标注
- 下一篇: JAVA第五课:正则表达式