大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

Java教程
Java標(biāo)識(shí)符與關(guān)鍵字
Java變量
Java數(shù)據(jù)類型
Java運(yùn)算符
Java控制語句
Java方法

Java中super關(guān)鍵字的使用(在構(gòu)造方法中)

super使用在構(gòu)造方法中,語法格式為:super(實(shí)際參數(shù)列表),這行代碼和“this(實(shí)際參數(shù)列表)”都是只允許出現(xiàn)在構(gòu)造方法第一行(這一點(diǎn)記住就行了),所以這兩行代碼是無法共存的。“super(實(shí)際參數(shù)列表)”這種語法表示子類構(gòu)造方法執(zhí)行過程中調(diào)用父類的構(gòu)造方法。我們來看一段代碼:

public class People {
	String idCard;
	String name;
	boolean sex;
	public People(){
	}
	public People(String idCard,String name,boolean sex){
		this.idCard = idCard;
		this.name = name;
		this.sex = sex;
	}
}
public class Student extends People{
	//學(xué)號(hào)是子類特有的
	int sno;
	public Student(){
		
	}
	public Student(String idCard,String name,boolean sex,int sno){
		this.idCard = idCard;
		this.name = name;
		this.sex = sex;
		this.sno = sno;
	}
}
public class StudentTest {
	public static void main(String[] args) {
		Student s = new Student("12345x","jack",true,100);
		System.out.println("身份證號(hào)" + s.idCard);
		System.out.println("姓名" + s.name);
		System.out.println("性別" + s.sex);
		System.out.println("學(xué)號(hào)" + s.sno);
	}
}
運(yùn)行結(jié)果如下圖所示:

Java培訓(xùn)機(jī)構(gòu)

圖14-4:運(yùn)行結(jié)果

我們把上面的代碼片段拿過來放在一起看看:

父類的構(gòu)造方法:

public People(String idCard,String name,boolean sex){
	this.idCard = idCard;
	this.name = name;
	this.sex = sex;
}

子類的構(gòu)造方法:

public Student(String idCard,String name,boolean sex,int sno){
	this.idCard = idCard;
	this.name = name;
	this.sex = sex;
	this.sno = sno;

你有沒有察覺到子類的構(gòu)造方法前三行代碼和父類構(gòu)造方法中的代碼是一樣的?接下來把子類的構(gòu)造方法修改一下,然后再運(yùn)行測(cè)試程序:

public Student(String idCard,String name,boolean sex,int sno){
		super(idCard,name,sex);
		this.sno = sno;
}
運(yùn)行結(jié)果如下圖所示:

Java培訓(xùn)機(jī)構(gòu)

圖14-5:運(yùn)行結(jié)果

通過以上代碼的學(xué)習(xí),“super(實(shí)際參數(shù)列表);”語法表示調(diào)用父類的構(gòu)造方法,代碼復(fù)用性增強(qiáng)了,另外一方面也是模擬現(xiàn)實(shí)世界當(dāng)中的“要想有兒子,必須先有父親”的道理。不過這里的“super(實(shí)際參數(shù)列表)”在調(diào)用父類構(gòu)造方法的時(shí)候,從本質(zhì)上來說并不是創(chuàng)建一個(gè)“獨(dú)立的父類對(duì)象”,而是為了完成當(dāng)前對(duì)象的父類型特征的初始化操作。(或者說通過子類的構(gòu)造方法調(diào)用父類的構(gòu)造方法,是為了讓張小明身上長(zhǎng)出具有他父親特點(diǎn)的鼻子和眼睛,鼻子和眼睛初始化完畢之后,具有父親的特點(diǎn),但最終還是長(zhǎng)在張小明的身上)。

接下來,再來看一段代碼:

public class A {
	public A(){
		System.out.println("A類的無參數(shù)構(gòu)造方法執(zhí)行");
	}
}
public class B extends A {
	public B(){
		System.out.println("B類的無參數(shù)構(gòu)造方法執(zhí)行");
	}
}
public class C extends B {
	public C(){
		System.out.println("C類的無參數(shù)構(gòu)造方法執(zhí)行");
	}
}
public class Test {
	public static void main(String[] args) {
		new C();
	}
}
運(yùn)行結(jié)果如下圖所示:

Java培訓(xùn)機(jī)構(gòu)

圖14-6:super()的測(cè)試

通過以上運(yùn)行結(jié)果可以得出以下的等效代碼:

public class A {
	public A(){
		//這里調(diào)用的是Object類中的無參數(shù)構(gòu)造方法
		//因?yàn)锳類的父類是Object
		super(); 
		System.out.println("A類的無參數(shù)構(gòu)造方法執(zhí)行");
	}
}
public class B extends A {
	public B(){
		super();
		System.out.println("B類的無參數(shù)構(gòu)造方法執(zhí)行");
	}
}
public class C extends B {
	public C(){
		super();
		System.out.println("C類的無參數(shù)構(gòu)造方法執(zhí)行");
	}
}
運(yùn)行結(jié)果如下圖所示:

圖14-7:super()的測(cè)試

通過以上代碼的測(cè)試我們得出,當(dāng)一個(gè)構(gòu)造方法第一行沒有顯示的調(diào)用“super(實(shí)際參數(shù)列表)”的話,系統(tǒng)默認(rèn)調(diào)用父類的無參數(shù)構(gòu)造方法“super()”。當(dāng)然前提是“this(實(shí)際參數(shù)列表)”也沒有顯示的去調(diào)用(因?yàn)閟uper()和this()都只能出現(xiàn)在構(gòu)造方法第一行,所以不能并存)。我們可以通過以下程序再次測(cè)試一下:

