java abstract class和interface有什麼區別

在Java語言中,abstract class和interface是支持抽象類定義的兩種機制。正是因爲這兩種機制的存在,才賦予了Java強大的面向對象能力。abstract class和interface之間在對於抽象類定義的支持方面具備很大的類似性,甚至能夠相互替換,所以不少開發者在進行抽象類定義時對於abstract class和interface的選擇顯得比較隨意。其實,二者之間仍是有很大的區別的,對於它們的選擇甚至反映出對於問題領域本質的理解、對於設計意圖的理解是否正確、合理。 函數

 abstract class和interface在Java語言中都是用來進行抽象類(本文中的抽象類並不是從abstract class翻譯而來,它表示的是一個抽象體,而abstract class爲Java語言中用於定義抽象類的一種方法)定義的,那麼什麼是抽象類,使用抽象類能爲咱們帶來什麼好處呢?翻譯

 聲明方法的存在而不去實現它的類被叫作抽象類(abstract class),它用於要建立一個體現某些基本行爲的類,併爲該類聲明方法,但不能在該類中實現該類的狀況。不能建立abstract 類的實例。然而能夠建立一個變量,其類型是一個抽象類,並讓它指向具體子類的一個實例。不能有抽象構造函數或抽象靜態方法。Abstract 類的子類爲它們父類中的全部抽象方法提供實現,不然它們也是抽象類爲。取而代之,在子類中實現該方法。知道其行爲的其它類能夠在類中實現這些方法。設計

 接口(interface)是抽象類的變體。在接口中,全部方法都是抽象的。多繼承性可經過實現這樣的接口而得到。接口中的全部方法都是抽象的,沒有一個有程序體。接口只能夠定義static final成員變量。接口的實現與子類類似,除了該實現類不能從接口定義中繼承行爲。當類實現特殊接口時,它定義(即將程序體給予)全部這種接口的方法。而後,它能夠在實現了該接口的類的任何對象上調用接口的方法。因爲有抽象類,它容許使用接口名做爲引用變量的類型。一般的動態聯編將生效。引用能夠轉換到接口類型或從接口類型轉換,instanceof 運算符能夠用來決定某對象的類是否實現了接口。對象

 接口能夠繼承接口。抽象類能夠實現(implements)接口,抽象類是能夠繼承實體類,但前提是實體類必須有明確的構造函數。接口更關注「能實現什麼功能」,而無論「怎麼實現的」。繼承

 1.相同點接口

A. 二者都是抽象類,都不能實例化。開發

B. interface實現類及abstrct class的子類都必需要實現已經聲明的抽象方法。 io

2. 不一樣點ast

A. interface須要實現,要用implements,而abstract class須要繼承,要用extends。 class

B. 一個類能夠實現多個interface,但一個類只能繼承一個abstract class。 

C. interface強調特定功能的實現,而abstract class強調所屬關係。 

D. 儘管interface實現類及abstrct class的子類都必需要實現相應的抽象方法,但實現的形式不一樣。interface中的每個方法都是抽象方法,都只是聲明的(declaration, 沒有方法體),實現類必需要實現。而abstract class的子類能夠有選擇地實現。

 這個選擇有兩點含義:

一是Abastract class中並不是全部的方法都是抽象的,只有那些冠有abstract的方法纔是抽象的,子類必須實現。那些沒有abstract的方法,在Abstrct class中必須定義方法體。 

二是abstract class的子類在繼承它時,對非抽象方法既能夠直接繼承,也能夠覆蓋;而對抽象方法,能夠選擇實現,也能夠經過再次聲明其方法爲抽象的方式,無需實現,留給其子類來實現,但此類必須也聲明爲抽象類。既是抽象類,固然也不能實例化。 

E. abstract class是interface與Class的中介。 interface是徹底抽象的,只能聲明方法,並且只能聲明pulic的方法,不能聲明private及protected的方法,不能定義方法體,也不能聲明實例變量。然而,interface卻能夠聲明常量變量,而且在JDK中不難找出這種例子。但將常量變量放在interface中違背了其做爲接口的做用而存在的宗旨,也混淆了interface與類的不一樣價值。若是的確須要,能夠將其放在相應的abstract class或Class中。 

abstract class在interface及Class中起到了承上啓下的做用。一方面,abstract class是抽象的,能夠聲明抽象方法,以規範子類必須實現的功能;另外一方面,它又能夠定義缺省的方法體,供子類直接使用或覆蓋。另外,它還能夠定義本身的實例變量,以供子類經過繼承來使用。 

3. interface的應用場合 

A. 類與類以前須要特定的接口進行協調,而不在意其如何實現。 

B. 做爲可以實現特定功能的標識存在,也能夠是什麼接口方法都沒有的純粹標識。 

C. 須要將一組類視爲單一的

相關文章
相關標籤/搜索