(1) abstract(抽象)類別和介面都可以有abstract(抽象)方法。
(2) 介面中只可以有常數,不能有變量,而abstract類別中既可以有常數也可以有變量。
(3) abstract類別中也可以有非abstract方法,介面不可以。
在設計程式時應根據具體的分析來確定是使用抽象類別還是介面。 abstract類別除了提供重要的需要子類別重寫的abstract方法以外,還提供了子類別可以繼承的變數和非abstract方法。
如果某個問題需要使用繼承才能更好地解決,例如:子類別除了需要重寫父類別的abstract方法以外,還需要從父類別繼承一些變數或繼承一些重要的非abstract方法,就可以考慮用abstract類。如果某個問題不需要繼承,只是需要若干個類別給出某些重要的abstract方法的實作細節,就可以考慮使用介面。
注意:JDK1.8介面支援靜態方法和預設方法。
1)介面不能用於實例化物件。
2)接口沒有構造方法。
3)介面中所有的方法必須是抽象方法。
4)介面不能包含成員變量,除了static和final變數。
5)介面不是被類別繼承,而是要被類別實作。
6)介面支援多繼承。
預設方法就是介面可以有實作方法且不需要實作類別去實作其方法,只需要在方法名稱前面加上default關鍵字即可實作預設方法。預設方法提供了一種擴展介面的方法,而且還不會破壞現有程式碼。
(1) 介面預設方法、靜態方法可以有多個。
(2) 預設方法透過實例調用,靜態方法透過介面名調用。
(3) default關鍵字只能用在介面中。
(4) 預設方法可以被繼承,如果繼承多個接口,多個接口都定義多個相同的預設方法,實作類別需要重寫預設方法,不然會錯。
(5) 靜態方法不能被繼承和覆寫,所以只能被具體所在的介面呼叫。
注意:JDK1.9以後,允許將方法定義為private,使得某些複用的程式碼不會把方法暴露出去。