Java中this和super關(guān)鍵字的使用詳解
一、“ this ”關(guān)鍵字的使用
1. 概述
this是什么?
在Java中,this關(guān)鍵字比較難理解,它的作用和其詞義很接近,表示“當(dāng)前”的意思。
2. 作用
- his關(guān)鍵字可以用來(lái)修飾、調(diào)用:屬性、方法、構(gòu)造器。
- this關(guān)鍵字只能在方法內(nèi)部使用。
- 它在方法內(nèi)部使用,即這個(gè)方法所屬對(duì)象的引用;
- 它在構(gòu)造器內(nèi)部使用,表示該構(gòu)造器正在初始化的對(duì)象。
3. 使用
什么時(shí)候使用this關(guān)鍵字呢?
當(dāng)在方法內(nèi)需要用到調(diào)用該方法的對(duì)象時(shí),就用this。具體的:我們可以用this來(lái)區(qū)分屬性和局部變量。比如:this.name = name;
3.1 修飾屬性和方法
this理解為:當(dāng)前對(duì)象或當(dāng)前正在創(chuàng)建的對(duì)象
在類的方法中,我們可以使用this.屬性或this.方法的方式,調(diào)用當(dāng)前對(duì)象屬性或方法。但是,通常情況下,我們都選擇省略this.。特殊情況下,如果方法的形參和類的屬性同名時(shí),我們必須顯式的使用this.變量的方式,表明此變量是屬性,而非形參。
使用this訪問(wèn)屬性和方法時(shí),如果在本類中未找到,會(huì)從父類中查找。
代碼演示:
class Person{ // 定義Person類 private String name ; private int age ; public Person(String name,int age){ this.name = name ; this.age = age ; } public void getInfo(){ System.out.println("姓名:" + name) ; this.speak(); } public void speak(){ System.out.println(“年齡:” + this.age); } }
3.2 調(diào)用構(gòu)造器
在類的構(gòu)造器中,我們可以使用this.屬性或this.方法的方式,調(diào)用當(dāng)前正在創(chuàng)建的對(duì)象屬性或方法。但是,通常情況下,我們都選擇省略this.。特殊情況下,如果構(gòu)造器的形參和類的屬性同名時(shí),我們必須顯式的使用this.變量的方式,表明此變量是屬性,而非形參。
我們?cè)陬惖臉?gòu)造器中,可以顯式的使用this(形參列表)的方式,調(diào)用本類中指定的其它構(gòu)造器。
構(gòu)造器中不能通過(guò)this(形參列表)方式調(diào)用自身的構(gòu)造器。
如果一個(gè)類中有n個(gè)構(gòu)造器,則最多有 n - 1個(gè)構(gòu)造器中使用了this(形參列表)
規(guī)定:this(形參列表)必須聲明在當(dāng)前構(gòu)造器的首行。
構(gòu)造器內(nèi)部,最多只能聲明一個(gè)this(形參列表),用來(lái)調(diào)用其它的構(gòu)造器。
除構(gòu)造器之外,編譯器禁止在其它任何方法中調(diào)用構(gòu)造器。
代碼演示:
class Person{ // 定義Person類 private String name ; private int age ; public Person(){ // 無(wú)參構(gòu)造器 System.out.println("新對(duì)象實(shí)例化") ; } public Person(String name){ this(); // 調(diào)用本類中的無(wú)參構(gòu)造器 this.name = name ; } public Person(String name,int age){ this(name) ; // 調(diào)用有一個(gè)參數(shù)的構(gòu)造器 this.age = age; } public String getInfo(){ return "姓名:" + name + ",年齡:" + age ; } }
3.3 返回當(dāng)前對(duì)象
代碼演示:
public class Leaf { 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().increment().print();//i = 3 } }
二、“ super ”關(guān)鍵字的使用
1. 概述
(1)super理解為:父類的
(2)在Java類中使用super來(lái)調(diào)用父類中的指定操作:
super可用于訪問(wèn)父類中定義的屬性。
super可用于調(diào)用父類中定義的成員方法。
super可用于在子類構(gòu)造器中調(diào)用父類的構(gòu)造器。
尤其當(dāng)子父類出現(xiàn)同名成員時(shí),可以用super表明調(diào)用的是父類中的成員,super的追溯不僅限于直接父類。
super和this的用法相像,this代表本類對(duì)象的引用,super代表父類的內(nèi)存空間的標(biāo)識(shí)。
2.使用
可以在子類中顯示地調(diào)用父類的結(jié)構(gòu)。
3.使用
3.1 調(diào)用屬性和方法
我們可以在子類的方法或構(gòu)造器中。通過(guò)使用"super.屬性"或"super.方法"的方式,顯式的調(diào)用父類中聲明的屬性或方法。但是,通常情況下,我們習(xí)慣省略"super."。
當(dāng)子類和父類中定義了同名的屬性時(shí),我們要想在子類中調(diào)用父類中聲明的屬性,則必須顯式的使用"super.屬性"的方式,表明調(diào)用的是父類中聲明的屬性。
當(dāng)子類重寫(xiě)了父類中的方法以后,我們想在子類的方法中調(diào)用父類中被重寫(xiě)的方法時(shí),則必須顯式的使用"super.方法"的方式,表明調(diào)用的是父類中被重寫(xiě)的方法。
3.2 調(diào)用構(gòu)造器
(1)子類中所有的構(gòu)造器默認(rèn)都會(huì)訪問(wèn)父類中空參數(shù)的構(gòu)造器。
(2)當(dāng)父類中沒(méi)有空參數(shù)的構(gòu)造器時(shí),子類的構(gòu)造器必須通過(guò)this(參數(shù)列表)或者super(參數(shù)列表)語(yǔ)句指定調(diào)用本類或者父類中相應(yīng)的構(gòu)造器,否則編譯出錯(cuò)。同時(shí),只能”二選一”,不能同時(shí)出現(xiàn),且必須放在構(gòu)造器的首行。
(3)在類的多個(gè)構(gòu)造器中,至少有一個(gè)類的構(gòu)造器中使用了"super(形參列表)",調(diào)用父類中的構(gòu)造器。
代碼演示:
public class Person { private String name; private int age; private Date birthDate; public Person(String name, int age, Date d) { this.name = name; this.age = age; this.birthDate = d; } public Person(String name, int age) { this(name, age, null); } public Person(String name, Date d) { this(name, 30, d); } public Person(String name) { this(name, 30); } } public class Student extends Person { private String school; public Student(String name, int age, String s) { super(name, age); school = s; } public Student(String name, String s) { super(name); school = s; } // 編譯出錯(cuò): no super(),系統(tǒng)將調(diào)用父類無(wú)參數(shù)的構(gòu)造器。 public Student(String s) { school = s; } }
三、this和super的區(qū)別
No. | 區(qū)別點(diǎn) | this | super |
---|---|---|---|
1 | 訪問(wèn)屬性 | 訪問(wèn)本類中的屬性,如果本類沒(méi)有此屬性則從父類中繼續(xù)查找 | 直接訪問(wèn)父類中的屬性 |
2 | 調(diào)用方法 | 訪問(wèn)本類中的方法,如果本類沒(méi)有此方法則從父類中繼續(xù)查找 | 直接訪問(wèn)父類中的方法 |
3 | 調(diào)用構(gòu)造器 | 調(diào)用本類構(gòu)造器,必須放在構(gòu)造器的首行 | 調(diào)用父類構(gòu)造器,必須放在子類構(gòu)造器的首行 |
四、子類對(duì)象實(shí)例化的全過(guò)程
(1)從結(jié)果上來(lái)看:(繼承性)
子類繼承父類以后,就獲取了父類中聲明的屬性或方法。
創(chuàng)建子類的對(duì)象,在堆空間中,就會(huì)加載所有父類中聲明的屬性。
(2)從過(guò)程上來(lái)看:
當(dāng)我們通過(guò)子類的構(gòu)造器創(chuàng)建子類對(duì)象時(shí),我們一定會(huì)直接或間接的調(diào)用其父類的構(gòu)造器,進(jìn)而調(diào)用父類的父類的構(gòu)造器,…直到調(diào)用了java.lang.Object類中空參的構(gòu)造器為止。正因?yàn)榧虞d過(guò)所有的父類的結(jié)構(gòu),所以才可以看到內(nèi)存中有父類中的結(jié)構(gòu),子類對(duì)象才可以考慮進(jìn)行調(diào)用。
(3)明確:雖然創(chuàng)建子類對(duì)象時(shí),調(diào)用了父類的構(gòu)造器,但是自始至終就創(chuàng)建過(guò)一個(gè)對(duì)象,即為new的子類對(duì)象。
以上就是Java中this和super關(guān)鍵字的使用詳解的詳細(xì)內(nèi)容,更多關(guān)于Java this super關(guān)鍵字的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
解決springboot生成bean名稱沖突(AnnotationBeanNameGenerator)
這篇文章主要介紹了解決springboot生成bean名稱沖突(AnnotationBeanNameGenerator),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03Mybatis攔截器實(shí)現(xiàn)數(shù)據(jù)分表
當(dāng)數(shù)據(jù)量比較多時(shí),放在一個(gè)表中的時(shí)候會(huì)影響查詢效率,本文主要介紹了Mybatis攔截器實(shí)現(xiàn)數(shù)據(jù)分表,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-01-01Easyui的combobox實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)級(jí)聯(lián)效果
這篇文章主要介紹了Easyui的combobox實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)級(jí)聯(lián)效果的相關(guān)資料,感興趣的小伙伴們可以參考一下2016-06-06SpringBoot數(shù)據(jù)庫(kù)恢復(fù)的兩種方法mysqldump和mysqlbinlog
binlog用來(lái)實(shí)現(xiàn)主從復(fù)制,也常用來(lái)誤刪數(shù)據(jù)庫(kù)找回丟失的記錄,本文主要介紹了SpringBoot數(shù)據(jù)庫(kù)恢復(fù)的兩種方法mysqldump和mysqlbinlog,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01使用filebeat收集并解析springboot日志過(guò)程示例
這篇文章主要為大家介紹了使用filebeat收集并解析springboot日志實(shí)現(xiàn)過(guò)程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08如何使用@Slf4j和logback-spring.xml搭建日志框架
這篇文章主要介紹了如何使用@Slf4j和logback-spring.xml搭建日志框架問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06SpringBoot整合Mybatis與thymleft實(shí)現(xiàn)增刪改查功能詳解
MybatisPlus是國(guó)產(chǎn)的第三方插件,?它封裝了許多常用的CURDapi,免去了我們寫(xiě)mapper.xml的重復(fù)勞動(dòng)。本文將整合MybatisPlus實(shí)現(xiàn)增刪改查功能,感興趣的可以了解一下2022-12-12