日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java 中接口和抽象类竟然有 7 点不同?

發布時間:2025/3/11 java 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java 中接口和抽象类竟然有 7 点不同? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

作者 |?磊哥

來源 | Java面試真題解析(ID:aimianshi666)

轉載請聯系授權(微信ID:GG_Stone)

本文已收錄《Java常見面試題》系列:https://gitee.com/mydb/interview

Java 是一門面向對象的編程語言,面向對象的編程語言有四大特征:抽象、封裝、繼承和多態。而本文介紹的接口和抽象類就是面向對象編程中“抽象”的具體實現,也就是說接口和抽象類都是用來定義實體類的公共行為的,它們是對實體類(對象)更高層次的抽象。

說明:本文以下內容基于 JDK 8 版本。

接口

接口是 Java 語言中的一個抽象類型,用于定義對象的公共行為。它的創建關鍵字是 interface,在接口的實現中可以定義方法和常量,其普通方法是不能有具體的代碼實現的,而在 JDK 8 之后,接口中可以創建 static 和 default 方法了,并且這兩種方法可以有默認的方法實現,如下代碼所示:

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.");} }

接下來,創建一個類來實現以上接口:

public?class?InterfaceImpl_1?implements?Interface_1?{@Overridepublic?void?sayHi()?{System.out.println("Hi,I?am?InterfaceImpl?1.");}public?static?void?main(String[]?args)?{InterfaceImpl_1?inter?=?new?InterfaceImpl_1();inter.sayHi();//?調用接口中?static?方法InterfaceExample.smethod();//?調用接口中的常量?countSystem.out.println(InterfaceExample.count);} }

以上程序的執行結果如下:通過上述代碼和執行結果我們可以得出以下結論:

  • JDK 8 中接口可以定義 static 和 default 方法,并且這兩種方法可以包含具體的代碼實現。

  • 實現接口要使用 implements 關鍵字。

  • 接口不能直接實例化。

  • 接口中定義的變量默認為 public static final 類型。

  • 子類可以不重寫接口中的 static 和 default 方法,不重寫的情況下,默認調用的是接口的方法實現。

  • 抽象類

    抽象類和接口類似,它也是用來定義對象的公共行為的,并且它也不能直接實例化,抽象類的實現關鍵字為 abstract class,子類用 extends 關鍵字繼承父類。抽象類的使用如下:

    public?abstract?class?AbstractExample?{//?定義普通變量int?count?=?2;//?定義私有變量private?static?int?total?=?10;//?定義抽象方法public?abstract?void?methodA();//?定義普通方法public?void?methodB()?{System.out.println("Hi,methodB.");} }

    接下來使用一個普通類繼承上面的抽象類:

    public?class?AbstractSon?extends?AbstractExample?{@Overridepublic?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();} }

    以上程序的執行結果如下:通過上述代碼和執行結果可以得出以下結論:

  • 抽象類使用 abstract 關鍵字聲明。

  • 抽象類中可以包含普通方法和抽象方法,抽象方法不能有具體的代碼實現。

  • 抽象類需要使用 extends 關鍵字實現繼承。

  • 抽象類不能直接實例化。

  • 抽象類中屬性控制符無限制,可以定義 private 類型的屬性。

  • 接口和抽象類的區別主要體現在以下 7 個方面。

    區別1:定義關鍵字不同

    接口使用關鍵字 interface 來定義。抽象類使用關鍵字 abstract 來定義。

    區別2:繼承或實現的關鍵字不同

    接口使用 implements 關鍵字定義其具體實現。抽象類使用 extends 關鍵字實現繼承。

    區別3:子類擴展的數量不同

    接口的實現類可以有多個,如下圖所示:而抽象類的子類,只能繼承一個抽象類,如下圖所示,繼承多個抽象類就會報錯:在 Java 語言中,一個類只能繼承一個父類(單繼承),但可以實現多個接口。

    區別4:屬性訪問控制符不同

    接口中屬性的訪問控制符只能是 public,如下圖所示:

    接口中的屬性默認是 public static final 修飾的。

    抽象類中的屬性訪問控制符無限制,可為任意控制符,如下圖所示:

    區別5:方法控制符不同

    接口中方法的默認控制符是 public,并且不能定義為其他控制符,如下圖所示:抽象類中的方法控制符無限制,其中抽象方法不能使用 private 修飾,如下代碼所示:

    區別6:方法實現不同

    接口中普通方法不能有具體的方法實現,在 JDK 8 之后 static 和 default 方法必須有方法實現,如下代碼所示:從上述結果可以看出:static 或 default 方法如果沒有方法實現就會報錯,而普通方法如果有方法實現就會報錯。

    抽象類中普通方法可以有方法實現,抽象方法不能有方法實現,如下代碼所示:從上述結果可以看出:抽象類中的普通方法如果沒有方法實現就會報錯,而抽象方法如果有方法實現則會報錯。

    區別7:靜態代碼塊使用不同

    接口中不能使用靜態代碼塊,如下代碼所示:抽象類中可以使用靜態代碼塊,如下代碼所示:

    總結

    接口和抽象類都是用來定義對象的公共行為的,但二者有以下 7 點不同:

  • 定義的關鍵字不同。

  • 子類繼承或實現關鍵字不同。

  • 類型擴展不同:抽象類是單繼承,而接口是多繼承。

  • 方法訪問控制符:抽象類無限制,只是抽象類中的抽象方法不能被 private 修飾;而接口有限制,接口默認的是 public 控制符。

  • 屬性方法控制符:抽象類無限制,而接口有限制,接口默認的是 public 控制符。

  • 方法實現不同:抽象類中的普通方法必須有實現,抽象方法必須沒有實現;而接口中普通方法不能有實現,但在 JDK 8 中的 static 和 defualt 方法必須有實現。

  • 靜態代碼塊的使用不同:抽象類可以有靜態代碼塊,而接口不能有。

  • 你還知道哪些接口和抽象類的不同?歡迎評論區留言補充。

    是非審之于己,毀譽聽之于人,得失安之于數。

    公眾號:Java面試真題解析

    往期推薦

    面試官:HashSet如何保證元素不重復?


    面試官:如何實現 List 集合去重?


    面試官:元素排序Comparable和Comparator有什么區別?


    總結

    以上是生活随笔為你收集整理的Java 中接口和抽象类竟然有 7 点不同?的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。