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

您的位置:首頁技術文章
文章詳情頁

Java 抽象類與接口的對比

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

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

首先是語法層面上的對比

1)抽象類跟接口都不能被實例化,因為它們都很虛嘛。但是在訪問權限上,兩者有一定的區別。

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

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

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

b.接口中的方法全部為public abstract修飾,不能使用其他修飾符,而且默認情況(不加任何修飾符)下,也是public abstract的,因為接口只能被類實現,不能被類繼承,所以不能使用protected修飾,但接口是可以繼承接口的。

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

3)抽象類本質上還是一個類,只能單繼承,一個類只能繼承一個抽象類,但可以實現多個接口。

其次是概念上的比較

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

比如說,飛機能上天,鳥能上天,你要是厲害一點,應該也能上天(逃),但顯然兩者之間的關聯度不大,如果硬是要給它們插上一個公共的父類的話,似乎不合情理,看起來就像這樣:

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

然后定義兩個類來繼承它:

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.'); }}

好的,現在寫一個測試類:

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(); } }}

運行結果如下:

Airplane is flying.Bird is flying.

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

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

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

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

public class Bird implements IFlyable { //實現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.

也許從這個栗子還沒法明顯的看出兩者的區別,那么我們再換一個栗子,人可以坐飛機,可以坐火車,還可以坐汽車,只要它們有載人功能即可,那用接口實現如下:

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

定義一個乘客類,用姓名來區分各個乘客。

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); }}

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

