JAVA-抽象類和接口的區別總結

  首先.抽象類和接口都很好的提供了一種將實現和接口分離的方法..

 一、抽象類

我們都知道在面向對象的領域一切都是對象,同時所有的對象都是通過類來描述的,但是並不是所有的類都是來描述對象的。如果一個類沒有足夠的信息來描述一個具體的對象,而需要其他具體的類來支撐它,那麼這樣的類我們稱它爲抽象類。比如new Animal(),我們都知道這個是產生一個動物Animal對象,但是這個Animal具體長成什麼樣子我們並不知道,它沒有一個具體動物的概念,所以他就是一個抽象類,需要一個具體的動物,如狗、貓來對它進行特定的描述,我們才知道它長成啥樣。

      在面向對象領域由於抽象的概念在問題領域沒有對應的具體概念,所以用以表徵抽象概念的抽象類是不能實例化的。

      同時,抽象類體現了數據抽象的思想,是實現多態的一種機制。它定義了一組抽象的方法,至於這組抽象方法的具體表現形式有派生類來實現。同時抽象類提供了繼承的概念,它的出發點就是爲了繼承,否則它沒有存在的任何意義。

 接口的特點:

     1、抽象類不能被實例化,實例化的工作應該交由它的子類來完成 

     2、抽象方法必須由子類來進行重寫 

     3、只要包含一個抽象方法的抽象類,該方法必須要定義成抽象類,不管是否還包含有其他方法
     4、abstract不能與final並列修飾同一個類
     5、abstract 不能與private、static、final或native並列修飾同一個方法
	public abstract class Animal {  
		public abstract void cry();  
	}  
	  
	public class Cat extends Animal{  
	  
		@Override  
		public void cry() {  
			System.out.println("貓叫:喵喵...");  
		}  
	}   
	public class Dog extends Animal{  
		@Override  
		public void cry() {  
			System.out.println("狗叫:汪汪...");  
		}  
	  
	}  
	public class Test {  
		public static void main(String[] args) {  
			Animal a1 = new Cat();  
			Animal a2 = new Dog();    
			a1.cry();  
			a2.cry();  
		}  
	}  
	  
	----Output:--  
	貓叫:喵喵...  
	狗叫:汪汪... </span>
二、接口

      接口是一種比抽象類更加抽象的“類”。這裏給“類”加引號是我找不到更好的詞來表示,但是我們要明確一點就是,接口本身就不是類,從我們不能實例化一個接口就可以看出。如new Runnable();肯定是錯誤的,我們只能new它的實現類。

      接口是用來建立類與類之間的協議,它所提供的只是一種形式,而沒有具體的實現。同時實現該接口的實現類必須要實現該接口的所有方法,通過使用implements關鍵字,他表示該類在遵循某個或某組特定的接口,同時也表示着“interface只是它的外貌,但是現在需要聲明它是如何工作的”。

      接口是抽象類的延伸,java了保證數據安全是不能多重繼承的,也就是說繼承只能存在一個父類,但是接口不同,一個類可以同時實現多個接口,不管這些接口之間有沒有關係,所以接口彌補了抽象類不能多重繼承的缺陷,但是推薦繼承和接口共同使用,因爲這樣既可以保證數據安全性又可以實現多重繼承。

  接口的特點:

     1、Interface的方所有方法訪問權限自動被聲明爲public。確切的說只能爲public,當然你可以顯示的聲明爲protected、private,但是編譯會出錯!

     2、接口中不存在實現的方法(java8 支持默認方法)
     3、實現接口的非抽象類必須要實現該接口的所有方法。抽象類可以不用實現。
     4、在實現多接口的時候一定要避免方法名的重複
三、抽象類與接口的區別

      儘管抽象類和接口之間存在較大的相同點,甚至有時候還可以互換,但這樣並不能彌補他們之間的差異之處。下面將從語法層次和設計層次兩個方面對抽象類和接口進行闡述。

 1、 抽象層次不同。抽象類是對類抽象,而接口是對行爲的抽象。抽象類是對整個類整體進行抽象,包括屬性、行爲,但是接口卻是對類局部(行爲)進行抽象。

 2、 跨域不同。抽象類所跨域的是具有相似特點的類,而接口卻可以跨域不同的類。我們知道象類是從子類中發現公共部分,然後泛化成抽象類,子類繼承該父類即可,但是接口不同。實現它的子類可以不存在任何關係,共同之處。例如貓、狗可以抽象成一個動物類抽象類,具備叫的方法。鳥、飛機可以實現飛Fly接口,具備飛的行爲,這裏我們總不能將鳥、飛機共用一個父類吧!所以說抽象類所體現的是一種繼承關係,要想使得繼承關係合理,父類和派生類之間必須存在"is-a" 關係,即父類和派生類在概念本質上應該是相同的。對於接口則不然,並不要求接口的實現者和接口定義在概念本質上是一致的, 僅僅是實現了接口定義契約而已。

 3、 設計層次不同。對於抽象類而言,它是自下而上來設計的,我們要先知道子類才能抽象出父類,而接口則不同,它根本就不需要知道子類的存在,只需要定義一個規則即可,至於什麼子類、什麼時候怎麼實現它一概不知。比如我們只有一個貓類在這裏,如果你這是就抽象成一個動物類,是不是設計有點兒過度?我們起碼要有兩個動物類,貓、狗在這裏,我們在抽象他們的共同點形成動物抽象類吧!所以說抽象類往往都是通過重構而來的!但是接口就不同,比如說飛,我們根本就不知道會有什麼東西來實現這個飛接口,怎麼實現也不得而知,我們要做的就是事前定義好飛的行爲接口。所以說抽象類是自底向上抽象而來的,接口是自頂向下設計出來的。

爲了更好的理解可參考例子:http://blog.csdn.net/ttgjz/article/details/2960451

四、總結

     1、 抽象類在java語言中所表示的是一種繼承關係,一個子類只能存在一個父類,但是可以存在多個接口。

       2、 在抽象類中可以擁有自己的成員變量和非抽象類方法,但是接口中只能存在靜態的不可變的成員數據(不過一般都不在接口中定義成員數據),而且它的所有方法都是抽象的。

      3、抽象類和接口所反映的設計理念是不同的,抽象類所代表的是“is-a”的關係,而接口所代表的是“like-a”的關係。

      抽象類和接口是java語言中兩種不同的抽象概念,他們的存在對多態提供了非常好的支持,雖然他們之間存在很大的相似性。但是對於他們的選擇往往反應了您對問題域的理解。只有對問題域的本質有良好的理解,才能做出正確、合理的設計


 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章