介面 interface 介面就是一組規範(就像我們法律一樣),所有實現類都要遵守。 面向對象的精髓,最能體現這一點的就是介面。為什麼我們討論設計模式都只針對具備了抽象能力的語言(比如 C++、Java、C#等),就是因為設計模式所研究的,實際上就是如何合理的去抽象。 介面的作用 為什麼需要介面?接 ...
介面 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
-
本文來自博客園,作者:link-零,轉載請註明原文鏈接:https://www.cnblogs.com/e-link/p/16743292.html❤❤❤