Java基礎之super關鍵字淺析
本文重點介紹super關鍵字,在Java中的作用以及用法。
一、定義
它是一個指代變量,用于在子類中指代父類對象。
二、應用
2.1 應用范圍
只能用于子類的構造函數(shù)和實例方法中,不能用于子類的類(靜態(tài))方法中。原因是super指代的是一個父類的對象,它需要在運行時被創(chuàng)建,而靜態(tài)方法是類方法,它是類的一部分。當類被加載時,方法已經(jīng)存在,但是這時候父類對象還沒有被初始化。
2.2 用法
在Java中super有兩種使用場景。
2.2.1 在子類中調(diào)用父類的屬性或方法
在子類中調(diào)用父類的屬性或方法。特別是子類中有與父類相同的屬性或者方法,那么這時如果你想調(diào)用父類的屬性或者方法,那么你必須使用super關鍵字。因為子類中和父類中的屬性或方法同名,則父類中的方法或?qū)傩詫⒈桓采w或隱藏。super可以指代父類中的類屬性和類方法,但是并不建議這么用,雖然不會報錯,但是說明你對static關鍵字還不夠了解。請認真查看并理解static關鍵字。
public class Parent {
public String name = "小頭爸爸";
public boolean hasMoney = false;
public void sleeping(){
System.out.println("爸爸已經(jīng)睡了");
}
public void working(){
System.out.println("爸爸正在工作。。。");
}
}
public class Child extends Parent {
public String name = "大頭兒子";
/**
* 當子類和父類有屬性重名時,需要super才能調(diào)用到父類的屬性,
* 直接調(diào)用會調(diào)用到子類的屬性
* 如果不重名,可直接調(diào)用且調(diào)用的是父類的屬性
*/
private void testParam(){
System.out.println("爸爸的名字叫" + super.name);
System.out.println("孩子的名字是" + name);
System.out.println("爸爸是否有有錢:" + hasMoney);
}
/**
* 方法和上面的屬性結果一樣
*/
public void testMethod(){
sleeping();
super.sleeping();
super.working();
}
public void sleeping(){
System.out.println("兒子已經(jīng)睡了");
}
public static void main(String[] args) {
Child child = new Child();
child.testParam();
child.testMethod();
}
}測試結果:
=============
爸爸的名字叫小頭爸爸
孩子的名字是大頭兒子
爸爸是否有有錢:false
兒子已經(jīng)睡了
爸爸已經(jīng)睡了爸爸正在工作。。。
============
2.2.2 在子類中指代父類構造器
在Java中,子類是父類的派生類,它的實例化依賴于父類的實例化。所以它的任何一個構造函數(shù)都必須要初始化父類,Java就是super關鍵字調(diào)用父類構造方法,來完成這個操作。
有人會奇怪,那為什么在2.1.1的例子,父類沒有構造方法,子類也沒有構造方法,難道在某些情況下,實例的初始化并不依賴于構造函數(shù)?
答案是,實例的初始化必須要構造函數(shù)。2.2.1沒有構造函數(shù)的原因是,在Java類定義中,如果開發(fā)者沒有顯示的定義構造函數(shù),那么Java會隱式的為該類定義一個無參構造函數(shù)。但是如果開發(fā)者自己定一個構造函數(shù)(無論有參還是無參),那么Java就不會再為該類隱式的定義一個無參構造函數(shù)了。
那么還原構造函數(shù)后的代碼:
public class Parent {
...
public Parent() {
}
...
}
public class Child extends Parent {
...
public Child() {
}
...
}那么又有人有奇怪了,你不是說子類的實例化依賴于父類的實例化,那么在子類的構造函數(shù)中應該需要調(diào)用super來初始化父類不是嗎?
是的,在我們子類的構造函數(shù)中,如果我們沒有顯式調(diào)用super來初始化父類的話,那么Java會隱式的調(diào)用super();來調(diào)用父類無參構造函數(shù)并把它放在構造函數(shù)的第一行。記住哦,Java只會隱式的調(diào)用無參構造函數(shù),如果父類沒有無參構造函數(shù),那么子類中就必須顯示的調(diào)用super關鍵字來調(diào)用已有的有參構造函數(shù)來初始化父類。
public class Parent {
public String name = "小頭爸爸";
public Parent(int age) {
}
public void sleeping(){
System.out.println("爸爸已經(jīng)睡了");
}
}
public class Child extends Parent {
public String name = "大頭兒子";
public Child() {//如果沒有super來初始化父類,同樣也會報錯
// super();//編譯期報錯,因為父類并沒有無參構造函數(shù)
super(15);//正確打開方式
}
private void printParentName(){
System.out.println("爸爸的名字叫" + super.name);
}
private void parentStatus(){
super.sleeping();
}
}子類中的super為什么必須要放在第一行?因為子類的實例化依賴于父類的實例化,在構建子類時,必須要有父類實例,只能有了父類的實例,子類才能夠初始化自己。就好像人類世界里,都是要先有父親,再有孩子一樣。
附:super實際使用示例
下面來看看super關鍵字的實際用法。 在這里,Emp類繼承了Person類,所以Person的所有屬性都將默認繼承到Emp。 要初始化所有的屬性,可使用子類的父類構造函數(shù)。 這樣,我們重用了父類的構造函數(shù)。
class Person {
? ? int id;
? ? String name;
? ? Person(int id, String name) {
? ? ? ? this.id = id;
? ? ? ? this.name = name;
? ? }
}
class Emp extends Person {
? ? float salary;
? ? Emp(int id, String name, float salary) {
? ? ? ? super(id, name);// reusing parent constructor
? ? ? ? this.salary = salary;
? ? }
? ? void display() {
? ? ? ? System.out.println(id + " " + name + " " + salary);
? ? }
}
class TestSuper5 {
? ? public static void main(String[] args) {
? ? ? ? Emp e1 = new Emp(1, "ankit", 45000f);
? ? ? ? e1.display();
? ? }
}結果如下:
1 ankit 45000
總結
super關鍵字指代父類對象,主要用于在子類中指定父類的方法和屬性,也用于在子類中初始化父類。子類的靜態(tài)方法中不能使用super關鍵字。
到此這篇關于Java基礎之super關鍵字的文章就介紹到這了,更多相關Java super關鍵字內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
解決 Spring RestTemplate post傳遞參數(shù)時報錯問題
本文詳解說明了RestTemplate post傳遞參數(shù)時報錯的問題及其原由,需要的朋友可以參考下2020-02-02
Java創(chuàng)建多線程的幾種方式實現(xiàn)
這篇文章主要介紹了Java創(chuàng)建多線程的幾種方式實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-10-10
Java實現(xiàn)Excel百萬級數(shù)據(jù)導入功能的示例代碼
這篇文章主要為大家詳細介紹了Java如何實現(xiàn)Excel百萬級數(shù)據(jù)導入功能,文中的示例代碼講解詳細,具有一定的借鑒價值,有需要的小伙伴可以參考下2024-04-04
Java基于遞歸和循環(huán)兩種方式實現(xiàn)未知維度集合的笛卡爾積算法示例
這篇文章主要介紹了Java基于遞歸和循環(huán)兩種方式實現(xiàn)未知維度集合的笛卡爾積算法,結合實例形式分析了Java使用遞歸與循環(huán)兩種方式實現(xiàn)未知維度集合的笛卡爾積相關概念、原理與操作技巧,需要的朋友可以參考下2017-12-12
openFeign服務之間調(diào)用保持請求頭信息處理方式
這篇文章主要介紹了openFeign服務之間調(diào)用保持請求頭信息處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06

