接口做用編程
爲何須要接口?接口和抽象類的區別?設計模式
接口就是比「抽象類」還「抽象」的「抽象類」,能夠更加規範的對子類進行約束。全面地專業地實現了:規範和具體實現的分離。工具
抽象類還提供某些具體實現,接口不提供任何實現,接口中全部方法都是抽象方法。接口是徹底面向規範的,規定了一批類具備的公共方法規範。post
從接口的實現者角度看,接口定義了能夠向外部提供的服務。spa
從接口的調用者角度看,接口定義了實現者能提供那些服務。設計
接口是兩個模塊之間通訊的標準,通訊的規範。若是能把你要設計的模塊之間的接口定義好,就至關於完成了系統的設計大綱,剩下的就是添磚加瓦的具體實現了。你們在工做之後,作系統時每每就是使用「面向接口」的思想來設計系統。3d
接口和實現類不是父子關係,是實現規則的關係。好比:我定義一個接口Runnable,Car實現它就能在地上跑,Train實現它也能在地上跑,飛機實現它也能在地上跑。就是說,若是它是交通工具,就必定能跑,可是必定要實現Runnable接口。code
接口的本質探討對象
接口就是規範,定義的是一組規則,體現了現實世界中「若是你是…則必須能…」的思想。若是你是天使,則必須能飛。若是你是汽車,則必須能跑。若是你是好人,則必須能幹掉壞人;若是你是壞人,則必須欺負好人。blog
接口的本質是契約,就像咱們人間的法律同樣。制定好後你們都遵照。
面向對象的精髓,是對對象的抽象,最能體現這一點的就是接口。爲何咱們討論設計模式都只針對具有了抽象能力的語言(好比C++、Java、C#等),就是由於設計模式所研究的,實際上就是如何合理的去抽象。
區別
1. 普通類:具體實現
2. 抽象類:具體實現,規範(抽象方法)
3. 接口:規範
[訪問修飾符] interface 接口名 [extends 父接口1,父接口2…] { 常量定義; 方法定義; }
定義接口的詳細說明:
1. 訪問修飾符:只能是public或默認。
2. 接口名:和類名採用相同命名機制。
3. extends:接口能夠多繼承。
4. 常量:接口中的屬性只能是常量,老是:public static final 修飾。不寫也是。
5. 方法:接口中的方法只能是:public abstract。 省略的話,也是public abstract。
1. 子類經過implements來實現接口中的規範。
2. 接口不能建立實例,可是可用於聲明引用變量類型。
3. 一個類實現了接口,必須實現接口中全部的方法,而且這些方法只能是public的。
4. JDK1.7以前,接口中只能包含靜態常量、抽象方法,不能有普通屬性、構造方法、普通方法。
5. JDK1.8後,接口中包含普通的靜態方法。
//接口的使用 public class TestInterface { 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(); } /**Angle類實現飛行接口和藹良接口*/ class Angel implements Volant, Honest{ public void fly() { System.out.println("我是天使,飛起來啦!"); } 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("我是鳥人,正在飛!"); } }
接口徹底支持多繼承。和類的繼承相似,子接口擴展某個父接口,將會得到父接口中所定義的一切。
//接口的多繼承 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() { } }
面向接口編程是面向對象編程的一部分。 爲何須要面向接口編程? 軟件設計中最難處理的就是需求的複雜變化,需求的變化更多的體如今具體實現上。咱們的編程若是圍繞具體實現來展開就會陷入」複雜變化」的汪洋大海中,軟件也就不能最終實現。咱們必須圍繞某種穩定的東西開展,才能以靜制動,實現規範的高質量的項目。 接口就是規範,就是項目中最穩定的東東! 面向接口編程可讓咱們把握住真正核心的東西,使實現複雜多變的需求成爲可能。 經過面向接口編程,而不是面向實現類編程,能夠大大下降程序模塊間的耦合性,提升整個系統的可擴展性和和可維護性。 面向接口編程的概念比接口自己的概念要大得多。設計階段相對比較困難,在你沒有寫實現時就要想好接口,接口一變就亂套了,因此設計要比實現難。 |