abstract 的理解
abstract(抽象)可以修飾類、方法
如果將一個類設置為abstract,則此類必須被繼承使用。此類不可生成對象,必須被繼承使用。
abstract 和 static 不能放在一起,否則便會出現錯誤。(這是因為static不可被覆蓋,而abstract為了生效必須被覆蓋。)
abstract 和 final 不能放在一起,否則便會出現錯誤。
抽象類的意義
為其子類提供一個公共的類型 封裝子類中得重復內容 定義抽象方法,子類雖然有不同的實現 但是定義是一致的
接口特性
接口中每一個方法也是隱式抽象的,接口中的方法會被隱式的指定為 public abstract(只能是 public abstract,其他修飾符都會報錯)。
接口中可以含有變量,但是接口中的變量會被隱式的指定為 public static final 變量(并且只能是 public,用 private 修飾會報編譯錯誤)。
接口中的方法是不能在接口中實現的,只能由實現接口的類來實現接口中的方法。
接口的意義
提供一個規范,要求類必須實現指定的方法。
解決 Java 中的單繼承問題,可以用接口來實現多繼承的功能,簡單化多重繼承中繼承樹的復雜程度。
增強程序的擴展性。
抽象類和接口的區別
抽象類中的方法可以有方法體,就是能實現方法的具體功能,但是接口中的方法不行。
抽象類中的成員變量可以是各種類型的,而接口中的成員變量只能是 public static final 類型的。
接口中不能有靜態代碼塊以及靜態方法(用 static 修飾的方法),而抽象類中可以有靜態代碼塊和靜態方法。注意:Java 8的新特性允許接口中存在靜態方法。
一個類只能繼承一個抽象類,而一個類卻可以實現多個接口。
接口中不能有構造函數和main方法;而抽象類中可以有。
接口與類的區別
接口不能用于實例化對象。
接口沒有構造方法。
接口中所有的方法必須是抽象方法。
接口不能包含成員變量,除了 static 和 final 變量。
接口不是被類繼承了,而是要被類實現。
接口支持多重繼承。
接口是否可繼承接口? 抽象類是否可實現(implements)接口? 抽象類是否可繼承實體類(concreteclass)?
接口可以繼承接口。但是要使用extends,而不是用implements。
抽象類可以實現接口。
比如java.util中的AbstractCollection類就是實現的Collection接口。
抽象類可以繼承實體類。
eg:
interface MyInterface {}
interface AnotherInterface extends MyInterface {}
class EntityClass {}
abstract class AbstractClass extends EntityClass implements MyInterface {}