當前位置:首頁 » 編程語言 » java介面與抽象類的區別

java介面與抽象類的區別

發布時間: 2023-05-31 08:47:30

java抽象類與介面的區別

在Java語言中,abstractclass和interface是支持抽象類定義的兩種機制。正是由於這兩種機制的存在,才賦予了Java強大的面向對象能力。abstractclass和interface之間在對於抽象類定義的支持方面具有很大的相似性,甚至可以相互替換,因此很多開發者在進行抽象類定義時對於abstractclass和interface的選擇顯得比較隨意。其實,兩者之間還是有很大的區別的,對於它們的選擇甚至反映出對於問題領域本質的理解、對於設計意圖的理解是否正確、合理。本文將對它們之間的區別進行一番剖析,試圖給開發者提供一個在二者之間進行選擇的依據。



理解抽象類

abstractclass和interface在Java語言中都是用來進行抽象類(本文中的抽象類並非從abstractclass翻譯而來,它表示的是一個抽象體,而abstractclass為Java語言中用於定義抽象類的一種方法,請讀者注意區分)定義的,那麼什麼是抽象類,使用抽象類能為我們帶來什麼好處呢?


在面向對象的概念中,我們知道所有的對象都是通過類來描繪的,但是反過來卻不是這樣。並不是所有的類都是用來描繪對象的,如果一個類中沒有包含足夠的信息來描繪一個具體的對象,這樣的類就是抽象類。抽象類往往用來表徵我們在對問題領域進行分析、設計中得出的抽象概念,是對一系列看上去不同,但是本質上相同的具體概念的抽象。比如:如果我們進行一個圖形編輯軟體的開發,就會發現問題領域存在著圓、三角形這樣一些具體概念,它們是不同的,但是它們又都屬於形狀這樣一個概念,形狀這個概念在問題領域是不存在的,它就是一個抽象概念。正是因為抽象的概念在問題領域沒有對應的具體概念,所以用以表徵抽象概念的抽象類是不能夠實例化的。


在面向對象領域,抽象類主要用來進行類型隱藏。我們可以構造出一個固定的一組行為鎮罩的抽象描述,但是這組行為卻能夠有任意個可能的具體實現方式。這個抽象描述就是抽象類,而這一組任意個可能的具體實現則表現為所有可能的派生類。模塊可以操作一個抽象體。由於模塊依賴於一個固定的抽象體,因此它可以是不允許修改的;同時,通過從這個抽象體派生,也可擴展此模塊的行為功能。熟悉OCP的讀者一定知道,為了能夠實現面向對象設計的一個最核心的原則OCP(Open-ClosedPrinciple),抽象類是其中的關鍵所在。


從語法定義層面看abstractclass和interface

在語法層面,Java語言對於abstractclass和interface給出了不同的定義方式,下面以定義一個名為Demo的抽象類為例來說明這種不同。

使用abstractclass的方式定義Demo抽象類的方式如下:


