更新時(shí)間:2020-10-29 17:47:21 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1346次
Java中多態(tài)是個(gè)很難理解的概念,但同時(shí)又是非常重要的概念。多態(tài)存在的三個(gè)必要條件一、要有繼承;二、要有重寫(xiě);三、父類(lèi)引用指向子類(lèi)對(duì)象。我們從字面上理解,就是一種類(lèi)型的多種狀態(tài),想要理解多態(tài)我們就不得不借用接口。本文我們就來(lái)探究接口和多態(tài)關(guān)系。
接口(interface)是抽象方法與常量值的集合;從本質(zhì)上來(lái)講,接口是一種特殊的抽象類(lèi),這種抽象類(lèi)中只包含常量與方法的定義,而沒(méi)有變量和方法的實(shí)現(xiàn);與繼承關(guān)系類(lèi)似,接口與實(shí)現(xiàn)類(lèi)之間存在多態(tài)性。
我們先來(lái)看看多態(tài)的特性:
1.可替換性(substitutability)。多態(tài)對(duì)已存在代碼具有可替換性。
2.可擴(kuò)充性(extensibility)。多態(tài)對(duì)代碼具有可擴(kuò)充性。增加新的子類(lèi)不影響已存在類(lèi)的多態(tài)性、繼承性,以及其他特性的運(yùn)行和操作。實(shí)際上新加子類(lèi)更容易獲得多態(tài)功能。
3.接口性(interface-ability)。多態(tài)是超類(lèi)通過(guò)方法簽名,向子類(lèi)提供了一個(gè)共同接口,由子類(lèi)來(lái)完善或者覆蓋它而實(shí)現(xiàn)的。
4.靈活性(flexibility)。它在應(yīng)用中體現(xiàn)了靈活多樣的操作,提高了使用效率。
5.簡(jiǎn)化性(simplicity)。多態(tài)簡(jiǎn)化對(duì)應(yīng)用軟件的代碼編寫(xiě)和修改過(guò)程,尤其在處理大量對(duì)象的運(yùn)算和操作時(shí),這個(gè)特點(diǎn)尤為突出和重要。
Java中多態(tài)的實(shí)現(xiàn)方式:
1.接口實(shí)現(xiàn)
2.繼承父類(lèi)進(jìn)行方法重寫(xiě)
3.同一個(gè)類(lèi)中進(jìn)行方法重載。
無(wú)論工作還是學(xué)習(xí)中,筆都是我們經(jīng)常用到的工具。但是筆的種類(lèi)又非常的繁多,鉛筆、簽字筆、水筆、毛筆、鋼筆...?,F(xiàn)在我們要對(duì)“筆”進(jìn)行抽象,抽象成一個(gè)抽象父類(lèi)“Pen”
package com.glmapper.demo.base;
/**
* 抽象父類(lèi):筆
* @author glmapper
*/
public abstract class Pen {
//筆的長(zhǎng)度
private int length;
//顏色
private String color;
//類(lèi)型
private String type;
//價(jià)格
private double price;
//寫(xiě)字
public abstract void write(String cnt);
public int getLength() {
return length;
}
public void setLength(int length) {
this.length = length;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}現(xiàn)在有兩個(gè)子類(lèi),分別是:鉛筆和鋼筆。
鉛筆類(lèi),繼承父類(lèi)Pen,并重寫(xiě)write方法
package com.glmapper.demo.base;
/**
* 鉛筆類(lèi) 繼承父類(lèi) 筆(滿(mǎn)足必要條件一:有繼承【其實(shí)如果是接口的話(huà),implement實(shí)現(xiàn)也是可以的】)
* @author glmapper
*
*/
public class Pencil extends Pen{
/**
* 父類(lèi)的抽象方法委托子類(lèi)具體實(shí)現(xiàn):覆蓋
*/
//滿(mǎn)足必要條件二:要有重寫(xiě)【當(dāng)然,如果是對(duì)于write有重載也是可以的,不同的概念而已】
@Override
public void write(String cnt) {
System.out.println("這是一只鉛筆寫(xiě)的內(nèi)容,內(nèi)容是:"+cnt);
}
}
鋼筆類(lèi),繼承父類(lèi)Pen,并重寫(xiě)write方法
package com.glmapper.demo.base;
/**
* 鋼筆類(lèi) 繼承父類(lèi) 筆
* @author 17070738
*
*/
public class Fountainpen extends Pen{
@Override
public void write(String cnt) {
System.out.println("這是一支鋼筆寫(xiě)的內(nèi)容,內(nèi)容是:"+cnt);
}
}
測(cè)試:
package com.glmapper.demo.base;
public class MainTest {
public static void main(String[] args) {
/* Pen pen= new Pencil();*/
//必要條件三:父類(lèi)引用指向子類(lèi)對(duì)象。
Pen pen= new Fountainpen();
pen.write("我是一支筆");
}
}
輸出結(jié)果:這是一支鋼筆寫(xiě)的內(nèi)容,內(nèi)容是:我是一支筆
說(shuō)明可替換性:多態(tài)對(duì)筆Pen類(lèi)工作,對(duì)其他任何子類(lèi),如鉛筆、鋼筆,也同樣工作??蓴U(kuò)充性:在實(shí)現(xiàn)了鉛筆、鋼筆的多態(tài)基礎(chǔ)上,很容易增添“筆”類(lèi)的多態(tài)性。
總而言之,接口和多態(tài)關(guān)系用一句話(huà)可以概括,接口和抽象類(lèi)都是多態(tài)。假設(shè)我要拿遙控器打開(kāi)電器,接口和抽象類(lèi)多態(tài)的側(cè)重點(diǎn)不同。接口的側(cè)重點(diǎn)在遙控器,多態(tài)的側(cè)重點(diǎn)在電器。
通過(guò)上面的實(shí)例,我們知道了接口和多態(tài)關(guān)系微妙,接口可以看作是多態(tài),而多態(tài)的實(shí)現(xiàn)方式又需要借助接口。想要徹底弄清楚多態(tài)和接口關(guān)系,我們?cè)谟^看完本站的Java接口教程之后,或許會(huì)有更深的感悟。
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話(huà)與您溝通安排學(xué)習(xí)