成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試官:接口和抽象類有什么區別?

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

[[441668]]

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

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

接口

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

  1. public interface Interface_1 { 
  2.     int count = 1; 
  3.     void sayHi(); 
  4.     // default 方法 
  5.     default void print() { 
  6.         System.out.println("Do print method."); 
  7.     } 
  8.     // static 方法 
  9.     static void smethod() { 
  10.         System.out.println("Do static method."); 
  11.     } 

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

  1. public class InterfaceImpl_1 implements Interface_1 { 
  2.     @Override 
  3.     public void sayHi() { 
  4.         System.out.println("Hi,I am InterfaceImpl 1."); 
  5.     } 
  6.     public static void main(String[] args) { 
  7.         InterfaceImpl_1 inter = new InterfaceImpl_1(); 
  8.         inter.sayHi(); 
  9.         // 調用接口中 static 方法 
  10.         InterfaceExample.smethod(); 
  11.         // 調用接口中的常量 count 
  12.         System.out.println(InterfaceExample.count); 
  13.     } 

以上程序的執行結果如下:

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

  1. JDK 8 中接口可以定義 static 和 default 方法,并且這兩種方法可以包含具體的代碼實現。
  2. 實現接口要使用 implements 關鍵字。
  3. 接口不能直接實例化。
  4. 接口中定義的變量默認為 public static final 類型。
  5. 子類可以不重寫接口中的 static 和 default 方法,不重寫的情況下,默認調用的是接口的方法實現。

抽象類

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

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

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

  1. public class AbstractSon extends AbstractExample { 
  2.     @Override 
  3.     public void methodA() { 
  4.         System.out.println("Hi,method A."); 
  5.     } 
  6.     public static void main(String[] args) { 
  7.         AbstractSon abs = new AbstractSon(); 
  8.         // 抽象類中的變量重新賦值 
  9.         abs.count = 666; 
  10.         System.out.println(abs.count); 
  11.         // 抽象類中的抽象方法 
  12.         abs.methodA(); 
  13.         // 抽象類中的普通方法 
  14.         abs.methodB(); 
  15.     } 

以上程序的執行結果如下:

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

  • 抽象類使用 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面試真題解析
相關推薦

2024-04-03 15:33:04

JWTSession傳輸信息

2024-09-19 08:42:43

2023-02-17 08:10:24

2021-12-10 12:01:37

finalfinallyfinalize

2021-11-30 07:44:50

FinalFinallyFinalize

2021-12-13 06:56:45

Comparable元素排序

2024-03-20 15:12:59

KafkaES中間件

2021-12-27 06:57:40

This SuperJava

2023-02-09 07:01:35

轉發重定向Java

2023-07-11 08:40:02

IO模型后臺

2023-02-20 07:19:14

2023-12-13 13:31:00

useEffect對象瀏覽器

2022-05-16 11:04:43

RocketMQPUSH 模式PULL 模式

2024-03-26 16:24:46

分布式事務2PC3PC

2025-03-12 08:45:15

函數聲明函數表達式IIFE

2011-06-28 10:55:20

C#接口抽象類

2021-07-08 06:51:29

React函數組件

2009-04-30 15:15:01

Java抽象類接口

2011-07-12 15:58:48

java抽象類接口

2021-05-10 08:01:12

BeanFactoryFactoryBean容器
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 色一级 | 国产最新网址 | 欧美国产视频 | 亚洲午夜视频 | 久久久久久国产一区二区三区 | 亚洲不卡一| 国产欧美久久一区二区三区 | 日韩欧美在线一区 | 日本午夜一区二区三区 | 精品一区二区久久久久久久网精 | 免费一区 | 欧美极品一区二区 | www.蜜桃av.com | 国产午夜精品一区二区 | 国产精品免费视频一区 | av电影一区二区 | 久久伊人青青草 | 国产97碰免费视频 | 一区二区国产在线观看 | 亚洲精品色 | 精品国产乱码久久久久久牛牛 | 黄色一级片aaa | 一级黄色片网站 | 一级片免费网站 | 九九热在线观看视频 | 日韩精品视频在线 | 亚洲精品福利在线 | 精品国产乱码久久久久久影片 | aaa一区| 91偷拍精品一区二区三区 | 午夜在线电影网 | 中文字幕一级 | 欧美精品一区二区三区在线 | 日韩精品成人一区二区三区视频 | 亚洲精品一区国语对白 | 在线视频91 | 中文字幕第九页 | 日本天天操 | 国产精品久久久久久久久久三级 | 欧美日韩一区二区在线 | 久久国产高清 |