public class Car implements ICarryPassenger { int passengerNum; //實現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;//乘客數量 //實現Fly方法 @Override public void fly() { System.out.println('Airplane is flying.'); } //實現carry方法 @Override public void carry(Passenger passenger) { System.out.println('Passenger:'+passenger.getName()+' travel by Airplane.'); passengerNum++; System.out.println('Airplane carries: '+passengerNum+' passengers.'); }}

好的,現在我們寫一個測試類來進行測試:

public class Test { public static void main(String[] args) { //有6個乘客想要去旅游,對于旅行方式沒有側重,隨機分配交通工具 Random random = new Random(); Passenger[] passengers = new Passenger[6];//聲明6個乘客 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.

因為飛機跟火車,汽車之間并沒有太大關聯,顯然無法直接抽象出父類,它們僅有相同的行為,那就是載客,所以使用接口是最合適的。

至此,本篇講解完畢,想必通過這一篇的講解,對于抽象類和接口的區別應該有了更好的理解吧,如果有更好的栗子,歡迎大家留言交流,也歡迎大家繼續關注。

以上就是Java 抽象類與接口的對比的詳細內容,更多關于Java 抽象類與接口的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
91精品国产自产在线丝袜啪| 日韩精品第二页| 精品91福利视频| 国产精品片aa在线观看| 国产亚洲一区二区三区啪| 一二三区精品| 视频一区在线播放| 久久国产精品久久w女人spa| 最新国产拍偷乱拍精品| 欧美不卡高清| 欧美精品自拍| 视频在线观看一区二区三区| 日精品一区二区三区| 日韩精品社区| 国产精品亚洲一区二区在线观看 | 欧美好骚综合网| 欧美一级鲁丝片| 一级欧洲+日本+国产| 免费在线成人网| 国产日本精品| 国产精品成久久久久| 亚洲精品国产嫩草在线观看| re久久精品视频| 日本不卡视频在线| 欧美91在线|欧美| 青青久久av| 免费看日韩精品| 久久国产人妖系列| 国产成人精品999在线观看| 久久久精品久久久久久96| 国产精品嫩草99av在线| 欧美日一区二区三区在线观看国产免| 国产黄色一区| 99久久精品费精品国产| 免费人成网站在线观看欧美高清| 国产精品美女久久久久久不卡| 97精品在线| 亚洲综合精品四区| 国产精品亚洲欧美日韩一区在线 | 男人的天堂久久精品| 亚洲人妖在线| 欧美成a人片免费观看久久五月天| 一区二区三区四区日本视频| 国产亚洲欧洲| 久久99蜜桃| 亚洲婷婷免费| 国产情侣一区| 欧美 日韩 国产一区二区在线视频| 亚洲精品四区| 美女一区网站| 婷婷亚洲成人| 日韩精品影视| 欧美在线看片| 激情综合网址| 国产精品主播| 蜜桃成人av| 国产精品极品在线观看| 欧美日韩国产免费观看| 麻豆极品一区二区三区| 日韩一级网站| 精品美女久久| 亚洲精品综合| 成人羞羞在线观看网站| 日韩av资源网| 五月天久久久| 精品国产鲁一鲁****| 免费视频一区二区| 黑森林国产精品av| 日本欧美在线| 亚洲男女av一区二区| 国产精品久久| 日韩专区在线视频| 日韩av有码| 日韩不卡在线观看日韩不卡视频| 亚洲天堂久久| 国产专区精品| 啪啪亚洲精品| 国产视频一区在线观看一区免费| 色综合五月天| 日韩精品久久久久久久软件91| 91精品国产调教在线观看| 国产精品毛片久久久| 一区二区日韩免费看| 国产综合视频| 日韩电影二区| 麻豆精品视频在线观看| 五月亚洲婷婷 | 超碰99在线| 欧美日韩伊人| 老牛国产精品一区的观看方式| 日本高清不卡一区二区三区视频| 久久精品资源| 日韩精品中文字幕一区二区| 91久久国产| 日韩三区在线| av资源中文在线天堂| 免费在线观看一区| 国产日本久久| 日本成人一区二区| 亚洲精品乱码| 人人精品人人爱| 男女精品网站| 亚洲一区成人| 欧美日韩国产高清电影| 九色porny丨国产首页在线| 精品一区二区三区中文字幕| 青青草视频一区| 中文字幕一区二区三区日韩精品| 欧美.日韩.国产.一区.二区 | 欧美日韩亚洲一区三区| 色狠狠一区二区三区| 男女男精品视频网| 美女精品网站| 午夜在线一区二区| 亚洲免费一区二区| 蜜臀久久99精品久久久久久9| 美女尤物久久精品| 好看的av在线不卡观看| 亚洲午夜黄色| 五月天久久网站| 午夜在线精品偷拍| 免费看日韩精品| 婷婷亚洲成人| 久久国产麻豆精品| 国产精品www994| 久久中文字幕一区二区| 精品视频在线一区二区在线| 久久97视频| 国产精品二区不卡| 免费高潮视频95在线观看网站| 香蕉成人av| 伊人影院久久| 手机精品视频在线观看| 亚洲深夜福利在线观看| 日韩精品社区| 国产精品视频一区二区三区| 国产精品99精品一区二区三区∴| 久久字幕精品一区| 欧美日韩视频免费观看| 欧美成人国产| 鲁大师影院一区二区三区| 在线视频亚洲欧美中文| 日韩免费精品| 久久精品三级| 91一区二区三区四区| 伊人久久大香线蕉av不卡| 日韩午夜精品| 日韩精品中文字幕一区二区| 欧美激情视频一区二区三区免费| 亚洲精品永久免费视频| 亚洲精品午夜av福利久久蜜桃| 亚洲综合婷婷| 欧美黑人巨大videos精品| 91av亚洲| 国产婷婷精品| 久久精品99久久久| 国产精品99一区二区三区| 99精品美女| 免费看日韩精品| 国产极品久久久久久久久波多结野| 五月天av在线| 亚洲图片久久| 成人午夜毛片| 欧美二区视频| 日本午夜精品视频在线观看| 97人人精品| 亚欧成人精品| 免费久久99精品国产| 国产精品欧美在线观看| 国产一区二区三区自拍| 日本大胆欧美人术艺术动态| 国产精品精品国产一区二区| 日韩午夜一区| 美女视频网站久久| 成人精品亚洲| 黄色成人精品网站| 日韩a一区二区| 亚洲精一区二区三区| 日韩制服丝袜先锋影音| 欧美日本不卡高清| 天堂√中文最新版在线| 亚洲伊人精品酒店| 国产一区福利| 美女日韩在线中文字幕| 国产一区二区三区四区五区| 国产手机视频一区二区| 久久av综合| 国产美女一区| 国产一区二区三区网| 免费黄网站欧美| 色婷婷亚洲mv天堂mv在影片| 亚洲精品一二| 久久久久久久久丰满| 婷婷综合电影| 日韩一区二区三区四区五区| 只有精品亚洲| 丝袜美腿高跟呻吟高潮一区| 伊人久久亚洲热| 国产激情综合| 丝袜美腿亚洲色图|