第3章 super關(guān)鍵字
3.1 子父類中構(gòu)造方法的調(diào)用
在創(chuàng)建子類對(duì)象時(shí),父類的構(gòu)造方法會(huì)先執(zhí)行百框,因?yàn)樽宇愔兴袠?gòu)造方法的第一行有默認(rèn)的隱式super();語(yǔ)句霎箍。
格式:
調(diào)用本類中的構(gòu)造方法
this(實(shí)參列表);
調(diào)用父類中的空參數(shù)構(gòu)造方法
super();
調(diào)用父類中的有參數(shù)構(gòu)造方法
super(實(shí)參列表);
為什么子類對(duì)象創(chuàng)建都要訪問(wèn)父類中的構(gòu)造方法?因?yàn)樽宇惱^承了父類的內(nèi)容碘赖,所以創(chuàng)建對(duì)象時(shí)安岂,必須要先看父類是如何對(duì)其內(nèi)容進(jìn)行初始化的轻猖,看如下程序:
public class Test {
public static void main(String[] args) {
new Zi();
}
}
class Fu{
int num ;
Fu(){
System.out.println("Fu構(gòu)造方法"+num);
num = 4;
}
}
class Zi extends Fu{
Zi(){
//super(); 調(diào)用父類空參數(shù)構(gòu)造方法
System.out.println("Zi構(gòu)造方法"+num);
}
}
執(zhí)行結(jié)果:
Fu構(gòu)造方法0
Zi構(gòu)造方法4
通過(guò)結(jié)果發(fā)現(xiàn),子類構(gòu)造方法執(zhí)行時(shí)中域那,調(diào)用了父類構(gòu)造方法咙边,這說(shuō)明,子類構(gòu)造方法中有一句super()次员。
那么败许,子類中的構(gòu)造方法為什么會(huì)有一句隱式的super()呢?
原因:子類會(huì)繼承父類中的內(nèi)容淑蔚,所以子類在初始化時(shí)市殷,必須先到父類中去執(zhí)行父類的初始化動(dòng)作。這樣刹衫,才可以使用父類中的內(nèi)容醋寝。
當(dāng)父類中沒有空參數(shù)構(gòu)造方法時(shí)搞挣,子類的構(gòu)造方法必須有顯示的super語(yǔ)句,指定要訪問(wèn)的父類有參數(shù)構(gòu)造方法甥桂。
3.2 子類對(duì)象創(chuàng)建過(guò)程的細(xì)節(jié)
如果子類的構(gòu)造方法第一行寫了this調(diào)用了本類其他構(gòu)造方法柿究,那么super調(diào)用父類的語(yǔ)句還有嗎?
這時(shí)是沒有的黄选,因?yàn)閠his()或者super(),只能定義在構(gòu)造方法的第一行,因?yàn)槌跏蓟瘎?dòng)作要先執(zhí)行婶肩。
父類構(gòu)造方法中是否有隱式的super呢办陷?
也是有的。記茁杉摺:只要是構(gòu)造方法默認(rèn)第一行都是super();
父類的父類是誰(shuí)呢民镜?super調(diào)用的到底是誰(shuí)的構(gòu)造方法呢?
Java體系在設(shè)計(jì)险毁,定義了一個(gè)所有對(duì)象的父類Object
? 注意:
類中的構(gòu)造方法默認(rèn)第一行都有隱式的super()語(yǔ)句制圈,在訪問(wèn)父類中的空參數(shù)構(gòu)造方法。所以父類的構(gòu)造方法既可以給自己的對(duì)象初始化畔况,也可以給自己的子類對(duì)象初始化鲸鹦。
如果默認(rèn)的隱式super()語(yǔ)句在父類中沒有對(duì)應(yīng)的構(gòu)造方法,那么必須在構(gòu)造方法中通過(guò)this或者super的形式明確要調(diào)用的構(gòu)造方法跷跪。
3.3 super應(yīng)用
練習(xí):描述學(xué)生和工人這兩個(gè)類馋嗜,將他們的共性name和age抽取出來(lái)存放在父類中,并提供相應(yīng)的get和set方法吵瞻,同時(shí)需要在創(chuàng)建學(xué)生和工人對(duì)象就必須明確姓名和年齡
//定義Person類葛菇,將Student和Worker共性抽取出來(lái)
class Person {
private String name;
private int age;
public Person(String name, int age) {
// super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
class Student extends Person {
// Student類的構(gòu)造方法
Student(String name, int age) {
// 使用super關(guān)鍵字調(diào)用父類構(gòu)造方法,進(jìn)行相應(yīng)的初始化動(dòng)作
super(name, age);
}
public void study() {// Studnet中特有的方法
System.out.println(this.getName() + "同學(xué)在學(xué)習(xí)");
}
}
class Worker extends Person {
Worker(String name, int age) {
// 使用super關(guān)鍵字調(diào)用父類構(gòu)造方法橡羞,進(jìn)行相應(yīng)的初始化動(dòng)作
super(name, age);
}
public void work() {// Worker 中特有的方法
System.out.println(this.getName() + "工人在工作");
}
}
public class Test {
public static void main(String[] args) {
Student stu = new Student("小明",23);
stu.study();
Worker w = new Worker("小李",45);
w.work();
}
}