接口
比抽象類更加抽象的是接口浪蹂,在接口中所有的方法都會(huì)被 public
abstract
修飾抵栈。
注意:Java 8 之后接口中新增加了 default 默認(rèn)方法和 對(duì) static 方法的支持。
- Java 中不支持多繼承,而是通過接口實(shí)現(xiàn)比多重繼承更強(qiáng)的功能坤次,java 通過接口可以使出于不同層次,甚至不相關(guān)的類具有相同的行為.
- 接口可以認(rèn)為是特殊的抽象類, 不能用于直接創(chuàng)建對(duì)象古劲。接口的作用在于規(guī)定一些功能框架,具體功能的實(shí)現(xiàn)則通過該接口約束的類完成。
接口的定義:一般由常量和抽象方法組成
[public] interface 接口名 [extends 父接口名列表 ] {
[public] [static] [final] 域類型 域名 = 常量值 ;
[public] [abstract] 返回值 方法名(參數(shù)列表) [throw 異常列表]缰猴;
}
- 聲明接口可給出訪問控制符产艾;
- 接口的繼承同樣使用 extends 關(guān)鍵字,多個(gè)父接口之間以逗號(hào)分隔。
- 系統(tǒng)默認(rèn)接口中所有屬性的修飾都是 public static final, 為全局常量.
- 系統(tǒng)默認(rèn)接口中所有方法的修飾都是 public abstract; 即抽象方法.
- 與類一樣闷堡,接口也可以使用 instanceof 關(guān)鍵字隘膘,用來判斷一個(gè)對(duì)象是否實(shí)現(xiàn)了某接口。
接口的實(shí)現(xiàn)
- 定義了一套行為規(guī)范,一個(gè)類實(shí)現(xiàn)這個(gè)接口就是要遵守接口的定義規(guī)范,要實(shí)現(xiàn)接口中定義的所有方法.
- 一個(gè)類可以實(shí)現(xiàn)多個(gè)接口杠览。接口間用逗號(hào)分隔弯菊;
- 如果實(shí)現(xiàn)某接口的類不是抽象類,則在類的定義部分必須實(shí)現(xiàn)指定接口的所有抽象方法;否則編譯時(shí)會(huì)指示該類只能為抽象類是不能創(chuàng)建對(duì)象的.
- 接口的抽象方法的訪問限制符默認(rèn)為 public
Java 8 新特性默認(rèn)方法和靜態(tài)方法
Java 8在接口中提供了聲明默認(rèn)方法和靜態(tài)方法的能力。接口示例代碼如下:
package xxx.yyy;
public interface IHello {
public static void xxx() {
System.out.println("xxx");
}
public default void yyy() {
System.out.println("yyy");
}
}
注意:在 Java 8 中踱阿,靜態(tài)方法和默認(rèn)方法都必須是 public 的误续,Java 9 去除了這個(gè)限制,它們都可以是private的扫茅,引入 private方法主要是為了方便多個(gè)靜態(tài)或默認(rèn)方法復(fù)用代碼。
抽象類
引入抽象方法和抽象類育瓜,是 Java 提供的一種語法工具葫隙,對(duì)于一些類和方法,引導(dǎo)使用者正確使用它們躏仇,減少誤用恋脚。使用抽象方法而非空方法體,子類就知道它必須要實(shí)現(xiàn)該方法焰手,而不可能忽略糟描,若忽略Java編譯器會(huì)提示錯(cuò)誤。使用抽象類书妻,類的使用者創(chuàng)建對(duì)象的時(shí)候船响,就知道必須要使用某個(gè)具體子類,而不可能誤用不完整的父類躲履。
抽象類聲明和實(shí)現(xiàn)
在Java中抽象類和抽象方法的修飾符是 abstract
见间,注意抽象方法中只有方法的聲明,沒有方法的實(shí)現(xiàn)工猜。
- 抽象類不能被實(shí)例化,只有具體類才能被實(shí)例化米诉;
- 抽象類可以擁有默認(rèn)的構(gòu)造函數(shù), 供子類實(shí)例化調(diào)用, 用于完成子類構(gòu)建對(duì)象的一些公共任務(wù);
- 抽象類中可以包含具體方法和抽象方法篷帅;
- 非抽象類(具體類) 若繼承抽象類必須重寫所有抽象方法史侣。
abstract class 類名稱 {
member var;
method(){…} // 一般方法
abstract method(); // 抽象方法, 抽象方法在后直接跟分號(hào)
}
普通類加上 abstract 關(guān)鍵字就變成了抽象類魏身。一但類中包含有抽象方法的類必須定義為抽象類或者接口惊橱,否則編譯時(shí)會(huì)提示 The type XXX must be an abstract class to define abstract methods
Q: 抽象關(guān)鍵字 abstract 不可以和哪些關(guān)鍵字共存?
A: private
私有內(nèi)容子類繼承不到叠骑,所以李皇,不能重寫. 但是,abstract修飾的方法,要求被重寫掉房。兩者沖突茧跋。
final
final 修飾的方法不能被重寫。而 abstract 修飾的方法卓囚,要求被重寫瘾杭。兩者沖突。
static
假如一個(gè)抽象方法能通過 static 修飾哪亿,那么這個(gè)方法粥烁,就可以直接通過類名調(diào)用。而抽象方法是沒有方法體的蝇棉,這樣的調(diào)用無意義讨阻。所以,不能用 static 修飾篡殷。
抽象類和接口是配合而非替代關(guān)系钝吮,它們經(jīng)常一起使用,接口聲明能力板辽,抽象類提供默認(rèn)實(shí)現(xiàn)奇瘦,實(shí)現(xiàn)全部或部分方法,一個(gè)接口經(jīng)常有一個(gè)對(duì)應(yīng)的抽象類劲弦。比如耳标,在 Java 類庫中,有:
? Collection 接口和對(duì)應(yīng)的 AbstractCollection 抽象類邑跪。
? List 接口和對(duì)應(yīng)的 AbstractList 抽象類次坡。
? Map 接口和對(duì)應(yīng)的 AbstractMap 抽象類。
參考
- 丁振凡編著,《Java 語言程序設(shè)計(jì)(第2版)》華東交大版,2014.9
- Java 編程的邏輯-微信讀書
https://weread.qq.com/web/reader/b51320f05e159eb51b29226kc81322c012c81e728d9d180