接口(interface)和抽象類(abstract class)是支持抽象類定義的兩種機制(注意,該句中前后兩個抽象類的意義不一樣,前者表示
的是一個實體,后者表示的是一個概念)。兩個具有很大的相似性,甚至有時候是可以互換的。但同時,兩者也存在很大的區別。
具體而言,接口是公開的,里面不能有私有的方法或者變量,是用於讓別人使用的,而抽象類是可以有私有方法或私有變量,
如果一個類中包含抽象方法,那么這個類就是抽象類。在Java語言中,可以通過把類或者類中的某些方法聲明為abstract(abstract
只能用來修飾類或者方法,不能用來修飾屬性)來表示一個類是一個抽象類。接口就是指一個方法的集合,接口中的所有方法都沒有方法體,在Java語言中,接口是通過關鍵字interface來實現的。
包含一個或多個抽象方法的類就必須聲明為抽象類,抽象類可以聲明方法的存在而不去實現它,被聲明為抽象的方法不能包含方法體。
在抽象類的子類中,實現方法必須含有相同的或者更高的訪問級別(public->protected->private)。抽象類在使用的過程中不能被實例
化,但是可以創建一個對象使其指向具體子類的一個實例。抽象類的子類為父類中所有的抽象方法提供具體的實現,否則,它們也是抽象類。接口可以被看作是抽象類的變體,接口中所有方法都是抽象的,可以通過接口來間接地實現多重繼承。接口中的成員變量都是static final類型,由於抽象類可以包含部分方法的實現,所以,在一些場合下抽象類比接口存在更多的優勢。
接口和抽象類的相同點如下
1)都不能被實例化
2)接口的實現類或抽象類的子類都只有實現了接口或抽象類中的方法后才能被實例化。
接口和抽象類的不同點如下
1)接口只有定義,不能有方法的實現,而抽象類可以有定義與實現,即其方法可以在抽象類中被實現。
2)實現接口的關鍵字為 implements,繼承抽象類的關鍵字為 extends。一個類可以實現多個接口,但一個類只能繼承一個抽象類,因此
,使用接口可以間接地達到多重繼承的目的。
3)接口強調特定功能的實現,其設計理念是“like-a”關系,而抽象類強調所屬關系,其設計理念為“is-a”關系。
4)接口中定義的成員變量默認為public static final,只能夠有靜態的不能被修改的數據成員,而且,必須給其賦值,其所有的成員方法都是public,abstract的,而且只能被這兩個關鍵字修飾。而抽象類可以有自己的數據成員變量,也可以有非抽象的成員方法,而且,抽象類中的成員變量默認為default,當然也可以被定義為pirvate,protected和public,這些成員變量可以在子類中被重新定義,也可以被重新賦值,抽象類中的抽象方法·(其前有abstract修飾)不能用private,static,synchronized和native等訪問修飾符修飾,同時方法必須以分號結尾,並且不帶花括號{}。所以,當功能需要累積時,使用抽象類;不需要累積時,使用接口。
5)接口被運用於實現比較常用的功能,便於日后維護或者添加刪除方法,而抽象類更傾向於充當公共類的角色,不適用於日后重新對里面的代碼進行修改。
