本章節(jié)目標(biāo):
掌握super都可以用在哪里?理解super在內(nèi)存方面的存儲(chǔ)位置。掌握怎么通過子類的構(gòu)造方法調(diào)用父類的構(gòu)造方法。super什么時(shí)候可以省略,什么時(shí)候不能省略?
● this是一個(gè)引用,保存內(nèi)存地址指向自己。
● this出現(xiàn)在實(shí)例方法中,誰調(diào)用這個(gè)實(shí)例方法,this就代表誰,this代表當(dāng)前正在執(zhí)行這個(gè)動(dòng)作的對象。
● this不能出現(xiàn)在靜態(tài)方法中。
● this大部分情況下可以省略,在方法中區(qū)分實(shí)例變量和局部變量的時(shí)候不能省略。
●“this(實(shí)際參數(shù)列表)”出現(xiàn)在構(gòu)造方法第一行,通過當(dāng)前的構(gòu)造方法去調(diào)用本類當(dāng)中其它的構(gòu)造方法。
嚴(yán)格來說,super其實(shí)并不是一個(gè)引用,它只是一個(gè)關(guān)鍵字,super代表了當(dāng)前對象中從父類繼承過來的那部分特征。this指向一個(gè)獨(dú)立的對象,super并不是指向某個(gè)“獨(dú)立”的對象,假設(shè)張大明是父親,張小明是兒子,有這樣一句話:大家都說張小明的眼睛、鼻子和父親的很像。那么也就是說兒子繼承了父親的眼睛和鼻子特征,那么眼睛和鼻子肯定最終還是長在兒子的身上。假設(shè)this指向張小明,那么super就代表張小明身上的眼睛和鼻子。換句話說super其實(shí)是this的一部分。如下圖所示:張大明和張小明其實(shí)是兩個(gè)獨(dú)立的對象,兩個(gè)對象內(nèi)存方面沒有聯(lián)系,super只是代表張小明對象身上的眼睛和鼻子,因?yàn)檫@個(gè)是從父類中繼承過來的,在內(nèi)存方面使用了super關(guān)鍵字進(jìn)行了標(biāo)記,對于下圖來說“this.眼睛”和“super.眼睛”都是訪問的同一塊內(nèi)存空間。
圖14-1:super內(nèi)存圖
● super和this都可以使用在實(shí)例方法當(dāng)中。
● super不能使用在靜態(tài)方法當(dāng)中,因?yàn)閟uper代表了當(dāng)前對象上的父類型特征,靜態(tài)方法中沒有this,肯定也是不能使用super的。
● super也有這種用法:“super(實(shí)際參數(shù)列表);”,這種用法是通過當(dāng)前的構(gòu)造方法調(diào)用父類的構(gòu)造方法。
接下來,我們來測試一下:
public class SuperTest01 extends Object{
//實(shí)例方法
public void doSome(){
System.out.println(this);
System.out.println(super);
}
}
編譯報(bào)錯(cuò)了:
圖14-2:this可以單獨(dú)輸出,super不能
通過以上的測試,可以看出this是可以單獨(dú)使用的引用,但super無法輸出,編譯器提示super要使用必須是“super.xxx”,顯然super并不指向獨(dú)立的對象,并不是保存某個(gè)對象的內(nèi)存地址。
再來看另外的一個(gè)測試:
public class SuperTest02 extends Object{
//靜態(tài)方法
public static void doSome(){
System.out.println(this);
System.out.println(super.toString());
}
}
編譯報(bào)錯(cuò)了:
圖14-3:this和super都不能使用在靜態(tài)方法中
通過以上的測試,可以看出this和super都是無法使用在靜態(tài)方法當(dāng)中的。