Java中super關(guān)鍵字介紹以及super()的使用
1、super的使用:
(1)super是一個關(guān)鍵字。
(2)super和this很類似,我們對比著學習。
2、先復習一下this關(guān)鍵字的使用。
(1)this能出現(xiàn)在實例方法和構(gòu)造方法中;
(2)this的語法是“this.”和“this()”;
(3)this不能出現(xiàn)在靜態(tài)方法中;
(4)this大部分情況下是可以省略的;
(5)this.什么時候不能省略呢?
在區(qū)分局部變量和實例變量時不能省略。例如:
Public void setName(String name){
this.name = name;
}
(6)this()只能出現(xiàn)在構(gòu)造方法的第一行,通過當前的構(gòu)造方法去調(diào)用“本類”中的對應的構(gòu)造方法,目的是:代碼復用。
3、super關(guān)鍵字:
(1)super能出現(xiàn)在實例方法和構(gòu)造方法中。
(2)super的語法是“super.”和“super()”。
(3) super不能出現(xiàn)在靜態(tài)方法中。
(4) super大部分情況下是可以省略的。
(5)super.什么時候不能省略呢?
別急,我們想一下this指向的是什么,是當前對象自己。super和this類似,它指向了當前對象自己的父類型特征(也就是繼承過來的那些東西)。
super和this區(qū)別是:this可以看做一個引用變量,保存了該對象的地址,是當前對象整體,而super代表的是父類型特征,是子類局部的一些東西,這些繼承過來的東西已經(jīng)在子類里面了,你可以輸出整體this,但不能輸出父類型特征super。因為super指向的東西不是一個整體,沒法打印輸出。
System.out.println(this); //輸出this.toString()的值 System.out.println(super); //編譯報錯,需要'.'
當在子類對象中,子類想訪問父類的東西,可以使用“super.”的方式訪問。例如:方法覆蓋后,子類內(nèi)部雖然重寫了父類的方法,但子類也想使用一下父類的被覆蓋的方法,此時可以使用“super.”的方式。當子類中出現(xiàn)和父類一樣的屬性或者方法,此時,你要想去調(diào)用父類的那個屬性或者方法,此時“super.”不能省略。
this和super都只能在對象內(nèi)部使用。
this代表當前對象本身,super代表當前對象的父類型特征。
總結(jié):“this.”是一個實例對象內(nèi)部為了區(qū)分實例變量和局部變量。
而“super.”是一個實例對象為了區(qū)分是子類的成員還是父類的成員。
父類有,子類也有,子類想訪問父類的,“super.”不能省略。**
(6)super()只能出現(xiàn)在構(gòu)造方法的第一行,通過當前的構(gòu)造方法去調(diào)用“父類”中的對應的構(gòu)造方法,目的是:創(chuàng)建子類對象時,先初始化父類型特征。
用通俗的話來講,要想有兒子,得先有父親。
我們來看下面代碼:
寫兩個類,Animal和Cat,Cat繼承Animal。
//父類,Animal類
class Animal {
//構(gòu)造函數(shù)
public Animal() {
System.out.println("Animal類的無參數(shù)構(gòu)造函數(shù)執(zhí)行");
}
}
???????//子類,Cat類
class Cat extends Animal{
//構(gòu)造函數(shù)
public Cat() {
System.out.println("Cat類的無參數(shù)構(gòu)造函數(shù)執(zhí)行");
}
}
執(zhí)行下面一行代碼:
Cat c1 = new Cat();
運行輸出結(jié)果為:
Animal類的無參數(shù)構(gòu)造函數(shù)執(zhí)行
Cat類的無參數(shù)構(gòu)造函數(shù)執(zhí)行
我們發(fā)現(xiàn)實例化一個子類的對象,也就是調(diào)用了子類的構(gòu)造方法,為什么父類的無參數(shù)構(gòu)造方法也執(zhí)行了,并在子類構(gòu)造方法執(zhí)行之前就已經(jīng)執(zhí)行了父類的無參數(shù)構(gòu)造方法,好奇怪。
剛剛在上面的super關(guān)鍵字的使用第6點,我已經(jīng)說了,super()和this()方法一樣,都只能在構(gòu)造方法的第一行出現(xiàn)。我們猜想,難道子類的構(gòu)造方法第一行有一個隱形的super()方法?答案是肯定的。
我們把子類的構(gòu)造方法的第一行給它加上super():
//子類,Cat類
class Cat extends Animal{
//構(gòu)造函數(shù)
public Cat() {
super();
System.out.println("Cat類的無參數(shù)構(gòu)造函數(shù)執(zhí)行");
}
}
再執(zhí)行下面代碼:
Cat c1 = new Cat();
運行輸出結(jié)果為:
Animal類的無參數(shù)構(gòu)造函數(shù)執(zhí)行
Cat類的無參數(shù)構(gòu)造函數(shù)執(zhí)行
和剛才的子類構(gòu)造方法沒加super()是一樣的。
所以說當子類的構(gòu)造方法內(nèi)第一行沒有出現(xiàn)“super()”時,系統(tǒng)會默認給它加上無參數(shù)的"super()"方法。
閱讀仔細的人會發(fā)現(xiàn),為什么是沒有“this()和super()”就寫上“super()”?有“this()”就不能寫上“super()”嗎?那我問你,當構(gòu)造方法第一行有"this()"時,你還能手動添加“super()”嗎?顯然不行,因為“this()”也只能出現(xiàn)在第一行,你不能在它前面寫任何代碼。所以我們又得出一個結(jié)論:構(gòu)造方法中“this()”和“super()”不能同時出現(xiàn),也就是“this()”和“super()”都只能出現(xiàn)在構(gòu)造方法的第一行。
上面談的都是無參數(shù)的“super”方法,我們也可以在構(gòu)造方法的第一行使用有參數(shù)的“super(父類構(gòu)造函數(shù)的參數(shù)列表)”,但值得注意的是,當子類構(gòu)造方法執(zhí)行有參數(shù)的“super(參數(shù)列表)”方法,你得確保父類中也有對應的有參數(shù)構(gòu)造方法,不然會編譯報錯。同樣我要提醒一下,當子類構(gòu)造方法的第一行執(zhí)行super()無參數(shù)方法,那么父類中一定要有無參數(shù)構(gòu)造方法,有的人可能會在父類中寫了有參數(shù)的構(gòu)造方法,卻忽略了寫無參數(shù)構(gòu)造方法,那么在子類構(gòu)造方法內(nèi)就會報錯,因為當你在一個類中寫了有參數(shù)的構(gòu)造方法時,無參數(shù)構(gòu)造方法就會不存在,你需要自己補上無參數(shù)的構(gòu)造方法,這是一個良好的編程習慣。
無論你子類構(gòu)造方法有沒有“this()”和“super()”方法,實例化子類對象一定一定會執(zhí)行對應的父類構(gòu)造方法,即不管實例化了一個怎樣的孩子,它一定會先實例化一個對應的父親。
下面給道例題練習一下this()和super()方法:
public class MyTest {
public static void main(String[] args) {
new Cat();
}
}
//父類,Animal類
class Animal {
//構(gòu)造函數(shù)
public Animal() {
super();
System.out.println("1:Animal類的無參數(shù)構(gòu)造函數(shù)執(zhí)行");
}
public Animal(int i) {
super();
System.out.println("2:Animal類的有int參數(shù)構(gòu)造函數(shù)執(zhí)行");
}
}
//子類,Cat類
class Cat extends Animal{
//構(gòu)造函數(shù)
public Cat() {
this("");
System.out.println("3:Cat類的無參數(shù)構(gòu)造函數(shù)執(zhí)行");
}
public Cat(String str) {
super(5);
System.out.println("4:Cat類的有String參數(shù)構(gòu)造函數(shù)執(zhí)行");
}
}
輸出結(jié)果為:
2:Animal類的有int參數(shù)構(gòu)造函數(shù)執(zhí)行
4:Cat類的有String參數(shù)構(gòu)造函數(shù)執(zhí)行
3:Cat類的無參數(shù)構(gòu)造函數(shù)執(zhí)行
我們又可以得出一個結(jié)論:不管你創(chuàng)建什么對象,Object對象的無參數(shù)構(gòu)造方法一定會先執(zhí)行,因為Object是所有類的根類。
說了這么多,super()到底什么時候使用?來看下面代碼:
public class MyTest {
public static void main(String[] args) {
Cat c1 = new Cat(3);
System.out.println("名字:" + c1.getName() + ",年齡:" + c1.getAge());
}
}
//父類,Animal類
class Animal {
//私有屬性:名字
private String name;
//setter and getter
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
//構(gòu)造函數(shù)
public Animal() {
}
public Animal(String name) {
this.name = name;
}
}
//子類,Cat類
class Cat extends Animal{
//私有字段:年齡
private int age;
//setter and getter
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
//構(gòu)造函數(shù)
public Cat() {
}
public Cat(int age) {
this.age = age;
}
}
輸出結(jié)果:名字:null,年齡:3
我們也知道,沒有給c1的name賦值嘛,當然為默認值null啦。
確實如此,所以我們給Cat加一個構(gòu)造方法,給name和age都賦值。
如下:
public Cat(String name, int age) {
this.name = name; //報錯
this.age = age
}
顯然這樣做是會報錯的,因為name已經(jīng)被父類封裝成private的了,不能直接訪問,可能有的人會這樣做:
public Cat(String name, int age) {
setName(name);
this.age = age;
}
顯然這樣做的確可以做到給父類的name賦值,但這樣做是不建議的,我們在構(gòu)造方法中通常只調(diào)用構(gòu)造方法,不會去調(diào)用實例方法,況且當不止一個變量時,用set方法時,我們就要調(diào)用好多個實例方法去完成多個變量的賦值。這時候為什么不考慮使用super()方法呢?如下:
public Cat(String name, int age) {
super(name);
this.age = age;
}
這樣就顯得文雅,美觀多了。
總結(jié):
1、this和super一樣,都是對象內(nèi)部的引用變量,只能出現(xiàn)在對象內(nèi)部;
2、 this指向當前對象自己,super指向當前對象的父類型特征,故this的東西比super多,也就是super是this的一部分;
3、 this()和super()都只能出現(xiàn)在構(gòu)造方法的第一行,故this()和super()方法不能共存,當一個類的構(gòu)造方法第一行中沒有this(),也沒有super(),系統(tǒng)默認有super()方法;
4、this()是構(gòu)造方法中調(diào)用本類其他的構(gòu)造方法,super()是當前對象構(gòu)造方法中去調(diào)用自己父類的構(gòu)造方法。
到此這篇關(guān)于Java中super關(guān)鍵字介紹以及super()使用的文章就介紹到這了,更多相關(guān)Java super關(guān)鍵字使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
舉例講解Java設(shè)計模式編程中Decorator裝飾者模式的運用
這篇文章主要介紹了Java設(shè)計模式編程中Decorator裝飾者模式的運用,裝飾者模式就是給一個對象動態(tài)的添加新的功能,裝飾者和被裝飾者實現(xiàn)同一個接口,裝飾者持有被裝飾者的實例,需要的朋友可以參考下2016-05-05
Mybatis-Plus中分頁插件PaginationInterceptor的使用
我們在開發(fā)的過程中,經(jīng)常會遇到分頁操作,本文主要介紹了Mybatis-Plus中分頁插件PaginationInterceptor的使用,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧2023-06-06
優(yōu)化Java內(nèi)存管理來防止“GC”錯誤的方法詳解
垃圾回收(GC)是 Java 中的一個重要機制,它可以管理內(nèi)存并回收不再使用的對象所占用的資源,在本文中,我們將探討一些技巧,幫助您避免這一錯誤,確保您的 Java 應用程序順利運行,需要的朋友可以參考下2023-11-11
詳解Spring依賴注入:@Autowired,@Resource和@Inject區(qū)別與實現(xiàn)原理
這篇文章主要介紹了詳解Spring依賴注入:@Autowired,@Resource和@Inject區(qū)別與實現(xiàn)原理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-06-06
SpringCloud OpenFeign 參數(shù)傳遞和響應處理的詳細步驟
本文給大家講解SpringCloud OpenFeign 參數(shù)傳遞和響應處理的詳細步驟,本文給大家講解的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2024-02-02
詳解Java并發(fā)包中線程池ThreadPoolExecutor
ThreadPoolExecutor是Java語言對于線程池的實現(xiàn)。線程池技術(shù)使線程在使用完畢后不回收而是重復利用。如果線程能夠復用,那么我們就可以使用固定數(shù)量的線程來解決并發(fā)問題,這樣一來不僅節(jié)約了系統(tǒng)資源,而且也會減少線程上下文切換的開銷2021-06-06