abstractclassDemo{

abstractvoidmethod1();

abstractvoidmethod2();



使用interface的方知數式定義Demo抽象類的方式如下:


interfaceDemo{

voidmethod1();

voidmethod2();

}


在abstractclass方式中,Demo可以有自己的數據成員,也可以有非abstract的成員方法,而在interface方式的實現中,Demo只能夠有靜態的不能被修改的數據成員(也就是必須是staticfinal的,不過在interface中一般不定義數據成員),所有的成員方法都是abstract的。從某種意義上說,interface是一種特殊形式的abstractclass。


編程的角度來看,abstractclass和interface都可以用來實現"designbycontract"的思想。但是在具體的使用上面還是有一些區別的。


首先,abstractclass在Java語言中表示的是一種繼承關系,一個類只能使用一次繼承關系(因為Java不支持多繼承--轉注)。但是,一個類卻可以實現多個interface。也許,這是Java語言的設計者在考慮Java對御猛鬧於多重繼承的支持方面的一種折中考慮吧。


其次,在abstractclass的定義中,我們可以賦予方法的默認行為。但是在interface的定義中,方法卻不能擁有默認行為,為了繞過這個限制,必須使用委託,但是這會增加一些復雜性,有時會造成很大的麻煩。


在抽象類中不能定義默認行為還存在另一個比較嚴重的問題,那就是可能會造成維護上的麻煩。因為如果後來想修改類的界面(一般通過abstractclass或者interface來表示)以適應新的情況(比如,添加新的方法或者給已用的方法中添加新的參數)時,就會非常的麻煩,可能要花費很多的時間(對於派生類很多的情況,尤為如此)。但是如果界面是通過abstractclass來實現的,那麼可能就只需要修改定義在abstractclass中的默認行為就可以了。


同樣,如果不能在抽象類中定義默認行為,北大青鳥回龍觀計算機學院認為會導致同樣的方法實現出現在該抽象類的每一個派生類中,違反了"onerule,oneplace"原則,造成代碼重復,同樣不利於以後的維護。因此,在abstractclass和interface間進行選擇時要非常的小心。


Ⅱ java中的抽象類與介面有什麼異同

相同點:
(1)都不能被實例化
(2)介面的實現類或抽象類的子類都只有實現了介面或抽象類中的方法後才能實例化。
不同點:
(1)介面只有定義,不能有方法的實現,java 1.8中可以定義default方法體,而抽象類可以有定義與實現,方法可在抽象類中實現。
(2)實現介面的關鍵字為implements,繼承抽象類的關鍵字為extends。一個類可以實現多個介面,但一個類只能繼承一個抽象類。所以,使用介面可以間接地實現多重繼承。
(3)介面強調特定功能的實現,而抽象類強調所屬關系。
(4)介面成員變數默認為public static final,必須賦初值,不能被修改;其所有的成員方法都是public、abstract的。抽象類中成員變數默認default,可在子類中被重新定義,也可被重新賦值;抽象方法被abstract修飾,不能被private、static、synchronized和native等修飾,必須以分號結尾,不帶花括弧。
(5)介面被用於常用的功能,便於日後維護和添加刪除,而抽象類更傾向於充當公共類的角色,不適用於日後重新對立面的代碼修改。功能需要累積時用抽象類,不需要累積時用介面。

Ⅲ java介面和抽象類的異同

您好,對於你的遇到的問題,我很高興能為你提供幫助,我之前也遇到過喲,以下是我的個人看法,希望能幫助到你,若有錯誤,還望見諒!。在Java語言中,介面(Interface)是對符合介面需求的類的一套規范。介面與包相似,也是用來組織應用中的各類並調節它們的相互關系的一種結構,更准確地說,介面是用來實現類間多重繼承功能的結構1介面概念介面主要作用是可以幫助實現類似於類的多重繼承的功能。在Java中,出於簡化程序結構的考慮,不再支持類間的多重繼承而只支持單重繼承,即一個類至多隻能有一個直接父類。然而在解決實際問題的過程中,僅僅依靠單重繼承在很多情況下都不能將問題的復雜性表述完整,需要其他的機製作為輔助。2介面聲明Java中聲明介面的語法如下:[public]interface介面名[extends父介面名列表]{//介面體;//常量域聲明[public][static][final]域類型域名=常量值;//抽象方法聲明[public][abstract]返回值方法名(參數列表)[throw異常列表];}從上面的語法規定可以看出,定義介面與定義類非常相似,實際上完全可以把介面理解成為一種特殊的類,介面是由常量和抽象方法組成的特殊類(1)介面中的屬性都是用final修飾的常量,(2)介面中的方法都是用abstract修飾的抽象方法,在介面中只能給出這些抽象方法的方法名、返回值和參數列表,而不能定義方法體,即僅僅規定了一組信息交換、傳輸和處理的「介面」2介面的實現一個類要實現某個或某幾個介面時,有如下的步驟和注意事項:(1)在類的聲明部分,用implements關鍵字聲明該類將要實現哪些介面;如下:class類名implements介面{}(2)如果實現某介面的類不是abstract的抽象類,則在類的定義部分必須實現指定介面的所有抽象方法,即為所有抽象方法定義方法體,而且方法頭部分應該與介面中的定義完全一致,即有完全相同的返回值和參數列表;(3)如果實現某介面的類是abstract的抽象類,則它可以不實現該介面所有的方法。(4)一個類在實現某介面的抽象方法時,必須使用完全相同的方法頭。(5)介面的抽象方法,其訪問限制符都已指定是public,所以類在實現方法時,必須顯式地使用public修飾符。一個介面的定義由關鍵字interface開始以包含pubicfinalstatic數據。但這不是必須的,即子類也可以使用一個方並包含一套publicabstract方法,介面也可為使用介面,一個類必須聲明實現(關鍵字implements)介面,指定的參數個數和返回類型定義每個方法。當沒有預設的實現用來繼承時,通常使用介面而不使用抽象類。當某個類實現一個介面時,也有同樣的「是一個」繼承性關系。並且必須根據介面中為實現一個以上的介面,只要在類定義中的關鍵字implements後面列出介面名逗號分隔。非常感謝您的耐心觀看,如有幫助請採納,祝生活愉快!謝謝!

Ⅳ java中介面和抽象類的區別是什麼

定義的關鍵字:abstract class;interface;
組成:常量,變數,抽象方法,普通方法,構造方法;全局常量,抽象方法;
許可權:可以是各種許可權;只能是public;
關系:抽象類可以實現多個介面;介面不能實現抽象類;
使用:子類利用extends;子類利用implements實現介面;
涉及的設計模式:模板設計模式;工廠,代理設計模式;
局限性:一個子類只能繼承一個抽象類;一個子類可以繼承多個介面;

如果抽象類和介面都能實現的操作,一般選擇介面,因為可以避免單繼承局限;

Ⅳ JAVA抽象類和介面的區別,使用場景

技術上的區別:

  1. 抽象類可以擁有方法的實現,而介面只能擁有方法的聲明。

  2. 一個類只能有一個抽象的基類,但是可以有多個介面。

語義上的區別(這個更有意義,也更難理解)這個與設計相關,合理使用並且區分抽象類和介面能讓自己的設計更加靈活和健壯。

抽象類代表一個類實體,只是這類實體無法被實例化。而介面則一般不能夠代表實體,只能夠代表一個功能,或是一個屬性。

舉個例子來說,圖形類,Shape,能夠派生為三角形,正方形等等。Shape就是一個抽象類,代表圖形這個實體,但是確實無法實例化。它有一個介面,Drawable,這個介面說明它可以被畫出來。從英語上面來說,Shape是名詞,Drawable是形容詞。這就是語義上面的差別。當然你非要把Drawable聲明成抽象類,Shape變成介面,技術上確實沒問題,但是這個涉及就很奇怪,難以理解。


如果你覺得不太理解,你可以追問。這兩個概念確實有些模糊。


研究設計是好事情,設計意識的好壞很影響自己在軟體工程這個領域能夠達到的高度。

Ⅵ 抽象類和介面有什麼區別

答得稀爛。。。
網上再學習了一次,在這里記下看到各位大蝦的金言。
一、抽象類:
在面向對象領域,抽象類主要用來進行類型隱藏。那什麼是類型隱藏呢?我們可以構造出一個固定的一組行為的抽象描述,但是這組行為卻能夠有任意個可能的具體實現方式。這個抽象描述就是抽象類,而這一組任意個可能的具體實現則表現為所有可能的派生類。好比,動物是一個抽象類,人、猴子、老虎就是具體實現的派生類,我們就可以用動物類型來隱藏人、猴子和老虎的類型。( 參考doSome方法)二、介面:
三、抽象類和介面的區別:
首先,抽象類在Java語言中表示的是一種繼承關系,一個類只能使用一次繼承關系。但是,一個類卻可以實現多個介面。也許,這是Java語言的設計者在考慮Java對於多重繼承的支持方面的一種折中考慮吧。 其次,在抽象類的定義中,我們可以賦予方法的默認行為。但是在介面的定義中,方法卻不能擁有默認行為,為了繞過這個限制,必須使用委託,但是這會 增加一些復雜性,有時會造成很大的麻煩。 抽象類在Java語言中體現了一種繼承關系,要想使得繼承關系合理,父類和派生類之間必須存在」is a」關系,即父類和派生類在概念本質上應該是相同的。對於介面來說則不然,並不要求介面的實現者和介面定義在概念本質上是一致的,僅僅是實現了介面定義的契約而已。介面表示的是」like
a」關系。 使用抽象類來定義允許多個實現的類型,比使用介面有一個明顯的優勢:抽象類的演化比介面的演化要容易的多。在後續的發行版中,如果希望在抽象類中增加一個方法,只增加一個默認的合理的實現即可,抽象類的所有實現都自動提供了這個新的方法。對於介面,這是行不通的。雖然可以在骨架實現類中增加一方法的實現來解決部分問題,但這不能解決不從骨架實現類繼承的介面實現的問題。由此,設計公有的介面要非常謹慎,一旦一個介面被公開且被廣泛實現,對它進行修改將是不可能的。 所以,使用介面還是抽象類,取決於我們對問題的概念的本質理解和設計的意圖。
Java介面與抽象類的相同點:
1. 都不能被實例化。
2. 都能包含抽象方法。
抽象類與介面緊密相關。然介面又比抽象類更抽象,這主要體現在它們的差別上:1)類可以實現無限個介面,但僅能從一個抽象(或任何其他類型)類繼承,從抽象類派生的類仍可實現介面,從而得出介面是用來解決多重繼承問題的。2)抽象類當中可以存在非抽象的方法,可介面不能且它裡面的方法只是一個聲名必須用public來修飾沒有具體實現的方法。3)抽象類中的成員變數可以被不同的修飾符來修飾,可介面中的成員變數默認的都是靜態常量(static fainl)。4)這一點也是最重要的一點本質的一點抽象類是對象的抽象,然介面是一種行為規范。
例如每個介面可以代表一種最頂層的抽象,可以理解為代表一類東西,如果一個類實現了多個介面,那這個類就有了多種類型,即介面是定義混合類型的理想工具最後:有一種設計模式,就是,默認適配模式,意思就是說,首先定義一個介面,通過抽象類實現這個介面,並實現一些子類不需要一定實現的方法,然後,子類就可以選擇是繼承介面,實現所有方法,還是直接繼承這個抽象類實現具體需要的方法,
定義成抽象類是為了以後要其子類來繼承的,因為父類里有很多方法是無法定義具體的實現的,只能定義一個原型,讓子類來分別實現!所以要定義成抽象的!
簡單來說就是
抽象類是在介面和實體類之間的一個橋梁例如做一個介面叫做飛行FlyAnimalAction,裡面定義一個方法叫做flying,再定義一個方法叫做eat
做一個類叫做蚊子實現介面,蚊子要實現flying方法,實現自己的eat方法
做一個類叫做蒼蠅實現介面,蒼蠅也要實現flying方法,實現自己的eat方法
你發現所有會飛的動物都要實現這個介面,很麻煩,不如
做一個抽象類FlyAnimal,然後實現上面的介面
在裡面實現flying這個方法,因為大部分的飛行動作是一樣的,而eat方法則繼續寫成抽象方法,因為大部分的動物吃東西是不一樣的
下面你再寫蚊子類就簡單了,可以直接繼承這個抽象類,然後實現自己的吃方法就行了
而且蒼蠅類的製作也是一樣,這個時候抽象類的功能就顯示出來了,當然抽象類的功能遠遠不是這些,只是初期理解到這里就夠了。

