1. 程式人生 > >java 抽象類和接口

java 抽象類和接口

blank 進行 類定義 不能 str 同時 font 訪問 style

抽象類

  在java程序中,允許在定義方法時不寫方法實體,這種方法被稱為抽象方法,抽象方法必須使用abstract關鍵字修飾。抽象方法是一種特殊的方法:它只有聲明,而沒有具體的實現

abstract void fun();

如果一個類中定義了抽象方法,則該類必須定義為抽象類,抽象類也同樣使用abstract關鍵字修飾。

[public] abstract class
ClassName { abstract void fun(); }

  註意包含抽象方法的類必須聲明為抽象類,但是抽象類可以不包含任何抽象方法,只需要使用abstract關鍵字修飾即可。另外,抽象類不可以被實例化的,因為抽象類中可能包含抽象方法,抽象方法是沒有方法體的,不可以被調用。如果想要調用抽象類中定義的方法,則需要創建一個子類,在子類中將抽象類中的抽象方法進行實現。

  由此,抽象類就是為了繼承而存在的,如果定義了一個抽象類,卻不去繼承它,那麽等於白白創建了這個抽象類,因為你不能用它來作任何事情。對於一個父類,如果它的某個方法在父類中實現出來沒有任何意義,必須根據子類的實際需求來進行不同的實現,那麽就可以將這個方法聲明為abstract方法,此時這個類也就是abstract類了。

  包含抽象方法的類稱為抽象類,但並不意味這抽象類中只能有抽象方法,它和普通類一樣,同樣可以擁有成員變量和普通的成員方法。抽象類和普通類的主要有三點區別

  (1)抽象方法必須使用public或者protected(因為使用private,則不能被子類繼承),缺省情況下默認為public;

  (2)抽象類不能用來創建對象;

  (3)如果一個類繼承於一個抽象類,則子類必須實現父類的抽象方法。如果子類沒有實現父類的抽象方法,則必須將子類也定義為abstract類。

接口

  在java中存在一種特殊的抽象類該類中只存在常量和抽象方法,而不存在變量定義和方法實現,這種特殊的類被稱為接口。接口是由常量和抽象方法組成的特殊類,是對抽象類的進一步抽象。定義接口時需要使用interface關鍵字。

註意:在接口中常量默認使用了public static final修飾(並且只能使用public static final,使用private修飾會報編譯錯誤),抽象方法默認使用了public abstract修飾

[public] interface InterfaceName { 
}

註意:在接口定義的的方法時,所有方法必須都是抽象的,所以不能通過實例化對象的方式調用接口中的方法。此時需要定義一個類,並使用implements關鍵字實現接口中的所有方法

class ClassName implements Interface1,Interface2,[....]{
}

  可以看出,允許一個類遵循多個特定的接口。如果一個非抽象類遵循了某個接口,就必須實現該接口中的所有方法。

 

接口和抽象類

 接口(interface)和抽象類(abstract class)是支持抽象類定義的兩種機制(註意,該句中前後兩個抽象類的意義不一樣,前者表示的是一個實體,後者表示的是一個概念)。兩只具有很大的相似性,但同時兩者具有很大的差別。

  具體而言,接口是公開的,裏面不能有私有的方法或變量,是用於讓別人使用的,而抽象類是可以有私有方法和私有變量的,如果一個類中包含抽象方法,那麽這個類就是抽象類。在java語言中,可以通過把類或著類中的某些方法聲明為abstract(abstract只能用來修飾類或者方法,不能用來修飾屬性)來表示一個類的抽象類。接口就是指一個方法的集合,接口中所有的方法都沒有方法體,在java語言中,接口就是通過interface來實現的。

  包含一個或者多個抽象方法的類必須聲明為抽象類,抽象類可以聲明方法的存在而不去實現他,被聲明為抽象的方法不能包含方法體。在抽象子類中,實現方法必須含有相同或者更低的訪問基本(public->protected->private)。抽象類在使用過程中不能被實例化,但是可以創建一個對象使其指向具體子類的一個實例。抽象類的子類為父類中所有的抽象方法提供具體的實現,否則他們也是抽象類。接口可以看作抽象類的變體,接口中所有的方法收拾抽象的,可以通過多接口來間接實現多重繼承。由於抽象類可以包含部分方法的實現,所有,在一些場合下,抽象類比接口存在更多優勢。

接口和抽象類的相同點:

  (1)都不能被實例化。

  (2)接口的實現類或者抽象類的子類都只有實現了接口或者抽象類中的方法後才能被實例化。

接口和抽象類的不同點:

  (1)接口只有定義,不能有方法的實現,而抽象類中可以有定義與實現,即其方法可以在抽象類中被實現。

  (2)實現接口的關鍵字為implement,繼承抽象類額關鍵字為extends。一個類可以實現多個接口,但一個類只能繼承一個抽象類,因此沒使用接口可以間接地達到多重繼承的目的。

  (3)接口強調特定功能的實現,其設計理念是“has-a”關系,而抽象類強調所屬關系,其設計理念是“is-a”關系。

  (4)接口中定義的成員變量默認為public static final,只能夠有靜態的不能被修改的數據成員,而且不許給其賦初值,其所有成員方法都是public、abstract的,而且主能被這兩個關鍵子修飾。而抽象類可以有自己的數據成員變量,也可以有非抽象的成員方法,而且,抽象類中的成員默認為default,當然也可以被定義為private、protected和public,而這些成員可以在子類中被重新定義,也可以被重新賦值,抽象類中的抽象方法(用abstract修飾)不能用private、static、synchronized和native等訪問修飾符修飾,同時方法必須以分號結尾,並且不帶花括號{}。所以,當功能需要累計時,使用抽象類;不需要累計時,使用接口。

  (5)接口被運用與實現比較常用的功能,便於日後維護或者添加刪除方法,而抽象類更傾向與充當公共類的角色,不適用於日後重新對裏面的代碼進行修改。

參考:

https://www.cnblogs.com/dolphin0520/p/3811437.html

2018-10-02 22:41:11

java 抽象類和接口