黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

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

Java方法覆蓋

本章節(jié)目標(biāo):

理解在什么情況下我們需要進(jìn)行方法覆蓋?掌握在滿足什么條件的時(shí)候構(gòu)成方法覆蓋?什么是多態(tài),代碼怎么寫?向上轉(zhuǎn)型和向下轉(zhuǎn)型都是什么?多態(tài)在開(kāi)發(fā)中有什么作用?

知識(shí)框架:

Java方法覆蓋Override

Java方法覆蓋Override

學(xué)習(xí)方法覆蓋之前,我們先來(lái)回顧一下方法重載(overload),什么情況下考慮使用方法重載呢?在同一個(gè)類當(dāng)中,如果功能相似,盡可能將方法名定義的相同,這樣方便調(diào)用的同時(shí)代碼也會(huì)美觀。那么,代碼滿足什么條件的時(shí)候能夠構(gòu)成方法重載呢?只要在同一個(gè)類當(dāng)中,方法名相同,參數(shù)列表不同(類型、個(gè)數(shù)、順序),即構(gòu)成方法重載。

帶著同樣的疑問(wèn)去學(xué)習(xí)方法覆蓋,什么是方法覆蓋?什么情況下考慮方法覆蓋?代碼怎么寫的時(shí)候就構(gòu)成了方法覆蓋呢?接下來(lái)看一段代碼:

public class People {
	private String name;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public void speakHi(){
		System.out.println(this.name + "和別人打招呼!");
	}
}
public class ChinaPeople extends People {
//中國(guó)人
}
public class AmericaPeople extends People {
//美國(guó)人
}
public class PeopleTest {
	public static void main(String[] args) {
		ChinaPeople cp = new ChinaPeople();
		cp.setName("張三");
		cp.speakHi();
		AmericaPeople ap = new AmericaPeople();
		ap.setName("jackson");
		ap.speakHi();
	}
}

運(yùn)行結(jié)果如下圖所示:

Java開(kāi)發(fā)

圖13-1:運(yùn)行結(jié)果

“中國(guó)人”調(diào)用speakHi()方法希望輸出的結(jié)果是“你好,我叫張三,很高興見(jiàn)到你!”,“美國(guó)人”調(diào)用speakHi()方法更希望輸出的結(jié)果是“Hi,My name is jackson,Nice to meet you!”,可見(jiàn)ChinaPeople和AmericaPeople從父類中繼承過(guò)來(lái)的speakHi()方法已經(jīng)不夠子類使用了,那這個(gè)時(shí)候應(yīng)該怎么辦呢?當(dāng)然,此時(shí)就需要使用方法覆蓋機(jī)制了。請(qǐng)看以下代碼:

public class People {
	private String name;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public void speakHi(){
		System.out.println(this.name + "和別人打招呼!");
	}
}
public class ChinaPeople extends People {
	public void speakHi(){
		System.out.println("你好,我叫"+this.getName()+",很高興認(rèn)識(shí)你!");
	}
}
public class AmericaPeople extends People {
	public void speakHi(){
		System.out.println("Hi,My name is "+this.getName()+",Nice to meet you!");
	}
}
public class PeopleTest {
	public static void main(String[] args) {
		ChinaPeople cp = new ChinaPeople();
		cp.setName("張三");
		cp.speakHi();
		AmericaPeople ap = new AmericaPeople();
		ap.setName("jackson");
		ap.speakHi();
	}
}

運(yùn)行結(jié)果如下圖所示:

Java方法覆蓋

圖13-2:方法覆蓋之后的運(yùn)行結(jié)果

以上程序中ChinaPeople和AmericaPeople將從People類中繼承過(guò)來(lái)的speakHi()方法進(jìn)行了覆蓋,我們也看到了當(dāng)speakHi()方法發(fā)生覆蓋之后,子類對(duì)象會(huì)調(diào)用覆蓋之后的方法,不會(huì)再去調(diào)用之前從父類中繼承過(guò)來(lái)的方法。

那么,到底在什么情況下我們會(huì)考慮使用方法覆蓋呢?通過(guò)以上內(nèi)容的學(xué)習(xí),我們了解到只有當(dāng)從父類中繼承過(guò)來(lái)的方法無(wú)法滿足當(dāng)前子類業(yè)務(wù)需求的時(shí)候,需要將父類中繼承過(guò)來(lái)的方法進(jìn)行覆蓋。換句話說(shuō),父類中繼承過(guò)來(lái)的方法已經(jīng)不夠用了,子類有必要將這個(gè)方法重新再寫一遍,所以方法覆蓋又被稱為方法重寫。當(dāng)該方法被重寫之后,子類對(duì)象一定會(huì)調(diào)用重寫之后的方法。

那么,當(dāng)程序具備哪些條件的時(shí)候,就能構(gòu)成方法覆蓋呢?

● 方法覆蓋發(fā)生在具有繼承關(guān)系的父子類之間,這是首要條件;

●  覆蓋之后的方法與原方法具有相同的返回值類型、相同的方法名、相同的形式參數(shù)列表;

● 另外,在使用方法覆蓋的時(shí)候,需要有哪些注意事項(xiàng)呢?

