抽象方法:在類中沒有方法體的方法,就是抽象方法。
抽象類:含有抽象方法的類就叫抽象類。
|||||||||抽象類不能被執行個體化(new)
為什麼要使用抽象方法?
(以下是個人觀點)
因
為在面向對象的程式設計的思想中,任何事物都可以看做是一個類。例如:每個動物都需要休息,都要睡覺(sleep),而不同的動物有不同的睡覺方法,如,蝙蝠
是倒挂在樹上睡,小狗是爬着睡,蛇是盤着睡……等等。由此可以看出,每種動物的睡覺的方式都不一樣,但轉過頭來思考,他們又确實都是在做着同一件事情
(sleep)。是以,在JAVA中引入了抽象類這個概念。就是說,父類中的某些方法不包含任何邏輯(例如上面例子中的sleep方法),并且需要由子類
重寫(例如蝙蝠是挂着睡……)。在這種情況下,我們就應該把這些具有共同特征的方法抽象出來,由子類負責這些抽象方法的實作細節。而父類僅提供此方法的名
稱和聲明、沒有方法的主體。是以子類負責重寫此方法。是以這就是為什麼要使用抽象方法!(個人觀點,不知道對不對?)
============================================
如下代碼:
-----------------------------
class boar
{
abstract void sleep();
}
這段代碼中的類boar裡面有個抽象(abstract)方法sleep(),可以看到這個方法後面沒有方法體,而是用一個“;”号結束。那麼這種方法就叫做抽象方法。
如果編譯這段代碼的話,會提示如下錯誤:
----------------------------------------------------------------
boar.java:1: boar 不是抽象的,并且未覆寫 boar 中的抽象方法 sleep()
^
1 錯誤
意思是說:boar這個類不是抽象的。為什麼呢?因為前面在給抽象類下定義的時候就說過,含有抽象方法的類就叫抽象類。是以,boar這個類必須也是抽象的!
是以應改為如下代碼:
abstract class boar
如果這次編譯的話,就不會提示任何錯誤了。
來看如下代碼:
-------------------------------------------------------------------
abstract class allsleep
class owl extends allsleep
void sleep()
System.out.println("我是貓頭鷹,我是站在樹上睡的");
class bat extends allsleep
System.out.println("我是蝙蝠,我是倒挂在樹上睡的");
public class newsleep
public static void main(String[] sl)
owl objowl=new owl();
bat objbat=new bat();
objowl.sleep();
objbat.sleep();
編譯不會出錯,列印的結果為:
----------------------------
我是貓頭鷹,我是站在樹上睡的
我是蝙蝠,我是倒挂在樹上睡的
但如果把代碼改為如下:
/*void sleep()
}*/
/*owl objowl=new owl();
objbat.sleep();*/
編譯的時候JVM會提示如下:
--------------------------------------------------------------------------
newsleep.java:5: owl 不是抽象的,并且未覆寫 allsleep 中的抽象方法 sleep()
newsleep.java:12: bat 不是抽象的,并且未覆寫 allsleep 中的抽象方法 sleep()
2 錯誤
意思是說:owl類和bat類都沒有實作allsleep中的sleep()方法,而隻是麻木的繼承了過來
是以得到結論:抽象類中的抽象方法必須被實作!
那麼為了證明這個結論,再寫一段代碼,如下:
---------------------------------------------
void eat()
System.out.println("我會吃");
從上面的代碼我們可以看到抽象類allsleep中沒有抽象方法,而我們在子類中也沒有實作allsleep類中的eat()方法,是以,這便證明了我們上面的結論:抽象類中的抽象方法必須被實作!
=====================================================
話說回來,如果一個子類沒有實作父類中的抽象方法呢?
來做個實驗吧:
-------------------------------
我們編譯這段代碼的結果會是怎樣的呢?
其實這個實驗已經做過了,在上上一個例子裡,把owl類和bat類中的内容都屏蔽了,跟這個是一個效果。也就是說:抽象類中的抽象方法必須被實作!
那麼如果我們不想實作的話該怎麼辦呢?很簡單,隻要把子類也聲明為一個抽象類就OK了!
是以我們得到結論:如果一個子類沒有實作父類中的抽象方法,則子類也成為了一個抽象類!
最後來總結下:
抽象類中的抽象方法必須被實作!
如果一個子類沒有實作父類中的抽象方法,則子類也成為了一個抽象類!
抽象類中的普通方法,可以不必實作。