#1、抽象類 若是一個類沒有足夠的信息來描述一個具體的對象,而須要其餘具體的類來支撐它,那麼這樣的類咱們稱它爲抽象類;java
在面向對象領域因爲抽象的概念在問題領域沒有對應的具體概念,因此用以表徵抽象概念的抽象類是不能實例化的。安全
抽象類體現了數據抽象的思想,是實現多態的一種機制。它定義了一組抽象的方法,至於這組抽象方法的具體表現形式有派生類來實現。同時抽象類提供了繼承的概念,它的出發點就是爲了繼承,不然它沒有存在的任何意義。因此說定義的抽象類必定是用來繼承的,同時在一個以抽象類爲節點的繼承關係等級鏈中,葉子節點必定是具體的實現類;.net
建立抽象類和抽象方法很是有用,由於他們可使類的抽象性明確起來,並告訴用戶和編譯器打算怎樣使用他們.抽象類仍是有用的重構器,由於它們使咱們能夠很容易地將公共方法沿着繼承層次結構向上移動。對象
注意特徵:blog
- 抽象類不能被實例化,實例化的工做應該交由它的子類來完成,它只須要有一個引用便可。
- 抽象方法必須由子類來進行重寫。
- 只要包含一個抽象方法的抽象類,該方法必需要定義成抽象類,無論是否還包含有其餘方法。
- 抽象類中能夠包含具體的方法,固然也能夠不包含抽象方法。
- 子類中的抽象方法不能與父類的抽象方法同名。
- abstract不能與final並列修飾同一個類。
- abstract 不能與private、static、final或native並列修飾同一個方法 。
#2、接口 接口是一種比抽象類更加抽象的「類」。這裏給「類」加引號是我找不到更好的詞來表示,可是咱們要明確一點就是,接口自己就不是類,從咱們不能實例化一個接口就能夠看出。如new Runnable();確定是錯誤的,咱們只能new它的實現類。繼承
接口是用來創建類與類之間的協議,它所提供的只是一種形式,而沒有具體的實現。同時實現該接口的實現類必需要實現該接口的全部方法,經過使用implements關鍵字,他表示該類在遵循某個或某組特定的接口,同時也表示着「interface只是它的外貌,可是如今須要聲明它是如何工做的」。接口
接口是抽象類的延伸,java了保證數據安全是不能多重繼承的,也就是說繼承只能存在一個父類,可是接口不一樣,一個類能夠同時實現多個接口,無論這些接口之間有沒有關係,因此接口彌補了抽象類不能多重繼承的缺陷,可是推薦繼承和接口共同使用,由於這樣既能夠保證數據安全性又能夠實現多重繼承。get
注意特徵:編譯器
- Interface的方全部法訪問權限自動被聲明爲public。確切的說只能爲public,固然你能夠顯示的聲明爲protected、private,可是編譯會出錯!
- 接口中能夠定義「成員變量」,或者說是不可變的常量,由於接口中的「成員變量」會自動變爲爲public static final。能夠經過類命名直接訪問:ImplementClass.name。
- 接口中不存在實現的方法。
- 實現接口的非抽象類必需要實現該接口的全部方法。抽象類能夠不用實現。
- 不能使用new操做符實例化一個接口,但能夠聲明一個接口變量,該變量必須引用(refer to)一個實現該接口的類的對象。可使用 instanceof 檢查一個對象是否實現了某個特定的接口。例如:if(anObject instanceof Comparable){}。
- 在實現多接口的時候必定要避免方法名的重複。
#3、區別編譯
- 語法層次不一樣;
- 抽象類能夠擁有任意範圍的成員數據,同時也能夠擁有本身的非抽象方法,可是接口中,它僅可以有靜態、不能修改的成員數據;
- 對子類而言,它只能繼承一個抽象類(這是java爲了數據安全而考慮的),可是卻能夠實現多個接口;
- 接口的全部方法都是抽象的;
- 抽象層次不一樣:抽象類是對類抽象,而接口是對行爲的抽象;
參考文獻:
http://blog.csdn.net/chenssy/article/details/12858267