2011-05-13 103 views
1

可能重複:
Abstract class in Java抽象類

在Java中,

是否每個類,其他類的擴展必須是一個抽象類?

如果沒有,在什麼條件下?

更一般的,我們什麼時候才能決定一個類是一個抽象類?

+2

possiblity duplicate http://stackoverflow.com/q/1320745/668970 – developer 2011-05-13 11:11:43

+2

我不這麼認爲,達莫達。這是關於抽象的需要,而不是關於概念的含義。 – 2011-05-13 11:14:28

+0

我同意Urs Reupke。 – 2011-05-13 11:15:28

回答

4

其他類延伸的每個類都必須是抽象類嗎?

沒有

如果一個類包含在其聲明中則其爲abstract

考慮例如abstract

public abstract class Foo{} 

更多

+0

感謝您的評論。一個沒有聲明爲抽象的類是否可以包含一個抽象的內部方法? – 2011-05-13 11:14:24

+0

'沒有'類bneeds被宣佈爲這種情況下的抽象 – 2011-05-13 11:15:30

7

絕對不是。類可以擴展而不是抽象的。

通常,當您需要基於其他方法定義某些方法的行爲時,您會進行類抽象,但無法提供此類中這些方法的實現。

例如:

public abstract class Vehicle { 
    public void goHome() { 
     move(getHome()); 
    } 
    public abstract void move(); 
} 

class Car extends Vehicle { 
    @Override public void move() { //use engine }; 
} 
class Bicycle extends Vehicle { 
    @Override public void move() { //use pedals }; 
} 

(一類可以沒有抽象方法如果類本身不是摘要)。

另一個有效的原因是該類是一些基類,它是沒有意義的被實例化。您可以指定受保護的構造函數,也可以將其構造爲抽象。

+0

偉大的答案,非常有用。謝謝。 – 2011-05-13 11:20:36

1

每個超類都不是抽象類。

例如對象 class是所有類的超類,但它不是抽象的。

我們將使用抽象類,我們不希望程序員或用戶創建對象。

還可以綁定默認屬性和行爲,以便擴展抽象的類必須強制繼承該屬性。

0

要回答您的一般問題,我們可能希望類是抽象的,以便在其中具有一些常規行爲,而子類具有特定的實現。

我已經看到它主要在很多地方有良好的一些默認的通用行爲,只有少數子類需要改變。另外,如另一個答案中的statd所示,如果我們不希望用戶實例化一般類但想要強制他使用特定的實現,抽象幫助。

1

每個超類不一定是抽象的,但Scott Meyer在他的「Effective C++」中提出,對象層次結構中的每個非葉類應該是抽象的。現在我們擁有Java,那麼這個概念應該擴展爲讀取「抽象或接口」。

1

您可以看到抽象類作爲某種產品的原型版本。例如,你有一個產品的規格,有幾種方法可以實施。抽象類指定了所有這些規範,但由於沒有默認設置,因此它沒有提供任何實現,它們必須通過各種版本的產品(您的子類)以不同的方式實現。但它可能已經實現了各種產品將具有的功能。

這自動意味着你不能初始化一個抽象類,因爲它沒有實現規範的某些部分。