电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

Java 抽象類與接口的對比

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

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

首先是語法層面上的對比

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

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

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

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

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

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

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

其次是概念上的比較

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

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

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

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

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

運行結(jié)果如下:

Airplane is flying.Bird is flying.

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

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

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

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

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

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

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

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

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

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

public class Car implements ICarryPassenger { int passengerNum; //實現(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ù)量 //實現(xiàn)Fly方法 @Override public void fly() { System.out.println('Airplane is flying.'); } //實現(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)在我們寫一個測試類來進(jìn)行測試:

public class Test { public static void main(String[] args) { //有6個乘客想要去旅游,對于旅行方式?jīng)]有側(cè)重,隨機分配交通工具 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.

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

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

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

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 淬火设备-钎焊机-熔炼炉-中频炉-锻造炉-感应加热电源-退火机-热处理设备-优造节能 | 磁力去毛刺机_去毛刺磁力抛光机_磁力光饰机_磁力滚抛机_精密金属零件去毛刺机厂家-冠古科技 | 工业硝酸钠,硝酸钠厂家-淄博「文海工贸」 | 亿立分板机_曲线_锯片式_走刀_在线式全自动_铣刀_在线V槽分板机-杭州亿协智能装备有限公司 | 变位机,焊接变位机,焊接变位器,小型变位机,小型焊接变位机-济南上弘机电设备有限公司 | 进口便携式天平,外校_十万分之一分析天平,奥豪斯工业台秤,V2000防水秤-重庆珂偌德科技有限公司(www.crdkj.com) | 直流大电流电源,燃料电池检漏设备-上海政飞 | 镀锌方管,无缝方管,伸缩套管,方矩管_山东重鑫致胜金属制品有限公司 | 上海恒驭仪器有限公司-实验室平板硫化机-小型平板硫化机-全自动平板硫化机 | 二次元影像仪|二次元测量仪|拉力机|全自动影像测量仪厂家_苏州牧象仪器 | 液压油缸生产厂家-山东液压站-济南捷兴液压机电设备有限公司 | 双菱电缆-广州电缆厂_广州电缆厂有限公司 | 德国GMN轴承,GMN角接触球轴承,GMN单向轴承,GMN油封,GMN非接触式密封 | 翅片管散热器价格_钢制暖气片报价_钢制板式散热器厂家「河北冀春暖气片有限公司」 | 昊宇水工|河北昊宇水工机械工程有限公司 | 祝融环境-地源热泵多恒系统高新技术企业,舒适生活环境缔造者! | 珠宝展柜-玻璃精品展柜-首饰珠宝展示柜定制-鸿钛展柜厂家 | 有机肥设备生产制造厂家,BB掺混肥搅拌机、复合肥设备生产线,有机肥料全部加工设备多少钱,对辊挤压造粒机,有机肥造粒设备 -- 郑州程翔重工机械有限公司 | 珠海网站建设_响应网站建设_珠海建站公司_珠海网站设计与制作_珠海网讯互联 | PVC快速门-硬质快速门-洁净室快速门品牌厂家-苏州西朗门业 | 量子管通环-自清洗过滤器-全自动反冲洗过滤器-北京罗伦过滤技术集团有限公司 | 精密交叉滚子轴承厂家,转盘轴承,YRT转台轴承-洛阳千协轴承 | 冷却塔降噪隔音_冷却塔噪声治理_冷却塔噪音处理厂家-广东康明冷却塔降噪厂家 | 超声波分散机-均质机-萃取仪-超声波涂料分散设备-杭州精浩 | 乙炔气体报警装置|固定式氯化氢检测仪|河南驰诚电气百科 | 广州展览制作工厂—[优简]直营展台制作工厂_展会搭建资质齐全 | 东莞海恒试验仪器设备有限公司| 伺服电机维修、驱动器维修「安川|三菱|松下」伺服维修公司-深圳华创益 | 智能垃圾箱|垃圾房|垃圾分类亭|垃圾分类箱专业生产厂家定做-宿迁市传宇环保设备有限公司 | 广州各区危化证办理_危险化学品经营许可证代办| 压滤机-洗沙泥浆处理-压泥机-山东创新华一环境工程有限公司 | 进口消泡剂-道康宁消泡剂-陶氏消泡剂-大洋消泡剂 | YAGEO国巨电容|贴片电阻|电容价格|三星代理商-深圳市巨优电子有限公司 | 辐射色度计-字符亮度测试-反射式膜厚仪-苏州瑞格谱光电科技有限公司 | Magnescale探规,Magnescale磁栅尺,Magnescale传感器,Magnescale测厚仪,Mitutoyo光栅尺,笔式位移传感器-苏州连达精密量仪有限公司 | 集装箱箱号识别_自重载重图像识别_铁路车号自动识别_OCR图像识别 | 吉祥新世纪铝塑板_生产铝塑板厂家_铝塑板生产厂家_临沂市兴达铝塑装饰材料有限公司 | 领先的大模型技术与应用公司-中关村科金 | 重庆网站建设,重庆网站设计,重庆网站制作,重庆seo,重庆做网站,重庆seo,重庆公众号运营,重庆小程序开发 | 铁艺,仿竹,竹节,护栏,围栏,篱笆,栅栏,栏杆,护栏网,网围栏,厂家 - 河北稳重金属丝网制品有限公司 山东太阳能路灯厂家-庭院灯生产厂家-济南晟启灯饰有限公司 | 湖南档案密集架,智能,物证,移动,价格-湖南档案密集架厂家 |