● 由于覆蓋之后的方法與原方法一模一樣,建議在開(kāi)發(fā)的時(shí)候采用復(fù)制粘貼的方式,不建議手寫,因?yàn)槭謱懙臅r(shí)候非常容易出錯(cuò),比如在Object類當(dāng)中有toString()方法,該方法中的S是大寫的,在手寫的時(shí)候很容易寫成小寫tostring(),這個(gè)時(shí)候你會(huì)認(rèn)為toString()方法已經(jīng)被覆蓋了,但由于方法名不一致,導(dǎo)致最終沒(méi)有覆蓋,這樣就尷尬了;

● 私有的方法不能被繼承,所以不能被覆蓋;

● 構(gòu)造方法不能被繼承,所以也不能被覆蓋;

● 覆蓋之后的方法不能比原方法擁有更低的訪問(wèn)權(quán)限,可以更高(學(xué)習(xí)了訪問(wèn)控制權(quán)限修飾符之后你就明白了);

● 覆蓋之后的方法不能比原方法拋出更多的異常,可以相同或更少(學(xué)習(xí)了異常之后就明白了);

● 方法覆蓋只是和方法有關(guān),和屬性無(wú)關(guān);

● 靜態(tài)方法不存在覆蓋(不是靜態(tài)方法不能覆蓋,是靜態(tài)方法覆蓋意義不大,學(xué)習(xí)了多態(tài)機(jī)制之后就明白了);

以上的注意事項(xiàng)還需要大家記憶,多下點(diǎn)功夫吧。接下來(lái)我們?cè)賮?lái)看一段代碼,對(duì)方法覆蓋加深一下印象,業(yè)務(wù)需求是這樣的:定義一個(gè)動(dòng)物類,所有動(dòng)物都有移動(dòng)的行為,其中貓類型的對(duì)象在移動(dòng)的時(shí)候輸出“貓?jiān)谧哓埐剑?rdquo;,鳥(niǎo)兒類型的對(duì)象在移動(dòng)的時(shí)候輸出“鳥(niǎo)兒在飛翔!”,但是貓類型的對(duì)象具有一個(gè)特殊的行為,抓老鼠,這個(gè)行為不是所有動(dòng)物對(duì)象都有的,是貓類型對(duì)象特有的:

public class Animal {
	public void move(){
		System.out.println("動(dòng)物在移動(dòng)!");
	}
}
public class Cat extends Animal{
	public void move(){
		System.out.println("貓?jiān)谧哓埐剑?);
	}
	public void catchMouse(){
		System.out.println("貓抓老鼠!");
	}
}
public class Bird extends Animal{
	public void move(){
		System.out.println("鳥(niǎo)兒在飛翔!");
	}
}
public class Test {
	public static void main(String[] args) {
		Cat cat = new Cat();
		cat.move();
		cat.catchMouse();
		Bird bird = new Bird();
		bird.move();
	}
}

運(yùn)行結(jié)果如下圖所示:

Java方法覆蓋

圖13-3:方法覆蓋演示

對(duì)方法覆蓋總結(jié)一下,當(dāng)父類中繼承過(guò)來(lái)的方法無(wú)法滿足當(dāng)前子類業(yè)務(wù)需求的時(shí)候,子類有必要將父類中繼承過(guò)來(lái)的方法進(jìn)行覆蓋/重寫。方法覆蓋發(fā)生在具有繼承關(guān)系的父子類之間,方法覆蓋的時(shí)候要求相同的返回值類型、相同的方法名、相同的形式參數(shù)列表。方法覆蓋之后子類對(duì)象在調(diào)用的時(shí)候一定會(huì)執(zhí)行覆蓋之后的方法。

主站蜘蛛池模板: 777艳片 | 久久免费看片 | 一级全黄色毛片 | 免费国产成人高清在线观看不卡 | 另类小说第一草 | 人人做人人做人人爱 | 伊人再现 | 高清色黄毛片一级毛片 | 黄色三级毛片视频 | 国产免费爱在线观看视频 | 19国产精品麻豆免费观看 | 一级女性全黄生活片免费 | bl男男文肉高h | 天天躁夜夜躁狠狠躁 | 日韩成人在线视频 | 国产日韩欧美另类 | 日韩精品卡1卡二卡3卡四卡 | 亚洲成a人片在线观看尤物 亚洲成a人片在线观看88 | 麻豆成人传媒一区二区 | 精品国产成人 | 外国黄色毛片 | 亚洲视频中文 | 亚洲欧美日韩综合一区久久 | 91啪国自产中文字幕在线 | 猫色网站 | 国内精品视频一区二区三区 | 欧美韩国xxx | 青青草成人影院 | 亚洲精品午夜久久aaa级久久久 | 欧美1区| 精品一区二区三区免费视频 | 狠狠色综合久久久久尤物 | 亚洲第一区视频在线观看 | 亚洲天堂色 | 国产精品xxxxbbbb18 | 997在线观看视频国产 | 美国俄罗斯毛片一区二区 | 丁香激情综合色伊人久久 | 天天干天| 特级淫片aaaa毛片aa视频 | 五月激情视频 |