日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Java 抽象類與接口的對(duì)比

瀏覽:137日期:2022-08-26 14:52:08

其實(shí)說(shuō)實(shí)話,沒有多大的可比較性,它們是完全不同的兩個(gè)東西,它們的抽象不在同一個(gè)層級(jí)上。但是為了讓大家更好的理解,還是做一個(gè)比較吧,畢竟它們都很抽象(233)。

首先是語(yǔ)法層面上的對(duì)比

1)抽象類跟接口都不能被實(shí)例化,因?yàn)樗鼈兌己芴撀铩5窃谠L問(wèn)權(quán)限上,兩者有一定的區(qū)別。

a、抽象類中的抽象方法(其前有abstract修飾)不能用private、static、synchronized、native訪問(wèn)修飾符修飾。理由很簡(jiǎn)單,容我慢慢道來(lái)。

抽象方法是沒有方法體的,它的目的就是用來(lái)繼承的,所以如果使用private修飾,不就不能被繼承了嗎?這就違背了它的設(shè)計(jì)初衷了,所以不能用private來(lái)修飾抽象方法。至于static,用它來(lái)修飾的方法可以不實(shí)例化就可以直接調(diào)用,但是抽象方法沒有方法體,使用static修飾就沒有意義了。synchronized是用來(lái)加鎖的,如果修飾類中的方法的話,就相當(dāng)于用this變量鎖,但是抽象類是不能被實(shí)例化的,抽象方法也不是在本類中實(shí)現(xiàn)而是在子類中實(shí)現(xiàn)的,所以鎖應(yīng)該是子類所屬,所以抽象方法不能用synchronized關(guān)鍵字修飾;至于native,這個(gè)跟abstract關(guān)鍵字本身就是沖突的,abstract聲明方法交給子類實(shí)現(xiàn),而native則是交給本地操作系統(tǒng)實(shí)現(xiàn),如果同時(shí)出現(xiàn),那就相當(dāng)于把實(shí)現(xiàn)交給子類,又交給本地操作系統(tǒng),那最后到底由誰(shuí)來(lái)實(shí)現(xiàn)呢?

綜上所述,抽象類中的抽象方法只能用public和protected修飾。

b.接口中的方法全部為public abstract修飾,不能使用其他修飾符,而且默認(rèn)情況(不加任何修飾符)下,也是public abstract的,因?yàn)榻涌谥荒鼙活悓?shí)現(xiàn),不能被類繼承,所以不能使用protected修飾,但接口是可以繼承接口的。

2)抽象類跟普通類的唯一區(qū)別就是不能被實(shí)例化,可以有抽象方法,所以它可以有構(gòu)造函數(shù),靜態(tài)方法,靜態(tài)代碼塊,可以有普通的成員變量和方法。但是接口就不一樣了,接口只能聲明public abstract的方法和public static final的成員變量。

3)抽象類本質(zhì)上還是一個(gè)類,只能單繼承,一個(gè)類只能繼承一個(gè)抽象類,但可以實(shí)現(xiàn)多個(gè)接口。

其次是概念上的比較

1)抽象類跟接口的抽象角度不一樣,抽象類一般是對(duì)某些具有相似屬性和方法的類進(jìn)行抽象,抽象出一個(gè)統(tǒng)一的父類。而接口則更多的是多一組特定行為的抽象,關(guān)注的是行為,而具有這些行為的類之間可能并沒有太大的關(guān)聯(lián)性。

比如說(shuō),飛機(jī)能上天,鳥能上天,你要是厲害一點(diǎn),應(yīng)該也能上天(逃),但顯然兩者之間的關(guān)聯(lián)度不大,如果硬是要給它們插上一個(gè)公共的父類的話,似乎不合情理,看起來(lái)就像這樣:

public abstract class Flyer { public abstract void fly();}

然后定義兩個(gè)類來(lái)繼承它:

