介面 interface
介面就是一組規范(就像我們法律一樣),所有實作類都要遵守,

面向物件的精髓,最能體現這一點的就是介面,為什么我們討論設計模式都只針對具備了抽象能力的語言(比如 C++、Java、C#等),就是因為設計模式所研究的,實際上就是如何合理的去抽象,
介面的作用
為什么需要介面?介面和抽象類的區別?
介面就是比“抽象類”還“抽象”的“抽象類”,可以更加規范的對子類進行約束,全面地專業地實作了:規范和具體實作的分離,介面是兩個模塊之間通信的標準,通信的規范,如果能把你要設計的模塊之間的介面定義好,就相當于完成了系統的設計大綱,剩下的就是添磚加瓦的具體實作了,大家在作業以后,做系統時往往就是使用“面向介面”的思想來設計系統,
介面和實作類不是父子關系,是實作規則的關系,比如:定義一個介面 Runnable,Car 實作它就能在地上跑,Train 實作它也能在地上跑,飛機實作它也能在地上跑,就是說,如果它是交通工具,就一定能跑,但是一定要實作 Runnable 介面,
[訪問修飾符] interface 介面名 [extends 父介面 1,父介面 2…] {
常量定義;
方法定義;
}
類實作介面用implements表示
[訪問修飾符] class 類名 implements 介面名 {}
訪問修飾符:只能是 public 或默認,
??介面名:和類名采用相同命名機制,
??extends:介面可以多繼承,
??常量:介面中的屬性只能是常量,總是:public static final 修飾,不寫也是,
??方法:介面中的方法只能是:public abstract, 省略的話,也是 public abstract,
要點??
-
介面不能實體化
我們可以創建介面的實作類物件使用
-
介面的子類 implements
要么重寫介面中的所有抽象方法
要么子類也是抽象類
??子類通過 implements 來實作介面中的規范,
??介面不能創建實體,但是可用于宣告參考變數型別,
??一個類實作了介面,必須實作介面中所有的方法,并且這些方法只能是 public 的,
??JDK1.8(不含 8)之前,介面中只能包含靜態常量、抽象方法,不能有普通屬性、構造方法、普通方法,
??JDK1.8(含 8)后,介面中包含普通的靜態方法、默認方法,
public class test {
public static void main(String[] args) {
Volant volant = new Angel();
volant.fly();
System.out.println(Volant.FLY_HIGHT);
Honest honest = new GoodMan();
honest.helpOther();
}
}
/** 飛行介面 */
interface Volant {
int FLY_HIGHT = 100; // 總是:public static final 型別的;
void fly(); // 總是:public abstract void fly();
}
/** 善良介面 */
interface Honest {
void helpOther();
}
/** Angel 類實作飛行介面和善良介面 */
class Angel implements Volant, Honest {
public void fly() {
System.out.println("我是angel!!,飛起來啦!");
}
public void helpOther() {
System.out.println("幫助需要幫助的人");
}
}
class GoodMan implements Honest {
public void helpOther() {
System.out.println("幫助需要幫助的人");
}
}
class BirdMan implements Volant {
public void fly() {
System.out.println("我是鳥人,正在飛!");
}
}
介面中定義靜態方法和默認方法(JDK8)
JAVA8 之前,介面里的方法要求全部是抽象方法,
JAVA8(含 8)之后,以后允許在介面里定義默認方法和靜態方法,
JDK8 新特性_默認方法
??Java 8 及以上新版本,允許給介面添加一個非抽象的方法實作,只需要使用 default 關鍵字即可,這個特征又叫做默認方法(也稱為擴展方法),
??默認方法和抽象方法的區別是抽象方法必須要被實作,默認方法不是,作為替代方式,介面可以提供默認方法的實作,所有這個介面的實作類都可以得到默認方法,
public class test {
public static void main(String[] args) {
A a = new Test_A();
a.moren();
}
}
interface A {
default void moren() {
System.out.println("我是介面 A 中的默認方法!");
}
}
class Test_A implements A {
@Override
public void moren() {
System.out.println("Test_A.moren");
}
}
靜態方法和默認方法
本介面的默認方法中可以呼叫靜態方法,
public class test {
public static void main(String[] args) {
A a = new Test_A();
a.moren();
}
}
interface A {
public static void staticMethod() {
System.out.println("A.staticMethod");
}
public default void moren() {
staticMethod();
System.out.println("A.moren");
}
}
class Test_A implements A {
public static void staticMethod() {
System.out.println("Test_A.staticMethod");
}
}

介面的多繼承
介面支持多繼承,和類的繼承類似,子介面 extends 父介面,會獲得父介面中的一切,

interface A {
void testa();
}
interface B {
void testb();
}
/** 介面可以多繼承:介面 C 繼承介面 A 和 B */
interface C extends A, B {
void testc();
}
public class test implements C {
public void testc() {
}
public void testa() {
}
public void testb() {
}
}
介面語法本身非常簡單,但是如何真正使用?這才是大學問,我們需要后面在專案中反復使用,才能體會到
類和介面的關系
-
類與類的關系
繼承關系,只能單繼承,但是可以多層繼承
-
類與介面的關系
實作關系,可以單實作,也可以多實作,還可以在繼承一個類的同時實作多個介面
-
介面與介面的關系
繼承關系,可以單繼承,也可以多繼承
介面中私有方法
-
私有方法產生原因
Java 9中新增了帶方法體的私有方法,這其實在Java 8中就埋下了伏筆:Java 8允許在介面中定義帶方法體的默認方法和靜態方法,這樣可能就會引發一個問題:當兩個默認方法或者靜態方法中包含一段相同的代碼實作時,程式必然考慮將這段實作代碼抽取成一個共性方法,而這個共性方法是不需要讓別人使用的,因此用私有給隱藏起來,這就是Java 9增加私有方法的必然性
-
定義格式
-
格式1
private 回傳值型別 方法名(引數串列) { }
-
??????【每天5分鐘輕松學java第四彈之【介面】來啦!】
<iframe style="width: 824px; height: 412px" src="https://www.cnblogs.com//player.bilibili.com/player.html?aid=770917270&bvid=BV1Dr4y1E786&cid=774911480&page=1" height="335" frameborder="no" scrolling="no" allowfullscreen="allowfullscreen"> </iframe>
每天一個技術點】一個介面的誕生之路
<iframe style="width: 826px; height: 413px" src="https://www.cnblogs.com//player.bilibili.com/player.html?aid=382709547&bvid=BV1JZ4y1z7kC&cid=560612618&page=1" height="413" frameborder="no" scrolling="no" allowfullscreen="allowfullscreen"> </iframe>
本文來自博客園,作者:link-零,轉載請注明原文鏈接:https://www.cnblogs.com/e-link/p/16743292.html???
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/510672.html
標籤:Java
上一篇:20220929-ArrayList擴容機制原始碼分析
下一篇:python的多執行緒
