1.4 super关键字详解
由于子類不能繼承父類的構造方法,因此,如果要調用父類的構造方法,可以使用 super 關鍵字。super 可以用來訪問父類的構造方法、普通方法和屬性。
super 關鍵字的功能:
- 在子類的構造方法中顯式的調用父類構造方法
- 訪問父類的成員方法和變量。
super 關鍵字的用法:
- super.父類屬性名:調用父類中的屬性
- super.父類方法名:調用父類中的方法
- super():調用父類的無參構造方法
- super(參數):調用父類的有參構造方法
super調用父類構造方法
super 關鍵字可以在子類的構造方法中顯式地調用父類的構造方法,基本格式如下:
super(parameter-list);其中,parameter-list 指定了父類構造方法中的所有參數。super( ) 必須是在子類構造方法的方法體的第一行。
例1
聲明父類 Person 和子類 Student,在 Person 類中定義一個帶有參數的構造方法,代碼如下:
會發現 Student 類出現編譯錯誤,提示必須顯式定義構造方法,錯誤信息如下:
Implicit super constructor Person() is undefined for default constructor. Must define an explicit constructor在本例中 JVM 默認給 Student 類加了一個無參構造方法,而在這個方法中默認調用了 super(),但是 Person 類中并不存在該構造方法,所以會編譯錯誤。
如果一個類中沒有寫任何的構造方法,JVM 會生成一個默認的無參構造方法。在繼承關系中,由于在子類的構造方法中,第一條語句默認為調用父類的無參構造方法(即默認為 super(),一般這行代碼省略了)。所以當在父類中定義了有參構造方法,但是沒有定義無參構造方法時,編譯器會強制要求我們定義一個相同參數類型的構造方法。
例2
聲明父類 Person,類中定義兩個構造方法。示例代碼如下:
從上述 Student 類構造方法代碼可以看出,super 可以用來直接調用父類中的構造方法,使編寫代碼也更加簡潔方便。
編譯器會自動在子類構造方法的第一句加上super();來調用父類的無參構造方法,必須寫在子類構造方法的第一句,也可以省略不寫。通過 super 來調用父類其它構造方法時,只需要把相應的參數傳過去。
super訪問父類成員
當子類的成員變量或方法與父類同名時,可以使用 super 關鍵字來訪問。如果子類重寫了父類的某一個方法,即子類和父類有相同的方法定義,但是有不同的方法體,此時,我們可以通過 super 來調用父類里面的這個方法。
使用 super 訪問父類中的成員與 this 關鍵字的使用相似,只不過它引用的是子類的父類,語法格式如下:
super.member其中,member 是父類中的屬性或方法。使用 super 訪問父類的屬性和方法時不用位于第一行。
super調用成員屬性
當父類和子類具有相同的數據成員時,JVM 可能會模糊不清。我們可以使用以下代碼片段更清楚地理解它。
輸出結果為:
學生年齡:12在上面的例子中,父類和子類都有一個成員變量 age。我們可以使用 super 關鍵字訪問 Person 類中的 age 變量。
super調用成員方法
當父類和子類都具有相同的方法名時,可以使用 super 關鍵字訪問父類的方法。具體如下代碼所示。
輸出結果為:
This is student class This is person class在上面的例子中,可以看到如果只調用方法 message( ),是當前的類 message( ) 被調用,使用 super 關鍵字時,是父類的 message( ) 被調用。
super和this的區別
this 指的是當前對象的引用,super 是當前對象的父對象的引用。下面先簡單介紹一下 super 和 this 關鍵字的用法。
super 關鍵字的用法:
- super.父類屬性名:調用父類中的屬性
- super.父類方法名:調用父類中的方法
- super():調用父類的無參構造方法
- super(參數):調用父類的有參構造方法
如果構造方法的第一行代碼不是 this() 和 super(),則系統會默認添加 super()。
this 關鍵字的用法:
- this.屬性名:表示當前對象的屬性
- this.方法名(參數):表示調用當前對象的方法
當局部變量和成員變量發生沖突時,使用this.進行區分。
關于 Java super 和 this 關鍵字的異同,可簡單總結為以下幾條。
是指向自己父類對象的一個指針。在子類中調用父類的構造方法。
語句的存在,所以在同一個構造方法里面有相同的語句,就失去了語句的意義,編譯器也不會通過。
方法和 static 語句塊。
例 3
在 Animal 類和 Cat 類中分別定義了 public 類型的 name 屬性和 private 類型的 name 屬性,并且 Cat 類繼承 Animal 類。那么,我們可以在 Cat 類中通過 super 關鍵字來訪問父類 Animal 中的 name 屬性,通過 this 關鍵字來訪問本類中的 name 屬性,如下面的代碼:
上述代碼演示了使用 super 關鍵字訪問父類中與子類同名的成員變量 name,this 關鍵字訪問本類的 name 變量。運行程序,輸出結果如下:
我是動物,我的名字叫喵星人總結
以上是生活随笔為你收集整理的1.4 super关键字详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1.3 继承(extends)
- 下一篇: 1.5 对象类型转换:向上转型和向下转型