Java接口的本質解析
😋 接口
Java接口是一系列方法的聲明,是一些方法特征的集合,一個接口隻有方法的特征沒有方法的實現,因此這些方法可以在不同的地方被不同的類實現,而這些實現可以具有不同的行為(功能)。
🌔 接口的定義
接口:
- 在JAVA編程語言中是一個抽象類型,是抽象方法的集合,接口通常以interface來聲明。一個類通過繼承接口的方式,從而來繼承接口的抽象方法。而接口是更加徹底的抽象,接口中全部是抽象方法。(JDK8之前),接口同樣是不能創建對象的。
- 並且為瞭彌補我們之前繼承中隻能單繼承的缺點,Java為瞭我們提供瞭接口,它可以多實現接口。
- 接口更像是表達一種能力規范,就想之前我們定義動物,動物有吃的行為方法,而其他實現瞭動物接口類的動物都必須實現吃這一行為方法。所以其作用主要告訴實現類,你要實現我裡面所具備的功能。
那麼接口和抽象有什麼區別嗎?
🌕 接口和抽象的區別
- 抽象類中的方法可以有方法體,就是能實現方法的具體功能,但是接口中的方法不行。
- 抽象類中的成員變量可以是各種類型的,而接口中的成員變量隻能是 public static final 類型的。
- 接口中不能含有靜態代碼塊以及靜態方法(用 static 修飾的方法),而抽象類是可以有靜態代碼塊和靜態方法。
- 一個類隻能繼承一個抽象類,而一個類卻可以實現多個接口。
註意:
JDK 1.8 以後,接口裡可以有靜態方法和方法體瞭,接口允許包含具體實現的方法,該方法稱為默認方法,默認方法使用 default 關鍵字修飾。
具體的學習,我們一起來看看吧!
🌖 接口的格式
主要通過interface
關鍵字修飾在類上,使其成為一個接口類!接口中的所有方法都必須隻聲明方法標識,而不要去聲明具體的方法體。
//接口的格式:
修飾符 interface 接口名稱{
// 抽象方法
void eat();
}
而如果類需要去實現該接口的關鍵字implements
。
實現的過程需註意的點:
- 必須重寫實現的全部接口中所有抽象方法。
- 如果一個類實現瞭接口,但是沒有重寫完全部接口的全部抽象方法,這個類也必須定義成抽象類。
//實現接口的格式:
修飾符 class 類名 implements 接口名 {
// 實現接口中的所有抽象方法
void eat(){}
}// 多實現的格式:
修飾符 class 類名 implements 接口1,接口2,接口3…{
// 抽象方法
void eat();
….
}
🌗 接口中的主要成分
我們這裡先講述在JDK8之前,接口中的成分包含:抽象方法和常量
抽象方法:
接口中的抽象方法默認會自動加上public abstract
修飾程序員無需自己手寫!!
按照規范:以後接口中的抽象方法建議不要寫上public abstract
,為什麼呢?因為沒有必要啊,默認會加上。
package src.com.na.pojo; /** * 先定義一個接口父類 --> 動物類 * 動物都有一個吃的抽象方法 */ public interface Animal { // 定義為抽象方法後,無需去做方法實體的實現! // 默認修飾符就是public abstract 可以忽略不寫! // public abstract void eat(); // 這種寫法也可以,默認忽略瞭public abstract void eat(); }
常量:
在接口中,我們定義的成員變量默認會加上: public static final
修飾。
這代表瞭什麼,在接口中定義的成員變量實際上是一個常量,而我們知道被final
關鍵字修飾的變量是不可被修改,並且也被static
靜態化修飾瞭變量,這意味著我們可以直接用接口名訪問。
而我們在定義成員變量即常量必須要給初始值。
package src.com.na.pojo; /** * 先定義一個接口父類 --> 動物類 * 動物都有一個吃的抽象方法 */ public interface Animal { // 定義成員變量是常量 // 默認修飾符就是public static final 可以忽略不寫! // public static final String NAME = "動物"; String NAME = "動物"; }
註意:常量命名規范建議字母全部大寫,多個單詞用下劃線連接。即ANIMAL_NAME
🌘 接口的案例
我們這次以運動員為例吧,這蘇神,看得我心血來潮,這不比什麼博人傳、奧特曼來的熱血多瞭嗎。
定義運動員接口
package src.com.na.pojo; /** * 定義一個運動員接口類,運動員可以分很多種:比如田徑運動員,舉重運動員,乒乓球運動員等。 * 定義瞭這些運動員之間的一些規范。 */ public interface SportMan { // 例如:運動員,都可以運動,都有對應的項目吧 void project(); // 運動員都會有比賽成績,結果吧。 void performance(); // 運動員都會參加什麼比賽得到什麼獎吧,排在第幾位吧! String competition(String project); }
定義田徑運動員子類去實現運動員接口
package src.com.na.pojo; /** * 定義一個田徑運動員,蘇神 yyds! 9.83s */ public class AthleticsMan implements SportMan{ /* 實現接口後,必須重寫裡面的所有抽象方法!!! */ @Override public void project() { System.out.println("蘇神參加瞭奧運會100米項目!!"); } @Override public void performance() { System.out.println("蘇神創造瞭歷史,代表亞洲人可以沖進100米決賽,踏進決賽!並創造瞭亞洲記錄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米")); } }
結果:
蘇神參加瞭奧運會100米項目!!
蘇神創造瞭歷史,代表亞洲人可以沖進100米決賽,踏進決賽!並創造瞭亞洲記錄9.83s!!!!
蘇炳添參加100米得到第六名!yyds!!!
🌙 接口與接口的關系
我們知道類與類之間可以有繼承關系,而我們接口與類之間是實現關系,那麼接口與接口之間的關系呢?
在Java中,接口與接口之間是可以多繼承的:也就是一個接口可以同時繼承多個接口。相當於在繼承中,將其他接口其他接口的抽象方法與本接口進行瞭合並。
代碼如下:
package src.com.na; public class Demo2 { } // run接口 interface Run{ void run(); } interface Project{ void Project(); } /* * 總結: * 接口與類之間是多實現的。 * 接口與接口之間是多繼承的。 * */ interface SportMan2 extends Run , Project { String competition(String project); // 抽象方法,比賽。 }
🤽 JDK 8之後的接口新增方法
在JDK 8開始之後,接口似乎變得不再純潔瞭!
接口中不再隻是抽象方法,接口還可以有默認方法(也就是實例方法),和靜態方法瞭,還包含瞭私有實例方法和私有靜態方法
1. 含有默認方法和靜態方法
- 默認方法:使用
default
修飾,不可省略,供子類調用或者子類重寫。 - 靜態方法:使用
static
修飾,供接口直接調用。
代碼如下:
package src.com.na.pojo; /** * 測試接口中可以含有默認方法和靜態方法 */ public interface InterfaceTest { // 含有默認方法,default關鍵字 public default void defaultMethod() { System.out.println("默認方法"); } // 含有靜態方法,static關鍵字 public static void staticMethod() { System.out.println("靜態方法"); } }
2. 含有私有方法和私有靜態方法
- 私有方法:使用
private
修飾,供接口中的默認方法或者靜態方法調用。 - 私有靜態方法:使用
private
修飾,使用static
修飾。
代碼如下:
package src.com.na.pojo; /** * 測試接口中可以含有私有方法和私有靜態方法 */ public interface InterfaceTest2 { // 含有私有方法,private修飾 private void privateMethod() { System.out.println("私有方法"); } // 含有私有靜態方法,static關鍵字,private修飾 private static void privateStaticMethod() { System.out.println("私有靜態方法"); } }
🤾♂️ 接口的特點:
- 接口中的方法全是抽象方法,默認會自動加上
public abstract
修飾。 - 接口中,無法定義成員變量,但是可以定義常量,其值不可以改變,默認使用
public static final
修飾。 - 接口中,沒有構造器,所以是不能創建對象滴!
- 類與接口之間的關系是多實現的。
- 接口與接口之間關系是多繼承的。
- 接口更多體現的是一種規范。
- JDK 8開始,接口不再純潔,支持靜態方法,默認方法,私有方法。
🌸總結
相信各位看官都對Java中的接口的知識和使用有瞭一定瞭解,等待下一次更多Java基礎的學習吧!
讓我們也一起加油吧!本人不才,如有什麼缺漏、錯誤的地方,也歡迎各位人才大佬評論中批評指正!
學到這裡,今天的世界打烊瞭,晚安!雖然這篇文章完結瞭,但是我還在,永不完結。我會努力保持寫文章。來日方長,何懼車遙馬慢!
感謝各位看到這裡!願你韶華不負,青春無悔!
到此這篇關於Java接口的本質解析的文章就介紹到這瞭,更多相關Java 接口內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!