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