淺析Java中接口和抽象類的七大區(qū)別
Java 是一門面向?qū)ο蟮木幊陶Z言,面向?qū)ο蟮木幊陶Z言有四大特征:抽象、封裝、繼承和多態(tài)。
而本文介紹的接口和抽象類就是面向?qū)ο缶幊讨小俺橄蟆钡木唧w實(shí)現(xiàn),也就是說接口和抽象類都是用來定義實(shí)體類的公共行為的,它們是對(duì)實(shí)體類(對(duì)象)更高層次的抽象。
?說明:本文以下內(nèi)容基于 JDK 8 版本。
接口
接口是 Java 語言中的一個(gè)抽象類型,用于定義對(duì)象的公共行為。它的創(chuàng)建關(guān)鍵字是 interface,在接口的實(shí)現(xiàn)中可以定義方法和常量,其普通方法是不能有具體的代碼實(shí)現(xiàn)的,而在 JDK 8 之后,接口中可以創(chuàng)建 static 和 default 方法了,并且這兩種方法可以有默認(rèn)的方法實(shí)現(xiàn),如下代碼所示:
public interface Interface_1 { int count = 1; void sayHi(); // default 方法 default void print() { System.out.println("Do print method."); } // static 方法 static void smethod() { System.out.println("Do static method."); } }
接下來,創(chuàng)建一個(gè)類來實(shí)現(xiàn)以上接口:
public class InterfaceImpl_1 implements Interface_1 { @Override public void sayHi() { System.out.println("Hi,I am InterfaceImpl 1."); } public static void main(String[] args) { InterfaceImpl_1 inter = new InterfaceImpl_1(); inter.sayHi(); // 調(diào)用接口中 static 方法 InterfaceExample.smethod(); // 調(diào)用接口中的常量 count System.out.println(InterfaceExample.count); } }
以上程序的執(zhí)行結(jié)果如下:
通過上述代碼和執(zhí)行結(jié)果我們可以得出以下結(jié)論:
- JDK 8 中接口可以定義 static 和 default 方法,并且這兩種方法可以包含具體的代碼實(shí)現(xiàn)。
- 實(shí)現(xiàn)接口要使用 implements 關(guān)鍵字。
- 接口不能直接實(shí)例化。
- 接口中定義的變量默認(rèn)為 public static final 類型。
- 子類可以不重寫接口中的 static 和 default 方法,不重寫的情況下,默認(rèn)調(diào)用的是接口的方法實(shí)現(xiàn)。
抽象類
抽象類和接口類似,它也是用來定義對(duì)象的公共行為的,并且它也不能直接實(shí)例化,抽象類的實(shí)現(xiàn)關(guān)鍵字為 abstract class,子類用 extends 關(guān)鍵字繼承父類。
抽象類的使用如下:
public abstract class AbstractExample { // 定義普通變量 int count = 2; // 定義私有變量 private static int total = 10; // 定義抽象方法 public abstract void methodA(); // 定義普通方法 public void methodB() { System.out.println("Hi,methodB."); } }
接下來使用一個(gè)普通類繼承上面的抽象類:
public class AbstractSon extends AbstractExample { @Override public void methodA() { System.out.println("Hi,method A."); } public static void main(String[] args) { AbstractSon abs = new AbstractSon(); // 抽象類中的變量重新賦值 abs.count = 666; System.out.println(abs.count); // 抽象類中的抽象方法 abs.methodA(); // 抽象類中的普通方法 abs.methodB(); } }
以上程序的執(zhí)行結(jié)果如下:
通過上述代碼和執(zhí)行結(jié)果可以得出以下結(jié)論:
- 抽象類使用 abstract 關(guān)鍵字聲明。
- 抽象類中可以包含普通方法和抽象方法,抽象方法不能有具體的代碼實(shí)現(xiàn)。
- 抽象類需要使用 extends 關(guān)鍵字實(shí)現(xiàn)繼承。
- 抽象類不能直接實(shí)例化。
- 抽象類中屬性控制符無限制,可以定義 private 類型的屬性。
?接口和抽象類的區(qū)別主要體現(xiàn)在以下 7 個(gè)方面。
區(qū)別1:定義關(guān)鍵字不同
接口使用關(guān)鍵字 interface 來定義。
抽象類使用關(guān)鍵字 abstract 來定義。
區(qū)別2:繼承或?qū)崿F(xiàn)的關(guān)鍵字不同
接口使用 implements 關(guān)鍵字定義其具體實(shí)現(xiàn)。
抽象類使用 extends 關(guān)鍵字實(shí)現(xiàn)繼承。
區(qū)別3:子類擴(kuò)展的數(shù)量不同
接口的實(shí)現(xiàn)類可以有多個(gè),如下圖所示:
而抽象類的子類,只能繼承一個(gè)抽象類,如下圖所示,繼承多個(gè)抽象類就會(huì)報(bào)錯(cuò):
在 Java 語言中,一個(gè)類只能繼承一個(gè)父類(單繼承),但可以實(shí)現(xiàn)多個(gè)接口。
區(qū)別4:屬性訪問控制符不同
接口中屬性的訪問控制符只能是 public,如下圖所示:
接口中的屬性默認(rèn)是 public static final 修飾的。
抽象類中的屬性訪問控制符無限制,可為任意控制符,如下圖所示:
區(qū)別5:方法控制符不同
接口中方法的默認(rèn)控制符是 public,并且不能定義為其他控制符,如下圖所示:
抽象類中的方法控制符無限制,其中抽象方法不能使用 private 修飾,如下代碼所示:
區(qū)別6:方法實(shí)現(xiàn)不同
接口中普通方法不能有具體的方法實(shí)現(xiàn),在 JDK 8 之后 static 和 default 方法必須有方法實(shí)現(xiàn),如下代碼所示:
從上述結(jié)果可以看出:static 或 default 方法如果沒有方法實(shí)現(xiàn)就會(huì)報(bào)錯(cuò),而普通方法如果有方法實(shí)現(xiàn)就會(huì)報(bào)錯(cuò)。
?抽象類中普通方法可以有方法實(shí)現(xiàn),抽象方法不能有方法實(shí)現(xiàn),如下代碼所示:
從上述結(jié)果可以看出:抽象類中的普通方法如果沒有方法實(shí)現(xiàn)就會(huì)報(bào)錯(cuò),而抽象方法如果有方法實(shí)現(xiàn)則會(huì)報(bào)錯(cuò)。
區(qū)別7:靜態(tài)代碼塊使用不同
接口中不能使用靜態(tài)代碼塊,如下代碼所示:
抽象類中可以使用靜態(tài)代碼塊,如下代碼所示:
總結(jié)
接口和抽象類都是用來定義對(duì)象的公共行為的,但二者有以下 7 點(diǎn)不同:
- 定義的關(guān)鍵字不同。
- 子類繼承或?qū)崿F(xiàn)關(guān)鍵字不同。
- 類型擴(kuò)展不同:抽象類是單繼承,而接口是多繼承。
- 方法訪問控制符:抽象類無限制,只是抽象類中的抽象方法不能被 private 修飾;而接口有限制,接口默認(rèn)的是 public 控制符。
- 屬性方法控制符:抽象類無限制,而接口有限制,接口默認(rèn)的是 public 控制符。
- 方法實(shí)現(xiàn)不同:抽象類中的普通方法必須有實(shí)現(xiàn),抽象方法必須沒有實(shí)現(xiàn);而接口中普通方法不能有實(shí)現(xiàn),但在 JDK 8 中的 static 和 defualt 方法必須有實(shí)現(xiàn)。
- 靜態(tài)代碼塊的使用不同:抽象類可以有靜態(tài)代碼塊,而接口不能有。?
到此這篇關(guān)于淺析Java中接口和抽象類的七大區(qū)別的文章就介紹到這了,更多相關(guān)Java接口和抽象類的區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Cloud Gateway替代zuul作為API網(wǎng)關(guān)的方法
本文簡(jiǎn)要介紹如何使用Spring Cloud Gateway 作為API 網(wǎng)關(guān)(不是使用zuul作為網(wǎng)關(guān)),結(jié)合實(shí)例代碼給大家詳細(xì)講解,感興趣的朋友跟隨小編一起看看吧2023-02-02springboot+mybatis-plus 兩種方式打印sql語句的方法
這篇文章主要介紹了springboot+mybatis-plus 兩種方式打印sql語句的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10Java的動(dòng)態(tài)綁定與雙分派_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Java的動(dòng)態(tài)綁定與雙分派,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-08-08Java服務(wù)器主機(jī)信息監(jiān)控工具類的示例代碼
這篇文章主要介紹了Java服務(wù)器主機(jī)信息監(jiān)控工具類的示例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04JFreeChart實(shí)現(xiàn)實(shí)時(shí)曲線圖
這篇文章主要為大家詳細(xì)介紹了JFreeChart實(shí)現(xiàn)實(shí)時(shí)曲線圖的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06Java實(shí)現(xiàn)單例模式之餓漢式、懶漢式、枚舉式
本篇文章主要介紹了Java實(shí)現(xiàn)單例的3種普遍的模式,餓漢式、懶漢式、枚舉式。具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2016-10-10