今天在上課時(shí)压怠,冉冉大妹紙拉著我問(wèn):小哥哥飞苇,小哥哥蜗顽,聽說(shuō)你在學(xué)Java,那你知道this關(guān)鍵字嗎雇盖?
我:啊贸街?this啊? (完了完了狸相,學(xué)習(xí)的時(shí)候?qū)W的什么也不是,這下被問(wèn)到了逸尖,還是個(gè)妹紙瘸右,答不上來(lái)豈不尷尬)。
冉冉妹紙:你到底知道嘛太颤?不是吧,不是吧吃谣,聽說(shuō)你學(xué)了很久的Java瓦堵,不會(huì)連this關(guān)鍵字都不知道吧!
我:會(huì)啊澜驮,那還不簡(jiǎn)單惋鸥,等我慢慢給你講來(lái)(giao悍缠,把握住機(jī)會(huì)耐量,加分項(xiàng)啊這可是,必須說(shuō)出點(diǎn)什么)
好了趴拧,來(lái)吧山叮,給你講講this關(guān)鍵字
this關(guān)鍵字的作用:
1、區(qū)分成員變量和局部變量(當(dāng)成員變量和局部變量重名時(shí))
2脑又、可在構(gòu)造方法中調(diào)用同一個(gè)類的其他構(gòu)造方法(但是規(guī)定this只能寫在構(gòu)造方法的第一行)
3锐借、能調(diào)用構(gòu)造方法,當(dāng)然也能調(diào)用普通方法啦(在同一個(gè)類中的方法內(nèi)部钞翔,其實(shí)不必要使用this來(lái)調(diào)用嗅战,直接寫出方法名即可,但是有的人會(huì)認(rèn)為驮捍,寫出this會(huì)讓代碼看起來(lái)更規(guī)范。我認(rèn)為這個(gè)完全沒(méi)必要启具。這里看個(gè)人習(xí)慣吧珊泳。)~
我:你看,這不是很簡(jiǎn)單嗎薯演?
冉冉:什么啊秧了,就這?我知道啊衡创,你這不是在給我說(shuō)點(diǎn)沒(méi)用的話嘛。
我:別氣嘛璃氢,那我再給你扯點(diǎn)(絞盡腦汁的想)
4、this關(guān)鍵字還可以作為當(dāng)前的對(duì)象的引用進(jìn)行返回巢寡,我讓你看看代碼你就理解了
public class Student {
public Student log2(){
System.out.println("直接返回一個(gè)Student的引用");
return this;
}
}
就這么寫塘秦。你看,多簡(jiǎn)單
冉冉:沒(méi)聽懂,返回什么對(duì)象什么引用啊须误。仇轻。。
我:嗯篷店。。方淤。蹄殃。好吧,那我再給你解釋一下讳苦。再看一下代碼吩谦!
public class TestMain {
public static void main(String[] args) {
Student student = new Student();
Student student2 = student.log2();
System.out.println(student == student2);
}
}
你看式廷,你 new 個(gè)對(duì)象(對(duì)象引用),然后去調(diào)用log2這個(gè)方法,就會(huì)再返回一個(gè)對(duì)象览绿,此時(shí)這個(gè)對(duì)象和你new的那個(gè)是同一個(gè)穗慕。但是如果你直接return new Student(); 那此時(shí)這個(gè)對(duì)象就是一個(gè)新的對(duì)象,所以說(shuō)怀各,this能返回當(dāng)前對(duì)象(引用)术浪。懂了吧!
冉冉:這樣啊硕蛹,那你這么說(shuō)硕并,我就知道了。
我:再給你掰扯點(diǎn)倔毙,別著急陕赃;
你知道如果有兩個(gè)Student的對(duì)象時(shí),他們都要去調(diào)用同一個(gè)方法么库,怎么才能知道廊散,到底是哪個(gè)對(duì)象在調(diào)用這個(gè)方法呢?比如這樣的代碼
public class Student {
public void log2(int i) {
System.out.println(i);
}
}```
public class TestMain {
public static void main(String[] args) {
Student s1 = new Student();
Student s2 = new Student();
s1.log2(2);
s2.log2(3);
}
}
是不是覺(jué)得這是兩個(gè)不同對(duì)象的引用啊运准,當(dāng)然能區(qū)分是誰(shuí)在調(diào)用了扮允堋!
其實(shí)本質(zhì)不是這樣滴
你在寫完代碼后米者,編譯器悄悄在幫助你做了一個(gè)工作,為了讓你省心呢胰丁,多么貼心啊,我要是....
冉冉:你倒是說(shuō)啊机蔗,到底做了什么甘萧?
我:好吧;我說(shuō)牙言。怪得。。
當(dāng)你在調(diào)用方法的時(shí)候庞钢,其實(shí)編譯器悄悄在你傳的參數(shù)前邊加了當(dāng)前的對(duì)象因谎,像這樣
s1.log2(s1,2);
s2.log2(s2,3);
當(dāng)然颜懊,如果你這么寫代碼,那編譯器肯定會(huì)說(shuō):這點(diǎn)小事情匠璧,還是我替你做吧咸这,就不麻煩小主人了,然后無(wú)情的給了你一個(gè)紅波浪線酿雪;
冉冉:真的假的啊侄刽,說(shuō)的這么玄乎。
我:害州丹,你還不信杂彭,看下邊的代碼吓揪,我們?cè)诜椒ㄉ献鰝€(gè)小改動(dòng)
public class Student {
public void log2(int i) {
System.out.println(this + " " + i);
}
}```
public class TestMain {
public static void main(String[] args) {
Student s1 = new Student();
Student s2 = new Student();
System.out.println("s1的地址----->" + s1);
System.out.println("s2的地址----->" + s2);
s1.log2(2);
s2.log2(3);
}
}
為了能看清楚是不是這樣,我們吧 s1 s2 指向的地址在主方法中打印出來(lái)团秽,發(fā)現(xiàn)和方法中的 this 打印出來(lái)的地址一樣
這就說(shuō)明了徙垫,確實(shí)是將對(duì)象給傳了進(jìn)去放棒。
冉冉:啊,我懂了间螟,我知道了厢破,原來(lái)是這樣啊,真神奇摩泪。我...我...
我:你怎么了,還有什么不懂得嗎嚷掠?
冉冉: 區(qū)分變量我總是記不住到底指向的是誰(shuí)....
我:這個(gè)啊荞驴,簡(jiǎn)單,你記住就遠(yuǎn)原則 "this." 這個(gè)this打點(diǎn)調(diào)用的是誰(shuí)霹娄,誰(shuí)就是成員變量鲫骗。如果你的變量出現(xiàn)了同名的情況挎峦,如果不進(jìn)行指向,默認(rèn)就是使用你的局部變量坦胶。
老師:你們倆嘀咕什么呢晴楔?都嘀咕半節(jié)課了税弃,有什么好玩的事情凑队,分享出來(lái),我們大家一起開心嘛西壮!
總結(jié):
由于我個(gè)人覺(jué)得叫惊,如果只是枯燥的堆疊概念,只講述一些術(shù)語(yǔ)抡草,不僅看起來(lái)無(wú)聊蔗坯,看過(guò)之后還會(huì)忘得一干二凈。所以筆記用這種方法展示出來(lái)宾濒,可能更能讓人記憶更深刻。學(xué)習(xí)本來(lái)沒(méi)有固定的方法绘梦,不管怎么學(xué)谚咬,學(xué)會(huì)了就行嘛尚粘!
如有錯(cuò)誤,歡迎指出秉继!一定及時(shí)改正