Ⅶ java介面與抽象類有什麼區別

一個是介面,一個是抽象類,介面這相當於你定義了一些規范,然後下面的用這個規范去開發

Ⅷ java介面和抽象類的區別舉例

1、抽象類是類,它的子類不能再繼承其它類了,但可以實現一個和多個介面。介面不是類,它的子介面可以繼承多個介面。
2、抽象類中是可以有不用abstract修飾的方法,而介面中只能有抽象方法,即方法都要用abstract修飾。
3、抽象類可以實現介面,而介面是不能繼承或實現抽象類的。
有人說,介面類似於抽象類,這是指它提供的方法只有方法頭,而抽象類也有這樣的情況。
但實際上,區別是很大的,介面提供了一種JAVA中類不能多繼承時引起的不便的一種解決方案,提高了靈活性。同時,接更有利於實現程序的擴展。

Ⅸ 「抽象類」和「介面」的區別是什麼

它們的區別主要有以下幾點:

1、 介面是抽象類的變體,介面比抽象類更加抽象,介面中所有的方法都是抽象的。

2、每個類只能繼承一個抽象類,但是可以實現多個介面。

3、抽象類中不一定都是抽象方法,抽象的而抽象類可以實現部分方法。但是介面中方法必須為public修飾的、抽象的不能實現具體的法。