public class A {
//有參數(shù)構(gòu)造方法定義之后
//系統(tǒng)則不再提供無參數(shù)構(gòu)造方法
	public A(String s){
	}
}
public class B extends A {
	public B(){
	}
}
編譯報(bào)錯(cuò)了:

Java培訓(xùn)機(jī)構(gòu)

圖14-8:編譯報(bào)錯(cuò)信息

以上程序?yàn)槭裁磿?huì)編譯報(bào)錯(cuò)呢?原因是B類的構(gòu)造方法第一行默認(rèn)會(huì)調(diào)用“super()”,而super()會(huì)調(diào)用父類A的無參數(shù)構(gòu)造方法,但由于父類A中提供了有參數(shù)構(gòu)造方法,導(dǎo)致無參數(shù)構(gòu)造方法不存在,從而編譯報(bào)錯(cuò)了。所以在實(shí)際開發(fā)中還是建議程序員將無參數(shù)構(gòu)造方法顯示的定義出來,這樣就可以避免對(duì)象的創(chuàng)建失敗了。

另外,通過以上內(nèi)容的學(xué)習(xí),還可以得出這樣的結(jié)論:在java語言當(dāng)中無論是創(chuàng)建哪個(gè)java對(duì)象,老祖宗Object類中的無參數(shù)構(gòu)造方法是必然執(zhí)行的。

接下來我們?cè)賮砜匆幌拢阂粋€(gè)java對(duì)象在創(chuàng)建過程中比較完整的內(nèi)存圖是如何變化的,請(qǐng)先看以下代碼:

public class People {
	String name;
	boolean sex;
	public People(String name,boolean sex){
		this.name = name;
		this.sex = sex;
	}
}
public class Worker extends People {
	//子類特有的工資屬性
	double salary;
	public Worker(String name,boolean sex,double salary){
		super(name,sex);
		this.salary = salary;
	}
}
public class WorkerTest {
	public static void main(String[] args) {
		Worker w = new Worker("jack",true,10000.0);
		System.out.println("姓名:" + w.name);
		System.out.println("性別:" + w.sex);
		System.out.println("工資:" + w.salary);
	}
}
運(yùn)行結(jié)果如下圖所示:

圖14-9:運(yùn)行結(jié)果

以上程序創(chuàng)建Worker對(duì)象時(shí)構(gòu)造方法的執(zhí)行順序是:

● 先執(zhí)行Object類的無參數(shù)構(gòu)造方法;

● 再執(zhí)行People類的構(gòu)造方法;

● 最后執(zhí)行Worker類的構(gòu)造方法;

注意:雖然執(zhí)行了三個(gè)構(gòu)造方法,但是對(duì)象實(shí)際上只創(chuàng)建了一個(gè)Worker。

以上程序的內(nèi)存結(jié)構(gòu)圖是這樣變化的:

程序執(zhí)行內(nèi)存

圖14-10:程序執(zhí)行內(nèi)存圖

通過以上內(nèi)容的學(xué)習(xí),super()的作用主要是:第一,調(diào)用父類的構(gòu)造方法,使用這個(gè)構(gòu)造方法來給當(dāng)前子類對(duì)象初始化父類型特征;第二,代碼復(fù)用。

主站蜘蛛池模板: 热re99久久精品国产99热 | 九月丁香婷婷亚洲综合色 | 亚洲久久成人 | 国内精品久久久久久久久蜜桃 | 青青青久在线视频免费观看 | 日韩欧美亚洲每的更新在线 | 国产精品视频一区二区三区不卡 | 久久精品国产99久久 | 国产欧美成人xxx视频 | 中文字幕精品一区二区日本大胸 | 99久久99热精品免费观看国产 | 久久久国产精品免费 | 国产精品一区二区三区四区 | 377p欧洲最大胆艺术 | 在线国产网站 | 免费看91毛片| 中文字幕一区2区 | 波多野结衣中文一区二区免费 | 久久精品国产99国产精品澳门 | 欧美精品 日韩 | 一区二区在线视频 | 国产精品视_精品国产免费 国产精品视频2021 | 国产精品免费视频播放 | 97se亚洲国产综合自在线 | 91久久国产视频 | 婷婷在线视频 | 涩涩免费播放观看在线视频 | 米奇精品一区二区三区在线观看 | 一级成人生活片免费看 | 久久久精品波多野结衣 | 欧美不卡精品中文字幕日韩 | 国产深夜福利视频在线观看 | 久久亚洲精品玖玖玖玖 | 免费精品国产自产拍观看 | 中文国产日韩欧美视频 | 亚洲香蕉网综合久久 | 日韩免费一级毛片欧美一级日韩片 | 国产日韩欧美一区 | 污视频在线网站 | 91在线播 | 97久久综合精品久久久综合 |