Java關鍵字this與super詳解用法
一、this 關鍵字的使用
1. 概述
this是什么?
在Java中,this
關鍵字比較難理解,它的作用和其詞義很接近,表示“當前”的意思。
2. 作用
this
關鍵字可以用來修飾、調用:屬性、方法、構造器。this
關鍵字只能在方法內部使用。- 它在方法內部使用,即這個方法所屬對象的引用;
- 它在構造器內部使用,表示該構造器正在初始化的對象。
3. 使用
什么時候使用this關鍵字呢?
當在方法內需要用到調用該方法的對象時,就用this
。具體的:我們可以用this
來區(qū)分屬性和局部變量。比如:this.name = name;
3.1 修飾屬性和方法
this
理解為:當前對象或當前正在創(chuàng)建的對象- 在類的方法中,我們可以使用
this.屬性
或this.方法
的方式,調用當前對象屬性或方法。但是,通常情況下,我們都選擇省略this.
。特殊情況下,如果方法的形參和類的屬性同名時,我們必須顯式的使用this.變量
的方式,表明此變量是屬性,而非形參。 - 使用
this
訪問屬性和方法時,如果在本類中未找到,會從父類中查找。
代碼演示:
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 調用構造器
- 在類的構造器中,我們可以使用
this.屬性
或this.方法
的方式,調用當前正在創(chuàng)建的對象屬性或方法。但是,通常情況下,我們都選擇省略this.
。特殊情況下,如果構造器的形參和類的屬性同名時,我們必須顯式的使用this.變量
的方式,表明此變量是屬性,而非形參。 - 我們在類的構造器中,可以顯式的使用
this(形參列表)
的方式,調用本類中指定的其它構造器。 - 構造器中不能通過
this(形參列表)
方式調用自身的構造器。 - 如果一個類中有n個構造器,則最多有 n - 1個構造器中使用了
this(形參列表)
- 規(guī)定:
this(形參列表)
必須聲明在當前構造器的首行。 - 構造器內部,最多只能聲明一個
this(形參列表)
,用來調用其它的構造器。 - 除構造器之外,編譯器禁止在其它任何方法中調用構造器。
代碼演示:
class Person{ // 定義Person類 private String name ; private int age ; public Person(){ // 無參構造器 System.out.println("新對象實例化") ; } public Person(String name){ this(); // 調用本類中的無參構造器 this.name = name ; } public Person(String name,int age){ this(name) ; // 調用有一個參數(shù)的構造器 this.age = age; } public String getInfo(){ return "姓名:" + name + ",年齡:" + age ; } }
3.3 返回當前對象
代碼演示:
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關鍵字的使用
1. 概述
(1)super
理解為:父類的
(2)在Java類中使用super來調用父類中的指定操作:
super
可用于訪問父類中定義的屬性。super
可用于調用父類中定義的成員方法。super
可用于在子類構造器中調用父類的構造器。- 尤其當子父類出現(xiàn)同名成員時,可以用
super
表明調用的是父類中的成員,super
的追溯不僅限于直接父類。 super
和this
的用法相像,this
代表本類對象的引用,super
代表父類的內存空間的標識。
2. 使用
可以在子類中顯示地調用父類的結構。
3. 使用
3.1 調用屬性和方法
- 我們可以在子類的方法或構造器中。通過使用"
super.屬性
“或”super.方法
“的方式,顯式的調用父類中聲明的屬性或方法。但是,通常情況下,我們習慣省略”super.
"。 - 當子類和父類中定義了同名的屬性時,我們要想在子類中調用父類中聲明的屬性,則必須顯式的使用"
super.屬性
"的方式,表明調用的是父類中聲明的屬性。 - 當子類重寫了父類中的方法以后,我們想在子類的方法中調用父類中被重寫的方法時,則必須顯式的使用"
super.方法
"的方式,表明調用的是父類中被重寫的方法。
3.2 調用構造器
(1)子類中所有的構造器默認都會訪問父類中空參數(shù)的構造器。
(2)當父類中沒有空參數(shù)的構造器時,子類的構造器必須通過this(參數(shù)列表)或者super(參數(shù)列表)語句指定調用本類或者父類中相應的構造器,否則編譯出錯。同時,只能”二選一”,不能同時出現(xiàn),且必須放在構造器的首行。
(3)在類的多個構造器中,至少有一個類的構造器中使用了"super(形參列表)",調用父類中的構造器。
代碼演示:
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; } // 編譯出錯: no super(),系統(tǒng)將調用父類無參數(shù)的構造器。 public Student(String s) { school = s; } }
三、this和super的區(qū)別
No. | 區(qū)別點 | this | super |
---|---|---|---|
1 | 訪問屬性 | 訪問本類中的屬性,如果本類沒有此屬性則從父類中繼續(xù)查找 | 直接訪問父類中的屬性 |
2 | 調用方法 | 訪問本類中的方法,如果本類沒有此方法則從父類中繼續(xù)查找 | 直接訪問父類中的方法 |
3 | 調用構造器 | 調用本類構造器,必須放在構造器的首行 | 調用父類構造器,必須放在子類構造器的首行 |
四、子類對象實例化的全過程
(1)從結果上來看:(繼承性)
- 子類繼承父類以后,就獲取了父類中聲明的屬性或方法。
- 創(chuàng)建子類的對象,在堆空間中,就會加載所有父類中聲明的屬性。
(2)從過程上來看:
當我們通過子類的構造器創(chuàng)建子類對象時,我們一定會直接或間接的調用其父類的構造器,進而調用父類的父類的構造器,…直到調用了java.lang.Object
類中空參的構造器為止。正因為加載過所有的父類的結構,所以才可以看到內存中有父類中的結構,子類對象才可以考慮進行調用。
(3)明確:雖然創(chuàng)建子類對象時,調用了父類的構造器,但是自始至終就創(chuàng)建過一個對象,即為new
的子類對象。
到此這篇關于Java關鍵字this與super詳解的文章就介紹到這了,更多相關Java this內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java中List Set和Map之間的區(qū)別_動力節(jié)點Java學院整理
Java集合的主要分為三種類型set集,list列表,map映射,接下來通過本文給大家詳細介紹java中l(wèi)ist、Set和Map之間的區(qū)別,需要的的朋友參考下吧2017-05-05SpringCloud實現(xiàn)灰度發(fā)布的方法步驟
本文主要介紹了SpringCloud實現(xiàn)灰度發(fā)布的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-05-05