今天就跟大家聊聊有關(guān)this關(guān)鍵字如何在Java中使用,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

創(chuàng)新互聯(lián)專注于金華網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供金華營銷型網(wǎng)站建設(shè),金華網(wǎng)站制作、金華網(wǎng)頁設(shè)計(jì)、金華網(wǎng)站官網(wǎng)定制、成都小程序開發(fā)服務(wù),打造金華網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供金華網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
我們通常在用Java中的this關(guān)鍵字的時(shí)候,都知道this是代表正在調(diào)用這個(gè)類的方法的當(dāng)前實(shí)例。通常情況下理解this關(guān)鍵字還是很容易的,但是在我初學(xué)的時(shí)候,有一個(gè)疑問卻一直不能很清晰的理解,現(xiàn)在慢慢的理解了,就想把它記下來,也許有人和我有相同的疑問,說不定可以幫助到別人。我們還是先簡單的看看通常情況下this的作用吧。比如下面的代碼:
public class Leaf {
private int i = 0;
Leaf increment() {
i++;
return this;
}
void print() {
System.out.println("i = " + i);
}
public static void main(String[] args) {
Leaf x = new Leaf();
x.increment().increment().print();
}
}在Leaf類的main方法中,我們new了一個(gè)Leaf實(shí)例 x,然后x實(shí)例調(diào)用increment()方法。如果increment()是普通的方法或者void方法,這個(gè)地方就沒有什么值得我們研究的了。特殊的是,在increment()方法中,我們r(jià)eturn的是一個(gè)this,這個(gè)this代表的就是我們剛剛創(chuàng)建的x。因?yàn)閤正在調(diào)用increment()方法,所以,increment()方法this就很明顯代表的是Leaf的x實(shí)例了。
這看起來沒有什么可討論的,this就是代表的調(diào)用該方法的實(shí)例x。可是,假如我們把main()函數(shù)修改成下面的樣子
public static void main(String[] args) {
Leaf x = new Leaf();
x.increment().increment().print();
Leaf y = new Leaf();
y.increment().increment().print();
}以上修改的代碼中,我們增加創(chuàng)建了一個(gè)Leaf實(shí)例y,然后y也連續(xù)調(diào)用調(diào)用了兩次increment()。現(xiàn)在問題來了,假如 x,y同時(shí)調(diào)用的increment()方法,那么this到底能代表誰呢?你可能會覺得這有什么問題,x調(diào)用increment()方法,this就代表x, y調(diào)用increment()方法,this就代表y。可問題是,當(dāng)我們講調(diào)用方法的時(shí)候,在jvm層面上是找到Leaf類中increment()方法所在的內(nèi)存地址,然后在java虛擬機(jī)棧中創(chuàng)建棧幀.
然后在棧幀中執(zhí)行方法里面的代碼。現(xiàn)在看到了吧,也就是說,在jvm執(zhí)行方法層面,沒有所謂的x調(diào)用,y調(diào)用了,那么,方法中的this到底是怎么確定指向哪個(gè)實(shí)例的呢?
我們還是來看看Leaf類字節(jié)碼中是怎么展示的,是不是我們漏了什么,如果我們沒有把x實(shí)例或者y實(shí)例傳遞到方法里面去,那么,在jvm執(zhí)行方法的時(shí)候,是不可能知道this具體指向哪個(gè)實(shí)例的。
到這里,我們看到在increment()方法中,編碼中沒有參數(shù),但是在字節(jié)碼里面卻顯示參數(shù)個(gè)數(shù)為1,仔細(xì)想想,結(jié)果已經(jīng)很明顯了:jvm在執(zhí)行編譯的時(shí)候,在實(shí)例方法中,會默認(rèn)隱藏的傳遞一個(gè)參數(shù),這個(gè)參數(shù)就是當(dāng)前調(diào)用的實(shí)例本身。比如x調(diào)用,隱藏就把x傳過去,y調(diào)用,就把y傳過去。所以,我們的this才能在jvm執(zhí)行方法層面確定到底指向的是誰。
上面的結(jié)論是我們自己推斷出來的,有沒有那本書對這個(gè)有詳細(xì)的描述呢?《java編程思想》里面,對這塊是這樣描述的:
假定我們在一個(gè)方法的內(nèi)部,并希望獲得當(dāng)前對象的句柄。由于那個(gè)句柄是由編譯器“秘密”傳遞的,所以沒有標(biāo)識符可用。然而,針對這一目的有個(gè)專用的關(guān)鍵字:this。
在里面講的這個(gè)編譯器秘密傳遞的句柄,就是我們這里的這個(gè)隱藏參數(shù)。
到此為止,關(guān)于this的描述想必已經(jīng)很清楚了,我們在jvm層面對它進(jìn)行了理解。那么,各位有沒有興趣在看下下面的這個(gè)例子,想想這個(gè)基類B中的this代表了什么呢?
public class B {
public B() {
System.out.println(this.getClass().getSimpleName());
System.out.println(((A) this).a);
}
}
public class A extends B {
public int a = 100;
public A() {
a = 200;
}
public static void main(String[] args) {
new A();
}
}這個(gè)例子原本是為了了解java具有繼承結(jié)構(gòu)的時(shí)候類是怎么完成初始化的,可是這里面的B類中的構(gòu)造函數(shù)比較特殊:B類中的構(gòu)造函數(shù)中的this輸出的SimpleName是A。通常我們遇到的情況,B類中的this輸出的SimpleName應(yīng)該是B,可是這里卻是A?為什么?
在上面我們講this的過程中,其實(shí)已經(jīng)涉及到這塊了,在調(diào)用java方法創(chuàng)建棧幀的時(shí)候,jvm會秘密的傳遞一個(gè)當(dāng)前實(shí)例。所以,當(dāng)我們在執(zhí)行A的構(gòu)造函數(shù)的時(shí)候,默認(rèn)會調(diào)用父類B的構(gòu)造函數(shù),在調(diào)用父類B構(gòu)造函數(shù)的時(shí)候,秘密的傳進(jìn)去的當(dāng)前實(shí)例是 A的實(shí)例----因?yàn)槭窃贏的構(gòu)造函數(shù)中調(diào)用的B,所以,這個(gè)地方的this反而代表了A。
看完上述內(nèi)容,你們對this關(guān)鍵字如何在Java中使用有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。
新聞標(biāo)題:this關(guān)鍵字如何在Java中使用
網(wǎng)站路徑:http://www.chinadenli.net/article18/pgssdp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、關(guān)鍵詞優(yōu)化、Google、App開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)