super和this都可以使用在實(shí)例方法中,并且都不能使用在靜態(tài)方法當(dāng)中,“this”大部分情況下都是可以省略的,只有在方法中區(qū)分局部變量和實(shí)例變量的時(shí)候不能省略。那“super”什么時(shí)候可以省略,什么時(shí)候不能省略呢?
//書
public class Book {
//書名
String name;
//構(gòu)造方法
public Book(){
super();
}
public Book(String name){
super();
this.name = name;
}
}
//紙質(zhì)書
public class PaperBook extends Book {
//構(gòu)造方法
public PaperBook(){
super();
}
public PaperBook(String name){
super();
this.name = name;
}
//打印書名
public void printName(){
System.out.println("this.name->書名 : " + this.name);
System.out.println("super.name->書名 : " + super.name);
}
}
public class BookTest {
public static void main(String[] args) {
PaperBook book1 = new PaperBook("零基礎(chǔ)學(xué)Java卷I");
book1.printName();
}
}

圖14-11:super和this
我們發(fā)現(xiàn)printName()方法中的super.name和this.name最終輸出結(jié)果是一樣的,這是為什么呢?請(qǐng)看以上程序執(zhí)行的內(nèi)存圖:

圖14-12:父類的構(gòu)造方法執(zhí)行結(jié)束之后的內(nèi)存圖

圖14-13:子類的構(gòu)造方法執(zhí)行結(jié)束之后的內(nèi)存圖
通過(guò)以上內(nèi)存結(jié)構(gòu)圖發(fā)現(xiàn)this.name和super.name實(shí)際上是同一塊內(nèi)存空間,所以它們的輸出結(jié)果是完全一樣的。接下來(lái),我們?cè)侔岩陨系腜aperBook類修改一下:
//紙質(zhì)書
public class PaperBook extends Book {
String name; //在子類中也定義了一個(gè)name屬性
//構(gòu)造方法
public PaperBook(){
super();
}
public PaperBook(String name){
super();
this.name = name;//這里的this.name代表子類的name
}
//打印書名
public void printName(){
System.out.println("this.name->書名 : " + this.name);
System.out.println("super.name->書名 : " + super.name);
}
}

圖14-14:super和this的區(qū)別
為什么super.name是null呢,我們一起來(lái)看看以上程序的內(nèi)存圖:

圖14-15:父類Book的構(gòu)造方法執(zhí)行之后的內(nèi)存圖

圖14-16:子類PaperBook的構(gòu)造方法執(zhí)行結(jié)束之后的內(nèi)存圖
通過(guò)以上內(nèi)存圖可以清楚的看到,父類Book的構(gòu)造方法在執(zhí)行的時(shí)候給super.name賦值null,子類PaperBook的構(gòu)造方法在執(zhí)行的時(shí)候給this.name賦值“零基礎(chǔ)學(xué)Java卷I”,由于在子類PaperBook中定義了重名的變量name導(dǎo)致在當(dāng)前對(duì)象中有兩個(gè)name,一個(gè)是從父類中繼承過(guò)來(lái)的,一個(gè)是自己的,如果此時(shí)想訪問父類中繼承過(guò)來(lái)的name則必須使用super.name,當(dāng)直接訪問name或者this.name都表示訪問當(dāng)前對(duì)象自己的name。
通過(guò)以上的學(xué)習(xí),大家知道super在什么情況下不能省略了嗎?當(dāng)父類中有該實(shí)例變量,子類中又重新定義了同名的實(shí)例變量,如果想在子類中訪問父類的實(shí)例變量,super不能省略。實(shí)例方法是這樣嗎?我們可以來(lái)測(cè)試一下,請(qǐng)看代碼:
public class Vip {
//Vip默認(rèn)繼承Object
//重寫從Object類中繼承過(guò)來(lái)的toString()方法
public String toString(){
return "我是金牌會(huì)員";
}
public void test(){
System.out.println(super.toString());
System.out.println(this.toString());
System.out.println(toString());
}
}
public class VipTest {
public static void main(String[] args) {
Vip vip = new Vip();
vip.test();
}
}

圖14-17:運(yùn)行結(jié)果
通過(guò)以上測(cè)試得出最終結(jié)論:父類和子類中有同名實(shí)例變量或者有同名的實(shí)例方法,想在子類中訪問父類中的實(shí)例變量或?qū)嵗椒ǎ瑒tsuper是不能省略的,其它情況都可以省略。