Java 抽象類、普通類、介面的區別——值得你一看的乾貨

艾陽丶發表於2017-05-04

概念

抽象類和具體類是相對的概念。“抽象”是一種存在思想邏輯中的概念,而“具體”是一種可見可觸控的現實物件。簡單說,比如“人”比“男人”抽象一點,“動物”又比“人”更抽象一點,而“生物”又比“動物”更抽象。  

抽象的概念是由具體概念依其“共性”而產生的,把具體概念的諸多個性排出,集中描述其共性,就會產生一個抽象性的概念。抽象思維,是人類思維達到高階階段產生的一種能力,例如,當小孩子思維尚未成熟時,他們只能掌握具體概念,他們在學習代詞“你、我、他”時往往遇到困難,因為代詞具有較高的抽象性。

 總之,抽象概念的外延大,內涵小,具體概念的外延小,內涵大。

 

一、抽象類與普通類的區別

1、普通類可以去例項化呼叫;抽象類不能被例項化,因為它是存在於一種概念而不非具體。

2、普通類和抽象類都可以被繼承,但是抽象類被繼承後子類必須重寫繼承的方法,除非自類也是抽象類。

(問答案例)

public class Pet {

public void play(){                //這是寵物類,普通父類,方法裡是空的
}
}
--------------------------
public class Cat extends Pet {    //這是子類,是一個貓類,重寫了父類方法
public void play(){
  System.out.println("1、貓爬樹");
}
}
------------------------
public class Dog extends Pet {    //這是子類,是一個狗類,重寫了父類方法
  public void play(){
  System.out.println("2、狗啃骨頭");
 }
}
-------------------------
public class Test {
public static void main(String[] args) {  //這是測試類,分別呼叫了子類的不同方法

Pet p1=new Cat();                               //多典型的多型表現啊,相當的給力
Pet p2=new Dog();

p1.play();
p2.play();
}
}

-----------------------
輸出結果:
1、貓爬樹
2、狗啃骨頭
-----------------------

問:把父類改成抽象類,方法改成抽象方法,那麼public void play();  子類不變,依然重寫父類方法,那這個跟普通父類沒區別啊?難道說就一個抽象方法沒方法體就完事了??那我普通方法有方法體,我空著不寫內容不就得了,不跟抽象方法一個樣嗎??別跟我說抽象類還不能例項化,哥也不需要去new它!普通類都能搞定的,還弄個抽象類有什麼意義?我前面都說了普通類的方法我可以空著不寫,達到跟抽象類方法沒方法體一樣的效果。既然兩種方式都能達到同一個輸出效果,弄一種方式不就得了,那為什麼還要創造出一個抽象類出來?難道是比普通類看著舒服?用著爽?還是更加便捷?還是為了強制讓別人用的時候必須強制化實現抽象方法省的你忘了什麼的?

答:就是為了強制不能例項化,以及強制子類必須實現方法這不是你忘不忘的問題,你說你不去new它就行了,這話沒錯
那你想另一個問題,為什麼要有訪問控制呢?為什麼要有private和public之分呢?
我可以全部public,不該訪問的,我不訪問就行了啊?
小程式裡,看不出什麼區別,反而private成員要寫一堆set和get函式,多麻煩,我自己寫小程式的時候也會偷懶全部public,
但是專案大了,程式碼多了,這種嚴謹的結構就很重要了。
且不說會有很多人合作一起寫一個程式,哪怕還是你一個人寫,也保不住有忘記的時候,那時候編譯器不報錯,茫茫碼海上哪找錯誤去物件導向說到底就是方便你思考,易擴充套件、易維護管理,硬要說沒必要,整個物件導向都沒必要了,C語言有什麼幹不了的呀,執行效率還高。

 

二、抽象類與介面

 

1、概念不一樣。介面是對動作的抽象,抽象類是對本質的抽象。

抽象類表示的是,這個物件是什麼。介面表示的是,這個物件能做什麼。比如,男人和女人,他們的抽象類是人類,而貓和狗的抽象類是寵物類。人類可以吃東西,寵物類也可以吃東西,但是兩者不能混為一談,因為有本質的區別。這個“吃東西”是一個動作,你可以把“吃東西”定義成一個介面,然後讓兩個類去實現它的方法。

所以,在高階語言上,一個類只能繼承一個類或抽象類,正如人不可能同時是動物類又是植物類,但是可以實現多個介面,例如,吃飯介面、呼吸介面等。

 

2、使用情況:

a.抽象類 和 介面 都是用來抽象具體物件的. 但是介面的抽象級別最高;

b.抽象類可以有具體的方法 和屬性,  介面只能有抽象方法和不可變常量;

c.抽象類主要用來抽象類別,介面主要用來抽象功能;

d.抽象類中,且不包含任何實現,派生類必須覆蓋它們。介面中所有方法都必須是未實現的;

e.介面是設計的結果 ,抽象類是重構的結果。

 

3、使用方向:

當你關注一個事物的本質的時候,用抽象類;

當你關注一個操作的時候,用介面。

 

小結

抽象類的功能要遠超過介面,但是,定義抽象類的代價高。因為高階語言來說(從實際設計上來說也是)每個類只能繼承一個類。在這個類中,你必須繼承或編寫出其所有子類的所有共性。雖然介面在功能上會弱化許多,但是它只是針對一個動作的描述。而且你可以在一個類中同時實現多個介面。在設計階段會降低難度的。

 


歡迎進大群一起學習:

相關文章