public class Airplane extends Flyer { @Override public void fly() { System.out.println('Airplane is flying.'); }}

public class Bird extends Flyer { @Override public void fly() { System.out.println('Bird is flying.'); }}

好的,現(xiàn)在寫一個(gè)測(cè)試類:

public class Test { public static void main(String[] args) { Flyer[] flyer = new Flyer[2]; flyer[0] = new Airplane(); flyer[1] = new Bird(); for (Flyer f:flyer){ f.fly(); } }}

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

Airplane is flying.Bird is flying.

乍眼一看,好像運(yùn)行良好,但是仔細(xì)想想,將兩個(gè)關(guān)聯(lián)度很低的類強(qiáng)行插上一個(gè)父類,似乎有些不妥,畢竟飛機(jī)跟鳥除了都能飛以外,基本沒有什么相似的地方了,而且兩者的飛行方式,飛行速度和高度都相去甚遠(yuǎn),也就是說(shuō)除了這個(gè)fly的方法,其他方法都要在各自的子類實(shí)現(xiàn),而且一個(gè)類只能繼承一個(gè)抽象類,所以Bird類和Airplane類就無(wú)法再繼承其他類了,這樣就反而限制了程序的靈活性。所以,這種時(shí)候,還是比較適合使用接口:

public interface IFlyable { //聲明Fly方法 void fly();}

而此時(shí)只需要將Airplane類和Bird類的extends Flyer改成implement Flyable即可。

public class Airplane implements IFlyable { //實(shí)現(xiàn)Fly方法 @Override public void fly() { System.out.println('Airplane is flying.'); }}

public class Bird implements IFlyable { //實(shí)現(xiàn)Fly方法 @Override public void fly() { System.out.println('Bird is flying.'); }}

再修改一下Test類:

public class Test { public static void main(String[] args) { IFlyable[] flyer = new IFlyable[2]; flyer[0] = new Airplane(); flyer[1] = new Bird(); for (IFlyable f:flyer){ f.fly(); } }}

輸出如下:

Airplane is flying.Bird is flying.

也許從這個(gè)栗子還沒法明顯的看出兩者的區(qū)別,那么我們?cè)贀Q一個(gè)栗子,人可以坐飛機(jī),可以坐火車,還可以坐汽車,只要它們有載人功能即可,那用接口實(shí)現(xiàn)如下:

public interface ICarryPassenger { //聲明載客方法 void carry(Passenger passenger);}

定義一個(gè)乘客類,用姓名來(lái)區(qū)分各個(gè)乘客。

public class Passenger { private String name;//乘客姓名 public Passenger(String name){ this.name = name; } public String getName() { return name; } //出行方式 public void travelBy(ICarryPassenger ic){ ic.carry(this); }}

分別定義汽車類,火車類,飛機(jī)類,它們都實(shí)現(xiàn)ICarryPassenger接口,飛機(jī)還可以實(shí)現(xiàn)IFlyable接口(雖然沒有用到。。):

public class Car implements ICarryPassenger { int passengerNum; //實(shí)現(xiàn)carry方法 @Override public void carry(Passenger passenger) { System.out.println('Passenger:'+passenger.getName()+' travel by Car.'); passengerNum++; System.out.println('Car carries: '+passengerNum+' passenger.'); }}

public class Train implements ICarryPassenger { int passengerNum; @Override public void carry(Passenger passenger) { System.out.println('Passenger:'+passenger.getName()+' travel by Train.'); passengerNum++; System.out.println('Train carries: '+passengerNum+' passenger.'); }}

public class Airplane implements IFlyable,ICarryPassenger{ private int passengerNum;//乘客數(shù)量 //實(shí)現(xiàn)Fly方法 @Override public void fly() { System.out.println('Airplane is flying.'); } //實(shí)現(xiàn)carry方法 @Override public void carry(Passenger passenger) { System.out.println('Passenger:'+passenger.getName()+' travel by Airplane.'); passengerNum++; System.out.println('Airplane carries: '+passengerNum+' passengers.'); }}

好的,現(xiàn)在我們寫一個(gè)測(cè)試類來(lái)進(jìn)行測(cè)試:

public class Test { public static void main(String[] args) { //有6個(gè)乘客想要去旅游,對(duì)于旅行方式?jīng)]有側(cè)重,隨機(jī)分配交通工具 Random random = new Random(); Passenger[] passengers = new Passenger[6];//聲明6個(gè)乘客 for (int i=0;i<6;i++){ passengers[i] = new Passenger('Passenger['+i+']'); } ICarryPassenger[] icp = new ICarryPassenger[3];//聲明3種交通方式 icp[0] = new Airplane(); icp[1] = new Car(); icp[2] = new Train(); for (int i=0;i<6;i++){ passengers[i].travelBy(icp[random.nextInt(3)]); } }}

輸出如下:

Passenger:Passenger[0] travel by Airplane.Airplane carries: 1 passengers.Passenger:Passenger[1] travel by Train.Train carries: 1 passenger.Passenger:Passenger[2] travel by Airplane.Airplane carries: 2 passengers.Passenger:Passenger[3] travel by Car.Car carries: 1 passenger.Passenger:Passenger[4] travel by Train.Train carries: 2 passenger.Passenger:Passenger[5] travel by Airplane.Airplane carries: 3 passengers.

因?yàn)轱w機(jī)跟火車,汽車之間并沒有太大關(guān)聯(lián),顯然無(wú)法直接抽象出父類,它們僅有相同的行為,那就是載客,所以使用接口是最合適的。

至此,本篇講解完畢,想必通過(guò)這一篇的講解,對(duì)于抽象類和接口的區(qū)別應(yīng)該有了更好的理解吧,如果有更好的栗子,歡迎大家留言交流,也歡迎大家繼續(xù)關(guān)注。

以上就是Java 抽象類與接口的對(duì)比的詳細(xì)內(nèi)容,更多關(guān)于Java 抽象類與接口的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
超碰成人av| 欧美日韩精品在线一区| 蜜臀av免费一区二区三区| 免费一二一二在线视频 | 99综合视频| 久久国产亚洲精品| 国产99精品一区| 亚洲欧美视频一区二区三区| 国模精品一区| 日韩中文在线电影| 日本久久成人网| 丝袜国产日韩另类美女| 88久久精品| 精品欧美视频| 国产传媒在线观看| 五月天久久网站| 日韩欧美中文字幕在线视频| 日韩欧美四区| 免费高潮视频95在线观看网站| 999久久久免费精品国产| 久久精品国产99久久| 99成人在线| 久久不卡国产精品一区二区| 国产精品久久久久久久久妇女| 亚洲精品网址| 国产精品久久久久久av公交车| 日韩中文在线播放| 天堂俺去俺来也www久久婷婷| 欧美激情久久久久久久久久久| 国产精品入口久久| 伊人久久成人| 手机在线电影一区| 亚洲欧美日韩国产一区| 久久男人av资源站| 日本午夜精品久久久| 亚洲欧洲另类| 青青青免费在线视频| 国产精品社区| 午夜久久美女| 国产一区二区三区日韩精品 | 欧美肉体xxxx裸体137大胆| 综合欧美亚洲| 日韩成人在线看| 国产精品17p| 欧美/亚洲一区| 国产在线视频欧美一区| 欧美成人亚洲| 久久久蜜桃一区二区人| 国产一区二区三区日韩精品| 欧美视频久久| 日韩国产欧美视频| 免费成人在线观看| 亚洲视频播放| 亚洲欧美日韩视频二区| 午夜欧美在线| 最新日韩欧美| aa国产精品| 欧洲激情综合| 日韩三区在线| 欧美三级精品| 国产一区一一区高清不卡| 欧美亚洲综合视频| 亚洲日本久久| 91久久在线| 日韩福利在线观看| 日韩一区二区三区精品| 88久久精品| 岛国精品一区| 国产精品调教视频| 精品久久免费| 欧美激情麻豆| 欧美韩日一区| 久久不见久久见中文字幕免费| 热久久久久久| 91成人在线精品视频| 亚洲一区国产一区| 美女国产一区| 久久不见久久见中文字幕免费| 中国字幕a在线看韩国电影| 亚洲精品97| 国产精品久久久久久久久久齐齐| 成人影视亚洲图片在线| 中文精品视频| 久久精品亚洲| 国产精品毛片| 国产精品亚洲人成在99www| 免费在线小视频| 在线亚洲激情| 精品欧美日韩精品| 亚洲一区国产| 97精品中文字幕| 蜜臀久久99精品久久久画质超高清 | 亚洲精品永久免费视频| 亚洲一区二区毛片| 91精品福利观看| 亚洲第一精品影视| 97精品资源在线观看| 91精品一区国产高清在线gif | 欧美国产专区| 免费观看在线综合| 激情黄产视频在线免费观看| 日韩精品视频中文字幕| 亚洲午夜黄色| 国产suv精品一区二区四区视频| 免费久久99精品国产自在现线| 日韩综合在线| 免费在线观看一区| 日韩一级网站| 欧美13videosex性极品| 亚洲黄色免费av| 免费国产自线拍一欧美视频| 亚洲五月综合| 99精品视频在线| 国产毛片久久| 亚洲精品字幕| 国产日产精品_国产精品毛片| 日本不卡在线视频| 亚洲欧美一区在线| 国产资源在线观看入口av| 欧美日韩a区| 蜜臀av一区二区在线免费观看| 日韩不卡视频在线观看| 日本中文字幕一区二区| 午夜久久久久| 在线日韩欧美| 国产精品观看| 久久精品亚洲| 成人黄色av| 日韩大片在线| 国产99久久久国产精品成人免费| 成人看片网站| 亚洲福利久久| 欧美亚洲激情| 欧美日韩激情在线一区二区三区| 亚洲国产不卡| 亚洲天堂免费| 亚洲aa在线| 日本一区免费网站| 久久av电影| | 国产视频一区三区| 手机精品视频在线观看| 日韩一区网站| 国产精品调教| 日韩成人亚洲| 人人精品人人爱| 久久不见久久见国语| 日韩成人亚洲| 亚洲青青久久| 精品三区视频| 日韩欧美一区二区三区免费看| 亚洲91视频| 日韩精品1区2区3区| 精品国产鲁一鲁****| 亚洲国产影院| 欧美一区二区三区久久精品| 成人日韩精品| 亚洲精品进入| 亚洲国产欧美日本视频| 日韩精品一级中文字幕精品视频免费观看| 国产精品日本一区二区不卡视频| 久久中文视频| 麻豆传媒一区二区三区| 国产精品毛片一区二区三区| 久久wwww| 亚洲深爱激情| 日韩av在线中文字幕| 97精品资源在线观看| 久久蜜桃av| 高清一区二区三区| 欧美日韩一区二区三区不卡视频| 亚州av乱码久久精品蜜桃| 欧美二三四区| 国产精久久一区二区| 日韩久久视频| 亚洲午夜国产成人| av资源新版天堂在线| 黄色aa久久| 麻豆精品在线| 蜜桃av一区二区| 亚洲男人在线| 国产精品蜜芽在线观看| 日韩一区网站| 免费观看久久久4p| 欧美69视频| 久久精品主播| 中文字幕在线官网| 国产一区二区三区黄网站| 青草国产精品| 91嫩草精品| 九色精品91| zzzwww在线看片免费| 久久av国产紧身裤| 国产精品一区二区免费福利视频 | 91精品亚洲| 成人午夜国产| 丝袜美腿诱惑一区二区三区 | 久久黄色影视| 久久99影视| 久久97久久97精品免视看秋霞|