大白話說(shuō)清楚 Java 中的 this 和 super 關(guān)鍵字!
點(diǎn)擊上方藍(lán)色“小哈學(xué)Java”,選擇“設(shè)為星標(biāo)” 回復(fù)“資源”獲取獨(dú)家整理的學(xué)習(xí)資料!
今天就用最通俗易懂的大白話來(lái)聊一聊 Java 中的 this 和 super 以及 this() 和 super()。
1、this關(guān)鍵字
package com.cj.study.thissuper;
public class Student{
public String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
上述代碼是很常見(jiàn)的javabean的定義,里邊經(jīng)常會(huì)出現(xiàn)this這個(gè)關(guān)鍵字
那有思考過(guò)為什么這里需要用this這個(gè)關(guān)鍵字嗎?
為了更簡(jiǎn)單的解釋這個(gè)問(wèn)題,將上述的代碼改一下:

把set方法里的this.name的this去掉,變成了name=name,就會(huì)發(fā)現(xiàn)個(gè)問(wèn)題,這2個(gè)name都是局部變量的name,這就變成了局部變量給局部變量賦值了, 但是咱們是想給對(duì)象的name賦值,并不是想給局部變量賦值,由于名稱一樣導(dǎo)致區(qū)分不出來(lái)了。
所以必須用this來(lái)區(qū)分一下;當(dāng)然如果兩個(gè)不重名的話,name=nnn 這種的不加this是沒(méi)問(wèn)題的,這是因?yàn)樗窍仍诰植空易兞浚绻业搅司陀镁植孔兞浚瑳](méi)找到就去找全局變量。
那這個(gè)this到底是啥呢?
this是當(dāng)前對(duì)象的引用,就是說(shuō)當(dāng)前用構(gòu)造函數(shù)建的對(duì)象是誰(shuí),這個(gè)this就代表誰(shuí),它是一個(gè)引用
另外一個(gè)問(wèn)題,如果構(gòu)造函數(shù)想調(diào)用另一個(gè)構(gòu)造函數(shù)該怎么辦呢?
這個(gè)時(shí)候就需要使用this()了

注意:如果在構(gòu)造函數(shù)里調(diào)用其他重載的構(gòu)造函數(shù)時(shí),則,被調(diào)用的那個(gè)構(gòu)造函數(shù)必須放在代碼的第一行。
下邊是示例:
正確的

錯(cuò)誤的

2、super關(guān)鍵字


上述例子是父類里定義了一個(gè)字段是num,子類里沒(méi)有定義,所以最后的輸出結(jié)果是showNum=4
但是如果子類也定義了一個(gè)num值為5,那打印出來(lái)的一定是5,因?yàn)樵谡{(diào)用成員(成員變量和成員方法)時(shí)如果不特殊標(biāo)明,前邊其實(shí)默認(rèn)省略了this,他默認(rèn)調(diào)用的是子類的。
但是如果這時(shí)候我就想用父類的不想用子類的,怎么辦
這時(shí)候又出現(xiàn)了區(qū)分不出來(lái)的情況,所以要用super來(lái)標(biāo)明你要調(diào)用父類的,而不是子類的

當(dāng)只有父類有,子類沒(méi)有的情況下,則調(diào)的是父類的(因?yàn)樽宇惱^承了父類,子類就擁有了父類出了私有外的所有東西)
當(dāng)父類和子類都有的情況下,默認(rèn)調(diào)用的是子類的,但是用super標(biāo)明了以后調(diào)的是父類的

如上圖所示,this和super的引用是這樣指向?qū)ο蟮某蓡T變量和方法。
this指向了不僅父類可繼承的成員變量和可繼承的方法外,它還指向了子類的成員變量和方法
而super僅僅只是指向了子類對(duì)象中從父類繼承的成員變量和方法。
那如果子類 構(gòu)造函數(shù)想調(diào)用父類的構(gòu)造函數(shù), 怎么辦?
這時(shí)候可以用super();
注意: 在子類的構(gòu)造函數(shù)里都必須去調(diào)用父類的構(gòu)造函數(shù),你不寫(xiě)其實(shí)第一行都有一個(gè)隱式的super();


如果父類里不定義無(wú)參的構(gòu)造的話子類的構(gòu)造函數(shù)會(huì)報(bào)錯(cuò),所以說(shuō)明在子類的構(gòu)造函數(shù)默認(rèn)的都有一句隱式的super();
你的構(gòu)造函數(shù)里默認(rèn)的都有一個(gè)隱式的super();去調(diào)用父類無(wú)參的構(gòu)造,但是如果你的構(gòu)造函數(shù)里不想調(diào)用默認(rèn)的父類無(wú)參構(gòu)造,而是想調(diào)用父類其他的構(gòu)造函數(shù),則你可以顯式的寫(xiě)出來(lái),而且如果你寫(xiě)了則調(diào)用父類的supper(xxx) 必須放在第一行。

以上就是對(duì)this和super的一些總結(jié),希望對(duì)大家有所幫助!
作者:嗑嗑磕嗑瓜子的貓
鏈接:blog.csdn.net/ju_362204801/article/details/91046744
版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接和本聲明。

1. 基于SpringBoot 的CMS系統(tǒng),拿去開(kāi)發(fā)企業(yè)官網(wǎng)真香
2. 跳表 【會(huì)跳的鏈表原來(lái)這么diao】
3. 2020 國(guó)內(nèi)互聯(lián)網(wǎng)公司的薪酬、加班時(shí)長(zhǎng)排名 !
最近面試BAT,整理一份面試資料《Java面試BATJ通關(guān)手冊(cè)》,覆蓋了Java核心技術(shù)、JVM、Java并發(fā)、SSM、微服務(wù)、數(shù)據(jù)庫(kù)、數(shù)據(jù)結(jié)構(gòu)等等。
獲取方式:點(diǎn)“在看”,關(guān)注公眾號(hào)并回復(fù) Java 領(lǐng)取,更多內(nèi)容陸續(xù)奉上。
文章有幫助的話,在看,轉(zhuǎn)發(fā)吧。
謝謝支持喲 (*^__^*)


