·抽象方法java
使用abstract修飾的方法,沒有方法體,只有聲明。定義的是一種「規範」,就是告訴子類必需要給抽象方法提供具體的實現。編程
特色設計模式
·抽象類工具
包含抽象方法的類就是抽象類。經過abstract方法定義規範,而後要求子類必須定義具體實現。經過抽象類,咱們就能夠作到嚴格限制子類的設計,使子類之間更加通用。學習
特色測試
抽象類只能做爲其餘類的基類,它不能直接實例化,對抽象類不能使用new 操做符。設計
抽象類中能夠包含抽象成員,但非抽象類中不能夠。代理
若是一個非抽象類從抽象類中派生,則其必須經過覆蓋來實現全部繼承而來的抽象成員。code
Java 中聲明抽象類時須要使用abstract 關鍵字.對象
抽象類和抽象方法的基本用法
//抽象類 abstract class Animal { abstract public void shout(); //抽象方法 } class Dog extends Animal { //子類必須實現父類的抽象方法,不然編譯錯誤 public void shout() { System.out.println("汪汪汪!"); } public void seeDoor(){ System.out.println("看門中...."); } } //測試抽象類 public class TestAbstractClass { public static void main(String[] args) { Dog a = new Dog(); a.shout(); a.seeDoor(); } }
抽象類的使用要點:
· 爲何須要接口?接口和抽象類的區別?
接口就是比「抽象類」還「抽象」的「抽象類」,能夠更加規範的對子類進行約束。全面地專業地實現了:規範和具體實現的分離。
抽象類還提供某些具體實現,接口不提供任何實現,接口中全部方法都是抽象方法。接口是徹底面向規範的,規定了一批類具備的公共方法規範。(備註:java 1.8以前的接口是隻能定義抽象方法的,默認的接口方法是public abstract,通常是省略了不寫的。可是java 1.8以後接口就能夠定義非抽象的方法了)
從接口的實現者角度看,接口定義了能夠向外部提供的服務。
從接口的調用者角度看,接口定義了實現者能提供那些服務。
接口是兩個模塊之間通訊的標準,通訊的規範。若是能把你要設計的模塊之間的接口定義好,就至關於完成了系統的設計大綱,剩下的就是添磚加瓦的具體實現了。你們在工做之後,作系統時每每就是使用「面向接口」的思想來設計系統。
接口和實現類不是父子關係,是實現規則的關係。好比:我定義一個接口Runnable,Car實現它就能在地上跑,Train實現它也能在地上跑,飛機實現它也能在地上跑。就是說,若是它是交通工具,就必定能跑,可是必定要實現Runnable接口。
· 接口的本質探討
接口就是規範,定義的是一組規則,體現了現實世界中「若是你是…則必須能…」的思想。若是你是天使,則必須能飛。若是你是汽車,則必須能跑。若是你是好人,則必須能幹掉壞人;若是你是壞人,則必須欺負好人。
接口的本質是契約,就像咱們人間的法律同樣。制定好後你們都遵照。
面向對象的精髓,是對對象的抽象,最能體現這一點的就是接口。爲何咱們討論設計模式都只針對具有了抽象能力的語言(好比C++、Java、C#等),就是由於設計模式所研究的,實際上就是如何合理的去抽象。
區別
普通類:具體實現
抽象類:具體實現,規範(抽象方法)
接口:規範
聲明格式:
[訪問修飾符] interface 接口名 [extends 父接口1,父接2…] { 常量定義; 方法定義; }
定義接口的詳細說明:
訪問修飾符:只能是public或默認。
接口名:和類名採用相同命名機制。
extends:接口能夠多繼承。
常量:接口中的屬性只能是常量,老是:public static final 修飾。不寫也是。
方法:接口中的方法只能是:public abstract。 省略的話,也是public abstract。
要點
子類經過implements來實現接口中的規範。
接口不能建立實例,可是可用於聲明引用變量類型。
一個類實現了接口,必須實現接口中全部的方法,而且這些方法只能是public的。
JDK1.7以前,接口中只能包含靜態常量、抽象方法,不能有普通屬性、構造方法、普通方法。
JDK1.8後,接口中包含普通的靜態方法。
接口的使用示例
//聲明接口 interface Animal { public void eat(); public void travel(); } //使用接口 public class MammalInt implements Animal{ public void eat(){ System.out.println("Mammal eats"); } public void travel(){ System.out.println("Mammal travels"); } public int noOfLegs(){ return 0; } public static void main(String args[]){ MammalInt m = new MammalInt(); m.eat(); m.travel(); } }
結果以下:
Mammal eats Mammal travels
一個接口能繼承另外一個接口,和類之間的繼承方式比較類似。接口的繼承使用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.awt.event 包中的 MouseListener 接口繼承的java.util.EventListener 接口定義以下:
package java.util; public interface EventListener {}
沒有任何方法的接口被稱爲標記接口。標記接口主要用於如下兩種目的:
創建一個公共的父接口:
正如EventListener接口,這是由幾十個其餘接口擴展的Java API,你可使用一個標記接口來創建一組接口的父接口。例如:當一個接口繼承了EventListener接口,Java虛擬機(JVM)就知道該接口將要被用於一個事件的代理方案。
向一個類添加數據類型:
這種狀況是標記接口最初的目的,實現標記接口的類不須要定義任何接口方法(由於標記接口根本就沒有方法),可是該類經過多態性變成一個接口類型。
面向接口編程是面向對象編程的一部分。
爲何須要面向接口編程? 軟件設計中最難處理的就是需求的複雜變化,需求的變化更多的體如今具體實現上。咱們的編程若是圍繞具體實現來展開就會陷入」複雜變化」的汪洋大海中,軟件也就不能最終實現。咱們必須圍繞某種穩定的東西開展,才能以靜制動,實現規範的高質量的項目。
接口就是規範,就是項目中最穩定的東西! 面向接口編程可讓咱們把握住真正核心的東西,使實現複雜多變的需求成爲可能。
經過面向接口編程,而不是面向實現類編程,能夠大大下降程序模塊間的耦合性,提升整個系統的可擴展性和和可維護性。
面向接口編程的概念比接口自己的概念要大得多。設計階段相對比較困難,在你沒有寫實現時就要想好接口,接口一變就亂套了,因此設計要比實現難!