4、介面中基本數據類型為static而抽象類不是的。


(9)java介面與抽象類的區別擴展閱讀:

抽象類往往用來表徵對問題領域進行分析、設計中得出的抽象概念,是對一系列看上去不同,但是本質上相同的具體概念的抽象。

通常在編程語句中用 abstract 修飾的類是抽象類。在C++中,含有純虛擬函數的類稱為抽象類,它不能生成對象;在java中,含有抽象方法的類稱為抽象類,同樣不能生成對象。

抽象類是不完整的,它只能用作基類。在面向對象方法中,抽象類主要用來進行類型隱藏和充當全局變數的角色。

介面泛指實體把自己提供給外界的一種抽象化物(可以為另一實體),用以由內部操作分離出外部溝通方法,使其能被內部修改而不影響外界其他實體與其交互的方式。

人類與電腦等信息機器或人類與程序之間的介面稱為用戶界面。電腦等信息機器硬體組件間的介面叫硬體介面。電腦等信息機器軟體組件間的介面叫軟體介面。

在計算機中,介面是計算機系統中兩個獨立的部件進行信息交換的共享邊界。這種交換可以發生在計算機軟、硬體,外部設備或進行操作的人之間,也可以是它們的結合。

Ⅹ java中抽象類和介面的區別

抽象類是用來捕捉子類的通用特性的 。它不能被實例化,只能被用作子類的超類。抽象類是被用來創建繼承層級里子類的模板。

