摘要:抽象方法沒有方法體抽象方法權限修飾符不能為抽象方法的目的就是為了讓子類繼承重寫的,所以抽象方法不能私有,不能修飾。另外,添加默認方法不會影響函數式接口的使用。
原文:抽象類和接口的區別已經變了
隨著JDK的不斷迭代,抽象類和接口的區別已經有了些許改變,你是否還停留在JDK 7 的答案呢?
定義抽象類定義通過 abstract class
public abstract class A {}
接口定義通過 abstract(默認) interface
public abstract interface A {}派生方式
子類繼承抽象類通過 extends , 單繼承
public abstract class A {} public class B extends A {}
抽象類實現接口通過 implements , 多實現,接口繼承接口通過 extends
public interface A {} public interface B {} public interface C extends A {} public class D implements B,C {}
子類(非抽象類)必須實現 抽象父類或接口 的全部未實現方法
實例化抽象類和接口均不能實例化
抽象類可以有構造方法,接口不能有構造方法
public abstract class A { public A () {} }屬性
接口中定義屬性只能是 (public)靜態常量
public interface A { //默認(public static final) String A="ABC"; String A = "ABC"; }
抽象類中可以定義有任意變量常量
//任意訪問修飾符的變量及常量 public abstract class A { private String a = "a"; boolean b = true; public char c = "a"; protected int d = 2; public static final int e = 1; }方法 抽象類
抽象類中可以和普通類中一樣擁有各自普通方法,也可以擁有(不必須)抽象方法。
抽象方法沒有方法體
抽象方法權限修飾符不能為 pirvate
public abstract class A { // protected or default public abstract void a(); }
抽象方法的目的就是為了讓子類繼承重寫的,所以抽象方法不能私有,不能final修飾。接口 JDK 7
只能有方法的聲明
方法必須聲明為 public (默認)
public interface A { //默認(public abstract) void test(); void test(); }JDK 8
增加默認實現方法
public interface A { // 這里的 default 不能省略 public(默認自動添加) default void defaultMethod(){ //do something } }
默認方法的出現主要是面向類庫的開發者的,在堆接口進行擴展時,大量的實現類會讓人望而卻步。擁有默認方法后,子類可直接繼承使用或重寫。另外,添加默認方法不會影響函數式接口的使用。
增加靜態方法
public interface A { // 靜態方法 public(默認自動添加) static void staticMethod(){ //do something } }
靜態方法的調用直接通過接口名調用A.staticMethod() ,子類無法重寫(override), 但可以有同名方法。JDK 9
增加私有方法
public interface A { // 不能被子類繼承或重寫 private void privateMethod(){ //do something } }
增加私有靜態方法
public interface A { // 不能被子類繼承或重寫 private static void privateStaticMethod(){ //do something } }
這兩種私有方法其實是對JDK8 默認方法和靜態方法 的補充,這樣可以避免代碼的冗余。設計
抽象類是對一組類的共同特征進行抽象 ,是子類的模板(is-a)
接口是對行為的抽象,是一種行為的規范和約束 (like-a)
往期文章一覽千萬不要這樣使用 Arrays.asList !
八張圖帶你認識Java
Java開發必備手冊
關注微信公眾號 「碼上實戰」 回復 :面試視頻 和 架構師 送你非常不錯的資料!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/75624.html
摘要:如果一個非抽象類遵循了某個接口,就必須實現該接口中的所有方法。抽象類是對整個類整體進行抽象,包括屬性行為,但是接口卻是對類局部行為進行抽象。因此最好的解決辦法是單獨將報警設計為一個接口,包含行為設計為單獨的一個抽象類,包含和兩種行為。 一、抽象類 二、接口 三、抽象類和接口的區別 一、抽象類 在了解抽象類之前,先來了解一下抽象方法。抽象方法是一種特殊的方法:它只有聲明,而沒有具體的實現...
摘要:本文中,作者通過多個方面深入剖析抽象類和接口的區別,并結合經驗供讀者借鑒學習,本文系工程師編譯整理。在開發人員崗位面試時,是否了解抽象類和接口之間的基本區別是一個很重要的考量因素。 【編者按】本文作者是Sebastian Malaca,是面向對象編程的狂熱者,不斷深化研究整潔代碼和高代碼質量。本文中,作者通過多個方面深入剖析抽象類和接口的區別,并結合經驗供讀者借鑒學習,本文系 OneA...
摘要:很多常見的面試題都會出諸如抽象類和接口有什么區別,什么情況下會使用抽象類和什么情況你會使用接口這樣的問題。在討論它們之間的不同點之前,我們先看看抽象類接口各自的特性。抽象類抽象類是用來捕捉子類的通用特性的。 很多常見的面試題都會出諸如抽象類和接口有什么區別,什么情況下會使用抽象類和什么情況你會使用接口這樣的問題。本文我們將仔細討論這些話題。 在討論它們之間的不同點之前,我們先看看抽象類...
摘要:在設計模式中,抽象類不能夠被實例化初始化,但是可以依靠具體類的繼承來實現。對于大型項目來說,對象都是由基本的抽象類繼承實現,而這些類的方法通常都由接口來定義。 原文地址:PHP設計模式(二):抽象類和接口 Introduction 對于編程來說,對事物的抽象是一個老生常談的話題,抽象問題更利于面向對象編程以及程序設計模式。和C/C++,Java,Python等語言一樣,PHP也支持面向...
閱讀 2041·2023-04-25 15:11
閱讀 3461·2021-09-23 11:57
閱讀 1372·2021-07-26 23:38
閱讀 1319·2019-08-30 15:54
閱讀 635·2019-08-30 15:53
閱讀 3245·2019-08-26 13:36
閱讀 986·2019-08-26 12:01
閱讀 2863·2019-08-23 16:21