一篇文章帶你了解Java基礎(chǔ)-接口
Java基礎(chǔ)知識(接口)
接口
Java接口是一系列方法的聲明,是一些方法特征的集合,一個(gè)接口只有方法的特征沒有方法的實(shí)現(xiàn),因此這些方法可以在不同的地方被不同的類實(shí)現(xiàn),而這些實(shí)現(xiàn)可以具有不同的行為(功能)。
接口的定義
接口:
- 在JAVA編程語言中是一個(gè)抽象類型,是抽象方法的集合,接口通常以interface來聲明。一個(gè)類通過繼承接口的方式,從而來繼承接口的抽象方法。而接口是更加徹底的抽象,接口中全部是抽象方法。(JDK8之前),接口同樣是不能創(chuàng)建對象的。
- 并且為了彌補(bǔ)我們之前繼承中只能單繼承的缺點(diǎn),Java為了我們提供了接口,它可以多實(shí)現(xiàn)接口。
- 接口更像是表達(dá)一種能力規(guī)范,就想之前我們定義動(dòng)物,動(dòng)物有吃的行為方法,而其他實(shí)現(xiàn)了動(dòng)物接口類的動(dòng)物都必須實(shí)現(xiàn)吃這一行為方法。所以其作用主要告訴實(shí)現(xiàn)類,你要實(shí)現(xiàn)我里面所具備的功能。
那么接口和抽象有什么區(qū)別嗎?
接口和抽象的區(qū)別
- 抽象類中的方法可以有方法體,就是能實(shí)現(xiàn)方法的具體功能,但是接口中的方法不行。
- 抽象類中的成員變量可以是各種類型的,而接口中的成員變量只能是 public static final 類型的。
- 接口中不能含有靜態(tài)代碼塊以及靜態(tài)方法(用 static 修飾的方法),而抽象類是可以有靜態(tài)代碼塊和靜態(tài)方法。
- 一個(gè)類只能繼承一個(gè)抽象類,而一個(gè)類卻可以實(shí)現(xiàn)多個(gè)接口。
注意:
JDK 1.8 以后,接口里可以有靜態(tài)方法和方法體了,接口允許包含具體實(shí)現(xiàn)的方法,該方法稱為默認(rèn)方法,默認(rèn)方法使用 default 關(guān)鍵字修飾。
具體的學(xué)習(xí),我們一起來看看吧!
接口的格式
主要通過interface關(guān)鍵字修飾在類上,使其成為一個(gè)接口類!接口中的所有方法都必須只聲明方法標(biāo)識,而不要去聲明具體的方法體。
//接口的格式: 修飾符 interface 接口名稱{ // 抽象方法 void eat(); }
而如果類需要去實(shí)現(xiàn)該接口的關(guān)鍵字implements。
實(shí)現(xiàn)的過程需注意的點(diǎn):
- 必須重寫實(shí)現(xiàn)的全部接口中所有抽象方法。
- 如果一個(gè)類實(shí)現(xiàn)了接口,但是沒有重寫完全部接口的全部抽象方法,這個(gè)類也必須定義成抽象類。
//實(shí)現(xiàn)接口的格式: 修飾符 class 類名 implements 接口名 { // 實(shí)現(xiàn)接口中的所有抽象方法 void eat(){} } // 多實(shí)現(xiàn)的格式: 修飾符 class 類名 implements 接口1,接口2,接口3...{ // 抽象方法 void eat(); .... }
接口中的主要成分
我們這里先講述在JDK8之前,接口中的成分包含:抽象方法和常量
抽象方法:
接口中的抽象方法默認(rèn)會(huì)自動(dòng)加上public abstract修飾程序員無需自己手寫??!
按照規(guī)范:以后接口中的抽象方法建議不要寫上public abstract,為什么呢?因?yàn)闆]有必要啊,默認(rèn)會(huì)加上。
package src.com.na.pojo; /** * 先定義一個(gè)接口父類 --> 動(dòng)物類 * 動(dòng)物都有一個(gè)吃的抽象方法 */ public interface Animal { // 定義為抽象方法后,無需去做方法實(shí)體的實(shí)現(xiàn)! // 默認(rèn)修飾符就是public abstract 可以忽略不寫! // public abstract void eat(); // 這種寫法也可以,默認(rèn)忽略了public abstract void eat(); }
常量:
在接口中,我們定義的成員變量默認(rèn)會(huì)加上: public static final
修飾。
這代表了什么,在接口中定義的成員變量實(shí)際上是一個(gè)常量,而我們知道被final
關(guān)鍵字修飾的變量是不可被修改,并且也被static
靜態(tài)化修飾了變量,這意味著我們可以直接用接口名訪問。
而我們在定義成員變量即常量必須要給初始值。
package src.com.na.pojo; /** * 先定義一個(gè)接口父類 --> 動(dòng)物類 * 動(dòng)物都有一個(gè)吃的抽象方法 */ public interface Animal { // 定義成員變量是常量 // 默認(rèn)修飾符就是public static final 可以忽略不寫! // public static final String NAME = "動(dòng)物"; String NAME = "動(dòng)物"; }
注意:常量命名規(guī)范建議字母全部大寫,多個(gè)單詞用下劃線連接。即ANIMAL_NAME
接口的案例
我們這次以運(yùn)動(dòng)員為例吧,這蘇神,看得我心血來潮,這不比什么博人傳、奧特曼來的熱血多了嗎。
定義運(yùn)動(dòng)員接口
package src.com.na.pojo; /** * 定義一個(gè)運(yùn)動(dòng)員接口類,運(yùn)動(dòng)員可以分很多種:比如田徑運(yùn)動(dòng)員,舉重運(yùn)動(dòng)員,乒乓球運(yùn)動(dòng)員等。 * 定義了這些運(yùn)動(dòng)員之間的一些規(guī)范。 */ public interface SportMan { // 例如:運(yùn)動(dòng)員,都可以運(yùn)動(dòng),都有對應(yīng)的項(xiàng)目吧 void project(); // 運(yùn)動(dòng)員都會(huì)有比賽成績,結(jié)果吧。 void performance(); // 運(yùn)動(dòng)員都會(huì)參加什么比賽得到什么獎(jiǎng)吧,排在第幾位吧! String competition(String project); }
定義田徑運(yùn)動(dòng)員子類去實(shí)現(xiàn)運(yùn)動(dòng)員接口
package src.com.na.pojo; /** * 定義一個(gè)田徑運(yùn)動(dòng)員,蘇神 yyds! 9.83s */ public class AthleticsMan implements SportMan{ /* 實(shí)現(xiàn)接口后,必須重寫里面的所有抽象方法?。?! */ @Override public void project() { System.out.println("蘇神參加了奧運(yùn)會(huì)100米項(xiàng)目?。?); } @Override public void performance() { System.out.println("蘇神創(chuàng)造了歷史,代表亞洲人可以沖進(jìn)100米決賽,踏進(jìn)決賽!并創(chuàng)造了亞洲記錄9.83s!!!!"); } @Override public String competition(String project) { return "蘇炳添參加"+project+"得到第六名!yyds!!!"; } }
定義測試類:
package src.com.na; import src.com.na.pojo.AthleticsMan; /** * 測試接口 */ public class Demo { public static void main(String[] args) { AthleticsMan suBingTian = new AthleticsMan(); suBingTian.project(); suBingTian.performance(); System.out.println(suBingTian.competition("100米")); } }
結(jié)果:
蘇神參加了奧運(yùn)會(huì)100米項(xiàng)目??!
蘇神創(chuàng)造了歷史,代表亞洲人可以沖進(jìn)100米決賽,踏進(jìn)決賽!并創(chuàng)造了亞洲記錄9.83s!!!!
蘇炳添參加100米得到第六名!yyds!!!
接口與接口的關(guān)系
我們知道類與類之間可以有繼承關(guān)系,而我們接口與類之間是實(shí)現(xiàn)關(guān)系,那么接口與接口之間的關(guān)系呢?
在Java中,接口與接口之間是可以多繼承的:也就是一個(gè)接口可以同時(shí)繼承多個(gè)接口。相當(dāng)于在繼承中,將其他接口其他接口的抽象方法與本接口進(jìn)行了合并。
代碼如下:
package src.com.na; public class Demo2 { } // run接口 interface Run{ void run(); } interface Project{ void Project(); } /* * 總結(jié): * 接口與類之間是多實(shí)現(xiàn)的。 * 接口與接口之間是多繼承的。 * */ interface SportMan2 extends Run , Project { String competition(String project); // 抽象方法,比賽。 }
JDK 8之后的接口新增方法
在JDK 8開始之后,接口似乎變得不再純潔了!
接口中不再只是抽象方法,接口還可以有默認(rèn)方法(也就是實(shí)例方法),和靜態(tài)方法了,還包含了私有實(shí)例方法和私有靜態(tài)方法
1. 含有默認(rèn)方法和靜態(tài)方法
- 默認(rèn)方法:使用 default 修飾,不可省略,供子類調(diào)用或者子類重寫。
- 靜態(tài)方法:使用 static 修飾,供接口直接調(diào)用。
代碼如下:
package src.com.na.pojo; /** * 測試接口中可以含有默認(rèn)方法和靜態(tài)方法 */ public interface InterfaceTest { // 含有默認(rèn)方法,default關(guān)鍵字 public default void defaultMethod() { System.out.println("默認(rèn)方法"); } // 含有靜態(tài)方法,static關(guān)鍵字 public static void staticMethod() { System.out.println("靜態(tài)方法"); } }
2. 含有私有方法和私有靜態(tài)方法
- 私有方法:使用 private 修飾,供接口中的默認(rèn)方法或者靜態(tài)方法調(diào)用。
- 私有靜態(tài)方法:使用 private 修飾,使用 static 修飾。
代碼如下:
package src.com.na.pojo; /** * 測試接口中可以含有私有方法和私有靜態(tài)方法 */ public interface InterfaceTest2 { // 含有私有方法,private修飾 private void privateMethod() { System.out.println("私有方法"); } // 含有私有靜態(tài)方法,static關(guān)鍵字,private修飾 private static void privateStaticMethod() { System.out.println("私有靜態(tài)方法"); } }
接口的特點(diǎn):
- 接口中的方法全是抽象方法,默認(rèn)會(huì)自動(dòng)加上public abstract修飾。
- 接口中,無法定義成員變量,但是可以定義常量,其值不可以改變,默認(rèn)使用public static final修飾。
- 接口中,沒有構(gòu)造器,所以是不能創(chuàng)建對象滴!
- 類與接口之間的關(guān)系是多實(shí)現(xiàn)的。
- 接口與接口之間關(guān)系是多繼承的。
- 接口更多體現(xiàn)的是一種規(guī)范。
- JDK 8開始,接口不再純潔,支持靜態(tài)方法,默認(rèn)方法,私有方法。
總結(jié)
相信各位看官都對Java基礎(chǔ)中的抽象和接口的知識和使用有了一定了解,等待下一次更多Java基礎(chǔ)的學(xué)習(xí)吧!
本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Spark Streaming算子開發(fā)實(shí)例
這篇文章主要介紹了Spark Streaming算子開發(fā)實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06spring基礎(chǔ)概念A(yù)OP與動(dòng)態(tài)代理理解
這篇文章主要為大家詳細(xì)介紹了spring基礎(chǔ)概念A(yù)OP與動(dòng)態(tài)代理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10