2012-07-27 60 views
2

我知道抽象類和具體類之間的幾個區別。我知道你不能創建一個抽象類與具體類不同的抽象類,抽象類可以有'抽象'方法。java - 抽象類和具體類之間的獨特區別

但我有一個像下面這樣的例子。很多時候,我們在工作中看到以下例子。我將跳過一些可以在Parent類中定義的常用方法。

public abstract class Parent { 
    public void init() { 
     doInit(); 
    } 
    public abstract void doInit(); 
} 

public class Child extends Parent { 
    public void doInit() { 
     // implementation 
    } 
} 

我認爲我們可以用像下面這樣的具體類來做同樣的事情。

public class Parent { 
     public void init() { 
      doInit(); 
     } 
     public void doInit() { 
      // Empty 
     } 
    } 

我很好奇,看看是否有任何獨特的情況,我們必須使用抽象類。上面的例子在運行時有什麼顯着差異嗎?

謝謝。

+1

您的第二個'Parent'類仍然是一個抽象類,因爲它有一個抽象方法。這不是一個具體的類,因爲你不能創建它的一個實例。 – 2012-07-27 03:04:25

+0

在第二個例子中,doInit是不是「抽象」的意思?事實上,這不會被編譯。 – 2012-07-27 03:05:26

+0

記得在第二個例子中刪除'doInit()'上的大括號。 – LastStar007 2012-07-27 03:13:05

回答

6

在這種情況下使用abstract類的原因是強制繼承基類的每個人都覆蓋抽象doInit方法。如果沒有這個類和方法是抽象的,他們可能會忘記這麼做,編譯器也不會抓住它們。

除了這個實用的目的,抽象類提供了一種強大的方式來將您的設計理念傳達給您的代碼讀者。抽象類告訴讀者,裏面的方法爲一組相關的類提供了一些通用的實現,而不是實現你正在建模的單個概念。很多時候,向讀者傳達您的意圖與編寫正確代碼一樣重要,因爲否則它們可能在維護代碼時破壞某些內容。

在Java中習慣稱爲抽象類Abstract...;在你的例子中,這將是AbstractParent

+1

事實上,編譯某個東西可能是一件壞事,編譯器錯誤要比由於空方法導致的奇怪錯誤更容易解決 – 2013-07-02 19:12:42

0

抽象類在軟件設計中使用了各種有用的屬性。

除了明顯的不同之外,比如不能被實例化和能夠容納抽象方法。它們對於定義常見但可重寫的函數非常有用,它們持有以邏輯方式處理它的子項的靜態方法。

儘管我最喜歡的是抽象工廠模式。

通過製造一個工廠,它可能創建的所有類的父級,它可以強制創建所需的功能,這實際上會導致奇怪的人工製品,技術上更緊密的代碼實際上更容易維護。

2

當然,你可以這樣做,但這一切都取決於正確的業務邏輯。有可能會出現這樣的情況,你需要對擴展你的代碼的人執行策略。

例如,我編寫一個Employee類,並且擴展我的類來編寫ProjectManager類。但假設業務不允許直接實例化員工(就像我剛纔說的,只是一個例子)。所以我將我的Employee類聲明爲抽象類型,從而強制我的類的所有擴展器(讀取您)都無法直接實例化Employee。 (當然,它會通過繼承鏈間接發生,也就是說,父對象是在子對象之前創建的。)

正確使用時,地點A處的人控制地點B中的其他人將如何編碼。

2

具體類是一個具有所有方法的實現(代碼裏面)的類。它是否來自其他類別並不重要。

public abstract class IAmAbstract{ 
    public void writeMe(){ 
     System.out.println("I am done with writing"); 
    } 
} 

public class IAmConcrete extends IAmAbstract{ 
    public void writeMe(){ 
     System.out.println("I am still writing"); 
    } 
}