由于子類不能繼承父類的構(gòu)造方法,因此,如果要調(diào)用父類的構(gòu)造方法,可以使用 super 關(guān)鍵字。super 可以用來訪問父類的構(gòu)造方法、普通方法和屬性。
super 關(guān)鍵字的功能:
在子類的構(gòu)造方法中顯式的調(diào)用父類構(gòu)造方法
訪問父類的成員方法和變量。
super調(diào)用父類構(gòu)造方法
super 關(guān)鍵字可以在子類的構(gòu)造方法中顯式地調(diào)用父類的構(gòu)造方法,基本格式如下:
super(parameter-list);
其中,parameter-list 指定了父類構(gòu)造方法中的所 有參數(shù)。super( ) 必 須是在子類構(gòu)造方法的方法體的第 一行。
例1
聲明父類 Person 和子類 Student,在 Person 類中定義一個帶有參數(shù)的構(gòu)造方法,代碼如下:
public class Person {
public Person(String name) {
}
}
public class Student extends Person {
}
會發(fā)現(xiàn) Student 類出現(xiàn)編譯錯誤,提示必 須顯式定義構(gòu)造方法,錯誤信息如下:
Implicit super constructor Person() is undefined for default constructor. Must define an explicit constructor
在本例中 JVM 默認(rèn)給 Student 類加了一個無參構(gòu)造方法,而在這個方法中默認(rèn)調(diào)用了 super(),但是 Person 類中并不存在該構(gòu)造方法,所以會編譯錯誤。
如果一個類中沒有寫任何的構(gòu)造方法,JVM 會生成一個默認(rèn)的無參構(gòu)造方法。在繼承關(guān)系中,由于在子類的構(gòu)造方法中,第 一條語句默認(rèn)為調(diào)用父類的無參構(gòu)造方法(即默認(rèn)為 super(),一般這行代碼省略了)。所以當(dāng)在父類中定義了有參構(gòu)造方法,但是沒有定義無參構(gòu)造方法時,編譯器會強制要求我們定義一個相同參數(shù)類型的構(gòu)造方法。
例2
聲明父類 Person,類中定義兩個構(gòu)造方法。示例代碼如下:
public class Person {
public Person(String name, int age) {
}
public Person(String name, int age, String sex) {
}
}
子類 Student 繼承了 Person 類,使用 super 語句來定義 Student 類的構(gòu)造方法。示例代碼如下:
public class Student extends Person {
public Student(String name, int age, String birth) {
super(name, age); // 調(diào)用父類中含有2個參數(shù)的構(gòu)造方法
}
填寫下面表單即可預(yù)約申請免費試聽java課程!害怕學(xué)不會?助教陪讀,隨時解惑!擔(dān)心就業(yè)?一地學(xué)習(xí),可全國推薦就業(yè)!
public Student(String name, int age, String sex, String birth) {
super(name, age, sex); // 調(diào)用父類中含有3個參數(shù)的構(gòu)造方法
}
}
從上述 Student 類構(gòu)造方法代碼可以看出,super 可以用來直接調(diào)用父類中的構(gòu)造方法,使編寫代碼也更加簡潔方便。
編譯器會自動在子類構(gòu)造方法的第 一句加上super();來調(diào)用父類的無參構(gòu)造方法,必 須寫在子類構(gòu)造方法的第 一句,也可以省略不寫。通過 super 來調(diào)用父類其它構(gòu)造方法時,只需要把相應(yīng)的參數(shù)傳過去。
super訪問父類成員
當(dāng)子類的成員變量或方法與父類同名時,可以使用 super 關(guān)鍵字來訪問。如果子類重寫了父類的某一個方法,即子類和父類有相同的方法定義,但是有不同的方法體,此時,我們可以通過 super 來調(diào)用父類里面的這個方法。
使用 super 訪問父類中的成員與 this 關(guān)鍵字的使用相似,只不過它引用的是子類的父類,語法格式如下:
super.member
其中,member 是父類中的屬性或方法。使用 super 訪問父類的屬性和方法時不用位于第 一行。
super調(diào)用成員屬性
當(dāng)父類和子類具有相同的數(shù)據(jù)成員時,JVM 可能會模糊不清。我們可以使用以下代碼片段更清楚地理解它。
class Person {
int age = 12;
}
class Student extends Person {
int age = 18;
void display() {
System.out.println("學(xué)生年齡:" + super.age);
}
}
class Test {
public static void main(String[] args) {
Student stu = new Student();
stu.display();
}
}
輸出結(jié)果為:
學(xué)生年齡:12
在上面的例子中,父類和子類都有一個成員變量 age。我們可以使用 super 關(guān)鍵字訪問 Person 類中的 age 變量。
super調(diào)用成員方法
當(dāng)父類和子類都具有相同的方法名時,可以使用 super 關(guān)鍵字訪問父類的方法。具體如下代碼所示。
class Person {
void message() {
System.out.println("This is person class");
}
}
class Student extends Person {
void message() {
System.out.println("This is student class");
}
void display() {
message();
super.message();
}
}
class Test {
public static void main(String args[]) {
Student s = new Student();
s.display();
}
}
輸出結(jié)果為:
This is student class
This is person class
在上面的例子中,可以看到如果只調(diào)用方法 message( ),是當(dāng)前的類 message( ) 被調(diào)用,使用 super 關(guān)鍵字時,是父類的 message( ) 被調(diào)用。
super和this的區(qū)別
this 指的是當(dāng)前對象的引用,super 是當(dāng)前對象的父對象的引用。下面先簡單介紹一下 super 和 this 關(guān)鍵字的用法。
super 關(guān)鍵字的用法:
super.父類屬性名:調(diào)用父類中的屬性
super.父類方法名:調(diào)用父類中的方法
super():調(diào)用父類的無參構(gòu)造方法
super(參數(shù)):調(diào)用父類的有參構(gòu)造方法
如果構(gòu)造方法的第 一行代碼不是 this() 和 super(),則系統(tǒng)會默認(rèn)添加 super()。
this 關(guān)鍵字的用法:
this.屬性名:表示當(dāng)前對象的屬性
this.方法名(參數(shù)):表示調(diào)用當(dāng)前對象的方法
當(dāng)局部變量和成員變量發(fā)生沖突時,使用this.進(jìn)行區(qū)分。
關(guān)于 Java super 和 this 關(guān)鍵字的異同,可簡單總結(jié)為以下幾條。
子類和父類中變量或方法名稱相同時,用 super 關(guān)鍵字來訪問?梢岳斫鉃 super 是指向自己父類對象的一個指針。在子類中調(diào)用父類的構(gòu)造方法。
this 是自身的一個對象,代表對象本身,可以理解為 this 是指向?qū)ο蟊旧淼囊粋指針。在同一個類中調(diào)用其它方法。
this 和 super 不能同時出現(xiàn)在一個構(gòu)造方法里面,因為 this 必 然會調(diào)用其它的構(gòu)造方法,其它的構(gòu)造方法中肯定會有 super 語句的存在,所以在同一個構(gòu)造方法里面有相同的語句,就失去了語句的意義,編譯器也不會通過。
this( ) 和 super( ) 都指的是對象,所以,均不可以在 static 環(huán)境中使用,包括 static 變量、static 方法和 static 語句塊。
從本質(zhì)上講,this 是一個指向?qū)ο蟊旧淼闹羔? 然而 super 是一個 Java 關(guān)鍵字。
例 3
在 Animal 類和 Cat 類中分別定義了 public 類型的 name 屬性和 private 類型的 name 屬性,并且 Cat 類繼承 Animal 類。那么,我們可以在 Cat 類中通過 super 關(guān)鍵字來訪問父類 Animal 中的 name 屬性,通過 this 關(guān)鍵字來訪問本類中的 name 屬性,如下面的代碼:
// 父類Animal的定義
public class Animal {
public String name; // 動物名字
}
//子類Cat的定義
public class Cat extends Animal {
private String name; // 名字
public Cat(String aname, String dname) {
super.name = aname; // 通過super關(guān)鍵字來訪問父類中的name屬性
this.name = dname; // 通過this關(guān)鍵字來訪問本類中的name屬性
}
public String toString() {
return "我是" + super.name + ",我的名字叫" + this.name;
}
public static void main(String[] args) {
Animal cat = new Cat("動物", "喵星人");
System.out.println(cat);
}
}
上述代碼演示了使用 super 關(guān)鍵字訪問父類中與子類同名的成員變量 name,this 關(guān)鍵字訪問本類的 name 變量。運行程序,輸出結(jié)果如下:
我是動物,我的名字叫喵星人
上一篇:Java封裝圖書信息類
下一篇: 沒有了
初級會計職稱中級會計職稱經(jīng)濟(jì)師注冊會計師證券從業(yè)銀行從業(yè)會計實操統(tǒng)計師審計師高級會計師基金從業(yè)資格稅務(wù)師資產(chǎn)評估師國際內(nèi)審師ACCA/CAT價格鑒證師統(tǒng)計資格從業(yè)
一級建造師二級建造師消防工程師造價工程師土建職稱房地產(chǎn)經(jīng)紀(jì)人公路檢測工程師建筑八大員注冊建筑師二級造價師監(jiān)理工程師咨詢工程師房地產(chǎn)估價師 城鄉(xiāng)規(guī)劃師結(jié)構(gòu)工程師巖土工程師安全工程師設(shè)備監(jiān)理師環(huán)境影響評價土地登記代理公路造價師公路監(jiān)理師化工工程師暖通工程師給排水工程師計量工程師
人力資源考試教師資格考試出版專業(yè)資格健康管理師導(dǎo)游考試社會工作者司法考試職稱計算機營養(yǎng)師心理咨詢師育嬰師事業(yè)單位教師招聘公務(wù)員公選考試招警考試選調(diào)生村官
執(zhí)業(yè)藥師執(zhí)業(yè)醫(yī)師衛(wèi)生資格考試衛(wèi)生高級職稱護(hù)士資格證初級護(hù)師主管護(hù)師住院醫(yī)師臨床執(zhí)業(yè)醫(yī)師臨床助理醫(yī)師中醫(yī)執(zhí)業(yè)醫(yī)師中醫(yī)助理醫(yī)師中西醫(yī)醫(yī)師中西醫(yī)助理口腔執(zhí)業(yè)醫(yī)師口腔助理醫(yī)師公共衛(wèi)生醫(yī)師公衛(wèi)助理醫(yī)師實踐技能內(nèi)科主治醫(yī)師外科主治醫(yī)師中醫(yī)內(nèi)科主治兒科主治醫(yī)師婦產(chǎn)科醫(yī)師西藥士/師中藥士/師臨床檢驗技師臨床醫(yī)學(xué)理論中醫(yī)理論