一、簡介
描述:
- 普通類只有具體實作,抽象類具體實作和規范都有,介面只有規范!
- 介面就是比抽象類還抽象的抽象類,可以更加規范的對子類進行約束,全面專業地實作了規范和具體實作的分離,
- 抽象類還提供某些具體實作,介面不提供任何實作,介面中所有方法都是抽象方法,
- 介面是完全面向規范的,規定了一批類具有的公共方法規范,
- 從介面的實作者角度看,介面定義了可以向外部提供的服務,
- 從介面的呼叫者角度看,介面定義了實作者能提供哪些服務,
- 介面是兩個模塊之間通信的標準,通信的規范,如果能把你要設計的系統之間模塊之間的介面定義好,就相當于完成了系統的設計大綱,剩下的就是添磚加瓦的具體實作了,做系統設計時往往就是使用面向介面的思想來設計系統,
本質:
- 介面就是規范,定義的是一組規則,體現了現實世界中“如果你是…則必須能…”的思想,如果你是天使,則必須能飛,如果你是汽車,則必須能跑,如果你好人,則必須干掉壞人,如果你是壞人,則必須欺負好人,
- 介面的本質是契約,就像我們人間的法律一樣,制定好后大家都遵守,
- 面向物件的精髓,是對物件的抽象,最能體現這一點的就是介面,為什么我們討論設計模式都只針對具備了抽象能力的語言(比如c++、java、c#等),就是因為設計模式所研究的,實際上就是如何合理的去抽象,
作用:
- 介面的最主要的作用是達到統一訪問,因為實作介面的類的方法名相同,但是實作內容不同,
- 在創建物件的時候用介面型別作為參考的型別,想用哪個實作類去做方法的內部實作,就new該實作類的物件,呼叫方法的時候就可以直接用介面型別的參考來呼叫,
二、介面與抽象類的區別
抽象類:
- 抽象類也是類,除了可以寫抽象方法以及不能直接new物件之外,其他的和普通類沒有什么不一樣的,
- 宣告類的關鍵字是'class',
- 抽象類是用來被繼承的,Java中的類是單繼承,繼承的關鍵字是'extends',
- 抽象類的多型表現:一個抽象類的參考,可以指向這個抽象類的任意子類物件,
介面:
- 介面已經另一種型別了,和類是有本質的區別的,所以不能用類的標準去衡量介面,
- 宣告介面的關鍵字是'interface',
- 介面是用來被類實作的,Java中的介面可以被多實作,實作的關鍵字是'implements',
- 介面的多型表現:一個介面的參考,可以指向這個介面的任意實作類物件,
三、語法
描述:
- 介面中可以不寫任何方法,但如果寫方法了,該方法必須是'public abstract'修飾的抽象方法,
- 介面中定義抽象方法可以不用顯式地宣告'public abstract',不寫默認就是'public abstract'修飾的,
- 介面中可以不寫任何屬性,但如果寫屬性了,該屬性必須是'public static final'修飾的靜態常量,且宣告的同時就必須賦值,因為介面中不能撰寫靜態代碼塊,
- 介面中定義靜態常量可以不用顯式地宣告'public static final',不寫默認就是'public static final'修飾的,
- 介面中沒有構造方法,不能被實體化,但允許定義介面型別的參考變數,該參考變數參考實作了這個介面的類的實體,
- 一個類可以實作多個介面;一個介面不能實作介面,但可以繼承多個父介面,
注意:
- 介面必須通過類來實作它的抽象方法,
- 類實作介面時需要實作介面的所有抽象方法,若有抽象方法沒實作,這個類就必須宣告為抽象類,
- 一個參考所指向的物件,是有可能實作任何一個介面的,所以使用'instanceof'關鍵字判斷一個介面型別參考時,只要'instanceof'關鍵字右邊的類或介面不是'final'修飾的,就能編譯通過,運行結果看參考指向的物件型別是否為右邊的類的子類或實作類,
示例:
interface A {
int NUM = 1;
void testA();
}
interface B {
void testB();
}
interface C extends A, B {
void testC();
}
class Student implements C {
public void testA() {
}
public void testB() {
}
public void testC() {
}
public void testD() {
}
}
class Teacher {
}
public class Test {
public static void main(String[] args) {
/* c只能呼叫介面C中宣告和繼承的方法 */
C c = new Student();
System.out.println(c instanceof A);//true
System.out.println(c instanceof B);//true
System.out.println(c instanceof C);//true
System.out.println(c instanceof Student);//true
System.out.println(c instanceof Object);//true
System.out.println(c instanceof Teacher);//false
/*
以下代碼編譯報錯
System.out.println(o instanceof String);
*/
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/228073.html
標籤:其他
