接口類似于類,但接口的成員沒有執行體,它只是方法、屬性、事件和索引符的組合而已。接口不能被實例化,接口沒有構造方法,沒有字段。在應用程序中,接口就是一種規范,它封裝了可以被多個類繼承的公共部分。
## 1、定義接口
Java 接口的定義方式與類基本相同,不過接口定義使用的關鍵字是 interface,接口定義由接口聲明和接口體兩部分組成。語法格式如下:
```
[public] interface 接口名 [extends 接口1, [接口2, ...]] {
// 聲明常量
[public] [static] [final] 數據類型 常量名 = 常量值;
// 聲明方法
[public] [abstract] 返回值類型 方法名稱(參數列表);
}
```
> 提示:如果接口本身被定義為 public,則所有的方法和常量都是 public 型的。
## 2、接口成員——抽象方法和常量
接口對于其聲明、變量和方法都做了許多限制,如下:
* 具有 public 訪問控制符的接口,允許任何類使用;沒有指定 public 的接口,其訪問將局限于所屬的包。
* 方法的聲明不需要其他修飾符,在接口中聲明的方法,將隱式地聲明為公有的(public)和抽象的(abstract)。
* 在 Java 接口中聲明的變量其實都是常量,接口中的變量聲明,將隱式地聲明為 public、static 和 final,即常量,所以接口中定義的變量必須初始化。
* 接口沒有構造方法,不能被實例化。
* 一個接口不能夠實現另一個接口,但它可以繼承多個其他接口。子接口可以對父接口的方法和常量進行重寫。
```
public interface MyInterface {
String name; // 不合法,變量name必須初始化
int age = 20; // 合法,等同于 public static final int age = 20;
void getInfo(); // 方法聲明,等同于 public abstract void getInfo();
}
```
【選擇】閱讀下面的 Java 代碼,能夠填寫在(1)處的語句是()(選擇一項)
```
public interface ILog {
//(1)
}
```
```
A private int MAX_LOG_SIZE = 1000;
B public void printLog() { System.out.println("print the log"); }
C private boolean saveToFile(String fileName);
D int getSize();
```
【選擇】下列關于 Java 中接口的說法不正確的是()(選擇一項)
```
A 接口中方法的訪問修飾符默認為 public
B 接口中的方法如果寫成 void test(); 的形式,默認是抽象方法
C 實現接口的類中在重寫接口中方法時訪問修飾符可以為 protected
D 當類實現接口時,需要實現接口中所有的抽象方法,否則需要將該類設置為抽象類
```
【選擇】運行下列代碼時,哪個位置會發生編譯報錯()(選擇一項)
```
interface A { // (1)
public static final int TEMP; // (2)
public abstract void info(); // (3)
}
```
```
A 位置一 B 位置二 C 位置三 D 不存在錯誤
```
## 3、接口成員——默認方法和靜態方法
默認方法可以通過實現接口的類實例化的對象來調用。需要注意的是,此處的靜態方法只能被`public`修飾(或者省略不寫),不能是`private`或者`protected`。
```
public interface MyInterface {
// 默認方法
default void hello () {
System.out.println("say hello");
}
// 靜態方法
static void world() {
System.out.println("say world");
}
}
public class Test implements MyInterface {
public static void main(String[] args) {
Test test = new Test();
test.hello(); // 調用默認方法
MyInterface.world(); // 調用靜態方法
}
}
```
【選擇】在實現類中劃線處加入下列哪條代碼可以調用 IAa 接口中默認的方法()(選擇一項)
```
public interface IAa {
default void show() {
System.out.println("我是默認方法");
}
}
public class B implements IAa {
public void show() {
_______________
System.out.println("重寫默認方法");
}
}
```
```
A IAa.show();
B super.show();
C IAa.super.show();
D B.super.show();
```
【選擇】下列代碼的運行結果是()(選擇一項)
```
public interface IA {
int TEMP = 10;
}
public interface IB extends IA {
String TEMP = "temp";
}
public class Test implement IA, IB {
public static void main(String[] args) {
IA a = new Test();
IB b = new Test();
System.out.print(a.TEMP);
System.out.println(b.TEMP);
}
}
```
## 4、接口的實現
接口被定義后,一個或者多個類都可以實現該接口,這需要在實現接口的類的定義中包含 implements 子句,然后實現由接口定義的方法。實現接口的一般形式如下:
```
<public> class <類名> [extends 父類] [implements 接口1 [, 接口2...]] {
// ...
}
```
如果一個類實現多個接口,這些接口需要使用逗號分隔。實現接口的方法必須聲明為 public,而且實現方法的類型必須嚴格與接口定義中指定的類型相匹配。
【編程】使用接口的知識,定義接口 IFLY,創建三個類 Plane 類、Bird 類、Balloon 類,分別重寫接口中的 fly() 方法,然后再測試類中進行調用。程序運行參考效果如圖所示:
```
飛機在天上飛
小鳥在天空翱翔
氣球飛上天空
```
```
public class Test {
public static void main(String[] args) {
// 1. 對象實例化
// 2. 分別調用 fly() 方法
}
}
public interface IFly {
// 創建方法 fly()
}
// 實現接口 IFly
public class Plane {
// 重寫 fly 方法
}
// 實現接口 IFly
public class Bird {
// 重寫 fly 方法
}
// 實現接口 IFly
public class Balloon {
// 重寫 fly 方法
}
```
- 階段一 Java 零基礎入門
- 步驟1:基礎語法
- 第01課 初識
- 第02課 常量與變量
- 第03課 運算符
- 第04課 選擇結構
- 第05課 循環結構
- 第06課 一維數組
- 第08課 方法
- 第09課 數組移位與統計
- 第10課 基礎語法測試
- 第09課 基礎語法測試(含答案)
- 步驟2:面向對象
- 第01課 類和對象
- 第02課 封裝
- 第03課 學生信息管理
- 第04課 繼承
- 第05課 單例模式
- 第06課 多態
- 第07課 抽象類
- 第08課 接口
- 第09課 內部類
- 第10課 面向對象測試
- 第10課 面向對象測試(含答案)
- 步驟3:常用工具類
- 第01課 異常
- 第02課 包裝類
- 第03課 字符串
- 第04課 集合
- 第05課 集合排序
- 第06課 泛型
- 第07課 多線程
- 第08課 輸入輸出流
- 第09課 案例:播放器
- 第10課 常用工具測試(一)
- 第10課 常用工具測試(一)(答案)
- 第10課 常用工具測試(二)
- 第10課 常用工具測試(二)(答案)
- 階段二 從網頁搭建入門 JavaWeb
- 步驟1:HTML 與 CSS
- 第01課 HTML 入門
- 第01課 HTML 入門(作業)
- 第02課 CSS 入門
- 第02課 CSS 入門(作業)
- 第03課 CSS 布局
- 第03課 CSS 布局(作業)
- 步驟2:JavaScript 與前端案例
- 第01課 JavaScript 入門
- 第01課 JavaScript 入門(作業)
- 第02課 仿計算器
- 第03課 前端油畫商城案例
- 第04課 輪播圖
- 第05課 網頁搭建測試
- 第05課 網頁搭建測試(含答案)
- 步驟3:JavaScript 教程
- 入門
- 概述
- 基本語法
- 數據類型
- 概述
- 數值
- 字符串
- undefined, null 和布爾值
- 對象
- 函數
- 數組
- 運算符
- 算術運算符
- 比較運算符
- 布爾運算符
- 位運算符
- 運算順序
- 語法專題
- 數據類型的轉換
- 錯誤處理機制
- 標準庫
- String
- Date
- Math
- DOM
- 概述
- Document 節點
- 事件
- EventTarget 接口
- 事件模型
- 常見事件
- 階段三 數據庫開發與實戰
- 步驟1:初始數據庫操作
- 第01課 數據類型
- 第02課 表的管理
- 第03課 數據管理
- 第04課 常用函數
- 第05課 JDBC 入門
- 第06課 Java 反射
- 第07課 油畫商城
- 第08課 數據庫基礎測試
- 步驟2:MyBatis 從入門到進階
- 第01課 IntelliJ IDEA 開發工具入門
- 第02課 Maven 入門
- 第03課 工廠模式
- 第04課 MyBatis 入門
- 第05課 MyBatis 進階
- 第06課 商品信息管理
- 第07課 MyBatis 基礎測試
- 步驟3:Redis 數據庫與 Linux 下項目部署
- 第01課 Linux 基礎
- 第02課 Linux 下 JDK 環境搭建及項目部署
- 第03課 Redis 入門
- 階段四 SSM 到 Spring Boot 入門與綜合實戰
- 步驟1:Spring 從入門到進階
- 第01課 Spring 入門
- 第02課 Spring Bean 管理
- 第03課 Spring AOP
- 第04課 基于 AspectJ 的 AOP 開發
- 第05課 JDBC Template
- 第06課 Spring 事務管理
- 第07課 人員管理系統開發
- 第08課 Spring 從入門到進階測試
- 步驟2:Spring MVC 入門與 SSM 整合開發
- 第01課 Spring MVC 入門與數據綁定
- 第02課 Restful 風格的應用
- 第03課 SpringMVC 攔截器
- 第04課 辦公系統核心模塊
- 步驟3:Spring Boot 實戰
- 第01課 Spring Boot 入門
- 第02課 校園商鋪項目準備
- 第03課 校園商鋪店鋪管理
- 第04課 校園商鋪商品管理及前臺展示
- 第05課 校園商鋪框架大換血
- 步驟4:Java 面試
- 第01課 面試準備
- 第02課 基礎面試技巧
- 第03課 Web基礎與數據處理
- 第04課 主流框架