1. 程式人生 > >Java_49_介面(interface)

Java_49_介面(interface)

普通類:只有具體實現

抽象類:具體實現和規範(抽象方法)都有

介面:只有規範

為什麼需要介面?介面和抽象類的區別?

介面就是比“抽象類”還“抽象”的“抽象類”,可以更加規範的對子類進行約束。

全面的專業的實現了:規範和具體實現的分離。

抽象類還提供某些具體實現,介面不提供任何實現,介面中所有方法都是抽象方法。介面是完全面向規範的,規定了一批類具有的公共方法規範。

從介面的實現者角度看,介面定義了可以向外部提供的服務。

從介面的呼叫者角度看,介面定義了實現者能提供那些服務。

介面是兩個模組之間通訊的標準,通訊的規範。如果能把你要設計的系統之間模組之間的介面定義好,就相當於完成了系統的設計大綱,剩下的就是添磚加瓦的具體實現了。大家在工作以後,做系統時往往就是使用“面向介面

”的思想來設計系統。

如何定義介面?

格式:[訪問修飾符] interface 介面名 [extends 父介面1,父介面2...]{常量定義、方法定義}

訪問修飾符:只能是public或者預設。

介面名:和類名採用相同命名機制。

extends:介面可以多繼承。

常量:介面中的屬性只能是常量,總是:public static final 修飾。【不寫也是】

方法:介面中的方法只能是:public abstract 修飾。【不寫也是】

介面中的static方法可以通過 介面名[interfaceName].[staticName]();呼叫。

介面中的default方法在即在不破壞java現有實現架構的情況下能往接口裡增加新方法。

JDK8

(1)增加default方法。對已有的介面,如果想對介面增加一個新方法,那麼需要對實現該介面的所有類進行修改,如果介面實的現類很多,就會帶來很大的工作量,而且還很容易破壞以前的程式碼,帶來一些問題。如果把新的方法定義為default方法,就可以避免對其他實現類的修改。

但是,這樣也會有一個問題:如果介面A和介面B裡有一個名字相同並且引數列表也相同的方法都被定義為了default方法,那麼當類C實現介面A和介面B的時候就會在編譯時報錯。由於是編譯時報錯,這個完全可以接受,當類C成功實現了

介面A和介面B以後(沒有衝突),類C的例項就可以呼叫介面A和介面B裡的default方法了。

 

(2)新增了static函式。static修飾的方法也是非抽象方法,有自己的方法體,在介面中定義一個靜態方法,該方法可以直接用< 介面名.方法名() >的形式來呼叫。相當於呼叫類的靜態方法一樣,給方法的呼叫帶來了方便。

介面的本質討論

介面就是規範,定義的是一組規則,體現了現實世界中“如果你是...則必須能...”的思想。如果你是天使,則必須能飛。如果你是汽車,則必須能跑。如果你是好人,則必須幹掉壞人。如果你是壞人,則必須欺負好人。

介面的本質就是契約,就像我們人間的法律一樣。定製好後大家遵守。

OO(Object Oriented)的精髓,是對物件的抽象,最能體現這一點的就是介面。為什麼我們討論設計模式都值針對具備了抽象能力的語言(比如 c++、java、c#等),就是因為設計模式所研究的,實際上就是如何合理的去抽象。

介面使用要點

1.子類通過implements來實現介面中的規範。

2.介面不能建立例項,但是可用於宣告引用變數型別。

3.一個類實現了介面,必須實現介面中所有的方法,並且這些方法只能是public的。

4.介面中只能包含靜態常量、抽象方法,不能有普通屬性、構造方法、普通方法。

5.常量必須是:public static final 我們不寫,系統預設也是這樣。

6.方法必然是:public abstract 我們不加這些修飾,系統也是這樣。

7.介面完全支援多繼承。和類的繼承類似,子介面擴充套件某個父介面,將會獲得父介面中所定義的一切。

使用呼叫介面後類的方法或屬性需要強制轉型,同等與多型【className Test1=(className)Test】

介面可以繼承介面並且可以多繼承interfaceName extends interfaceName01,interfaceName02...

實現也可以多個介面className implements interfaceName01,interfaceName02...

以下測試

public class Test2 implements ccc{

    @Override
    public void aaa() {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void bbb() {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void ccc() {
        // TODO Auto-generated method stub
        
    }

}
interface aaa{
    void aaa();
}
interface bbb{
    void bbb();
}
interface ccc extends aaa,bbb{
    void ccc();
}