自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

我是如何理解Java抽象類和接口的

開發(fā) 后端
在面試中我們經(jīng)常被問到:Java中抽象類和接口的區(qū)別是什么?然后,我們就大說一通抽象類可以有方法,接口不能有實(shí)際的方法啦;一個類只能繼承一個抽象類,卻可以繼承多個接口啦,balabala一大堆,就好像把標(biāo)準(zhǔn)答案熟練的說出來一樣。

在面試中我們經(jīng)常被問到:Java中抽象類和接口的區(qū)別是什么?然后,我們就大說一通抽象類可以有方法,接口不能有實(shí)際的方法啦;一個類只能繼承一個抽象類,卻可以繼承多個接口啦,balabala一大堆,就好像把標(biāo)準(zhǔn)答案熟練的說出來一樣。

[[130096]]

抽象類和接口這篇文章講到了他們的區(qū)別和聯(lián)系,它們確實(shí)有很多相似的地方,但是從本質(zhì)上看,或從語言的設(shè)計角度來看,這不是它們最本質(zhì)的區(qū)別。

不賣關(guān)子,我個人對這兩個的理解:

類是具體實(shí)例的抽象,比如一個json字符串的抽象;而抽象類就是類的抽象;接口就是抽象類的抽象,接口更像是一種協(xié)議

聽我慢慢道來~

吐槽

首先,我必須吐槽一下這種面試,我認(rèn)為面試官凡事問出這種類似“說說抽象類和接口的區(qū)別”,“說說進(jìn)程和線程的區(qū)別”等等問題,都是不負(fù)責(zé)的表現(xiàn)。

為什么呢?

一個原因就是,面試官對想要招的人完全沒有自己的評價標(biāo)準(zhǔn),另一個原因就是對面試者不負(fù)責(zé)。這種問題根本不能考驗(yàn)面試者的水平。

那么,如果我來面試別人,我會問:請你說說你怎么理解抽象類和接口;如果要你向你外婆解釋進(jìn)程和線程的區(qū)別,你會怎么解釋?

我覺得這可以考驗(yàn)面試者對問題的理解程度,我想微軟的面試題(你如何向你奶奶解釋Excel)一樣,考驗(yàn)一個人對某一事物的理解程度(雖然,至今我還不能很好的想明白這個問題 -。-)

抽象類和接口的區(qū)別

說到抽象類和接口,就必須要說到類。

一個類就是對現(xiàn)實(shí)事物的抽象。

比如定義一個BenzCar類,就需要對現(xiàn)實(shí)的奔馳汽車有很好的抽象(當(dāng)然奔馳汽車有好多系列,這里不鉆牛角尖)。也就是說如果你要造一輛奔馳汽車,就需要BenzCar這個類(這輛奔馳汽車就是內(nèi)存中的一個Instance)。

那么抽象類就是對類的抽象。

怎么理解呢?就是說有很多汽車廠商一起定義一種規(guī)范(Car類),說要造一輛汽車就需要有發(fā)動機(jī),輪胎,音響設(shè)備…(這些就相當(dāng)于抽象方法),具體用什么發(fā)動機(jī),輪胎,音響設(shè)備由每個汽車廠商自己去完成。這樣就有各種汽車了,奔馳牌的,寶馬牌的,豐田牌的…

接口就是對抽象類的抽象

這只是我個人的理解。

在我們?nèi)粘I钪锌梢钥吹礁鞣N“接口”,電源插座就是一種。開始我是看到耗子叔的博客在開始理解“控制翻轉(zhuǎn)”這個概念的——IoC/DIP其實(shí)是一種管理思想| 酷殼- CoolShell.cn。后來我就想,這個東西其實(shí)無處不在,制造電源插座的廠和制造電器的廠只要約定一種“接口”——兩口插座或三口插座,當(dāng)然每個國家的接口都不一樣,不同接口之間的轉(zhuǎn)換就需要用適配器了。

其實(shí)程序中也一樣,比如所有的交通工具可以抽象為一個接口Drivable(可能由于經(jīng)驗(yàn)原因,我考慮的不是很完善),表示實(shí)現(xiàn)這個接口的類創(chuàng)建的對象(比如:汽車,飛機(jī),輪船等等)都是可以駕駛的public interface Drivable{ public void drive; }然后,我們就可以創(chuàng)建一個AbstractCar類,表示這個對所有汽車類的一個抽象,所有可以駕駛的汽車都必須繼承這個類,這個抽象類中規(guī)定了一些抽象方法,比如getEngine當(dāng)然,你也可以繼承AbstractCar類,對所有可能具有相同引擎的汽車進(jìn)行一層抽象)。drive設(shè)為abstract。這兩種實(shí)現(xiàn)方式,我覺得從功能上講是一樣的,但是從類設(shè)計上講是不同的。下面代碼中的實(shí)現(xiàn),我是參考了java.util.AbstractList* @throws UnsupportedOperationException * if adding to this List is not supported.public abstract class AbstractCar implements Drivable { public abstract Engine getEngine; public abstract Wheel getWheel; @Override public void drive{ throw new UnsupportedOperationException; } // 省略其他方法和屬性 }默認(rèn)情況下“汽車”是不能開的,你實(shí)現(xiàn)了一個汽車類后,需要Override這個方法,實(shí)現(xiàn)自己的drive方法以java容器中的List舉例

我是如何理解Java抽象類和接口的

 

到源碼里面找,你就會發(fā)現(xiàn)的繼承關(guān)系最頂層的就是Iterable,就表示說List是可以遍歷的,而且它還會產(chǎn)生一個Iterator接口對象。這表示一個列表可以通過這個迭代器來遍歷。

這就像上面說的,所有的交通工具都是可以駕駛的一樣,所有的列表都是可以遍歷的。

一層一層往下,類就變得更加具體。

***

為什么接口可以繼承?

其實(shí)這個原理很簡單。因?yàn)榭傆幸粋€最本質(zhì)的協(xié)議來約束大家,比如所有的交通工具都是可以駕駛的,所有的容易都是可以遍歷的。然后協(xié)議會漸漸變得更加具體:

Iterable <- Collection <- List <- AbstractList <- List

從下往上看,就是一層比一層抽象。

就像我在文章開頭說的,

責(zé)任編輯:王雪燕
相關(guān)推薦

2012-02-29 09:32:01

Java

2011-07-12 15:58:48

java抽象類接口

2009-04-30 15:15:01

Java抽象類接口

2011-07-10 14:07:59

JAVA

2010-03-04 09:40:04

Java接口抽象類

2009-08-14 15:42:11

什么是.NET接口.NET抽象類

2011-05-19 18:01:56

JAVA

2009-06-16 11:30:00

Java抽象類Java接口

2009-06-14 21:31:29

Java抽象類Java接口

2011-12-22 10:48:21

Java

2011-06-28 10:55:20

C#接口抽象類

2011-07-06 10:33:31

C#

2009-12-07 14:53:13

PHP抽象類應(yīng)用

2009-08-10 10:04:25

C#抽象類C#接口

2009-07-30 18:36:00

C#接口C#抽象類

2009-08-14 15:54:17

C#接口和抽象類

2020-10-19 13:03:16

Java 8接口抽象類

2021-12-23 07:11:31

開發(fā)

2021-01-26 05:26:33

Java抽象類接口

2009-11-23 20:00:25

PHP5接口PHP5抽象類
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號