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();
}