天天看點

JAVA之抽象類與抽象方法

抽象方法:在類中沒有方法體的方法,就是抽象方法。

抽象類:含有抽象方法的類就叫抽象類。

|||||||||抽象類不能被執行個體化(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了!

是以我們得到結論:如果一個子類沒有實作父類中的抽象方法,則子類也成為了一個抽象類!

最後來總結下:

抽象類中的抽象方法必須被實作!

如果一個子類沒有實作父類中的抽象方法,則子類也成為了一個抽象類!

抽象類中的普通方法,可以不必實作。