介面是抽象方法的集合。如果一個類實現了某個介面,那麼它就繼承了這個介面的抽象方法。這就像契約模式,如果實現了這個介面,那麼就必須確保使用這些方法。介面只是一種形式,介面自身不能做任何事情。

(10)java介面與抽象類的區別擴展閱讀:

抽象類往往用來表徵對問題領域進行分析、設計中得出的抽象概念,是對一系列看上去不同,但是本質上相同的具體概念的抽象。

通常在編程語句中用 abstract 修飾的類是抽象類。在C++中,含有純虛擬函數的類稱為抽象類,它不能生成對象;在java中,含有抽象方法的類稱為抽象類,同樣不能生成對象。

抽象類是不完整的,它只能用作基類。在面向對象方法中,抽象類主要用來進行類型隱藏和充當全局變數的角色。

熱點內容
內置存儲卡可以拆嗎 發布:2025-05-18 04:16:35 瀏覽:335
編譯原理課時設置 發布:2025-05-18 04:13:28 瀏覽:378
linux中進入ip地址伺服器 發布:2025-05-18 04:11:21 瀏覽:612
java用什麼軟體寫 發布:2025-05-18 03:56:19 瀏覽:31
linux配置vim編譯c 發布:2025-05-18 03:55:07 瀏覽:107
砸百鬼腳本 發布:2025-05-18 03:53:34 瀏覽:942
安卓手機如何拍視頻和蘋果一樣 發布:2025-05-18 03:40:47 瀏覽:739
為什麼安卓手機連不上蘋果7熱點 發布:2025-05-18 03:40:13 瀏覽:802
網卡訪問 發布:2025-05-18 03:35:04 瀏覽:510
接收和發送伺服器地址 發布:2025-05-18 03:33:48 瀏覽:371