Java 抽象類和普通類、介面的區別——看完你就頓悟了
2、普通類和抽象類都可以被繼承,但是抽象類被繼承後子類必須重寫繼承的方法,除非自類也是抽象類。
看一個例項:
- publicclass Pet {
- publicvoid play(){ //這是寵物類,普通父類,方法裡是空的
- }
- }
- --------------------------
- publicclass Cat extends Pet { //這是子類,是一個貓類,重寫了父類方法
- publicvoid play(){
- System.out.println("貓爬樹");
- }
- }
-
------------------------
- publicclass Dog extends Pet { //這是子類,是一個狗類,重寫了父類方法
- publicvoid play(){
- System.out.println("狗啃骨頭");
- }
- }
- -------------------------
- publicclass Test {
- publicstaticvoid main(String[] args) { //這是測試類,分別呼叫了子類的不同方法
- Pet p1=new Dog(); //多典型的多型表現啊,相當的給力
-
Pet p2=new Cat();
- p1.play();
- p2.play();
- }
- }
輸出結果:
狗啃骨頭
貓爬樹
-----------------------
問題:把父類改成抽象類,方法改成抽象方法,那麼
public void play();//抽象方法沒方法體
子類不變,依然重寫父類方法,那這個跟普通父類沒區別啊?
難道說就一個抽象方法沒方法體就完事了??那我普通方法有方法體,我空著不寫內容不就得了,不跟抽象方法一個樣嗎??
別跟我說抽象類還不能例項化,哥也不需要去new它!
普通類都能搞定的,還弄個抽象類有什麼意義?我前面都說了普通類的方法我可以空著不寫,達到跟抽象類方法沒方法體一樣的效果。
既然兩種方式都能達到同一個輸出效果,弄一種方式不就得了,那為什麼還要創造出一個抽象類出來?難道是比普通類看著舒服?用著爽?還是更加便捷?還是為了強制讓別人用的時候必須強制化實現抽象方法省的你忘了什麼的?
答:就是為了強制不能例項化,以及強制子類必須實現方法這不是你忘不忘的問題
你說你不去new它就行了,這話沒錯
那你想另一個問題,為什麼要有訪問控制呢?為什麼要有private和public之分呢?
我可以全部public,不該訪問的,我不訪問就行了啊
小程式裡,看不出什麼區別,反而private成員要寫一堆set和get函式,多麻煩,我自己寫小程式的時候也會偷懶全部public
但是專案大了,程式碼多了,這種嚴謹的結構就很重要了
且不說會有很多人合作一起寫一個程式,哪怕還是你一個人寫,也保不住有忘記的時候,那時候編譯器不報錯,茫茫碼海上哪找錯誤去
面向物件說到底就是方便你思考,模組化,易維護管理,硬要說沒必要,整個面向物件都沒必要了,C語言有什麼幹不了的呀,執行效率還高。
二、抽象類與介面的區別:
1、概念不一樣。介面是對動作的抽象,抽象類是對本質的抽象。
抽象類表示的是,這個物件是什麼。介面表示的是,這個物件能做什麼。比如,男人,女人,這兩個類(如果是類的話……),他們的抽象類是人。說明,他們都是人。人可以吃東西,狗也可以吃東西,你可以把“吃東西”定義成一個介面,然後讓這些類去實現它。
所以,在高階語言上,一個類只能繼承一個類(抽象類)(正如人不可能同時是生物和非生物),但是可以實現多個介面(吃飯介面、走路介面)。
2、使用不一樣:
a.抽象類 和 介面 都是用來抽象具體物件的. 但是介面的抽象級別最高
b.抽象類可以有具體的方法 和屬性, 介面只能有抽象方法和不可變常量
c.抽象類主要用來抽象類別,介面主要用來抽象功能.
d.抽象類中,且不包含任何實現,派生類必須覆蓋它們。介面中所有方法都必須是未實現的。
e.介面是設計的結果 ,抽象類是重構的結果
3、使用方向:當你關注一個事物的本質的時候,用抽象類;當你關注一個操作的時候,用介面。
注意:抽象類的功能要遠超過介面,但是,定義抽象類的代價高。因為高階語言來說(從實際設計上來說也是)每個類只能繼承一個類。在這個類中,你必須繼承或編寫出其所有子類的所有共性。雖然介面在功能上會弱化許多,但是它只是針對一個動作的描述。而且你可以在一個類中同時實現多個介面。在設計階段會降低難度的。