在Java中,
是否每個類,其他類的擴展必須是一個抽象類?
如果沒有,在什麼條件下?
更一般的,我們什麼時候才能決定一個類是一個抽象類?
在Java中,
是否每個類,其他類的擴展必須是一個抽象類?
如果沒有,在什麼條件下?
更一般的,我們什麼時候才能決定一個類是一個抽象類?
其他類延伸的每個類都必須是抽象類嗎?
沒有
如果一個類包含在其聲明中則其爲abstract
考慮例如abstract
:
public abstract class Foo{}
更多
感謝您的評論。一個沒有聲明爲抽象的類是否可以包含一個抽象的內部方法? – 2011-05-13 11:14:24
'沒有'類bneeds被宣佈爲這種情況下的抽象 – 2011-05-13 11:15:30
絕對不是。類可以擴展而不是抽象的。
通常,當您需要基於其他方法定義某些方法的行爲時,您會進行類抽象,但無法提供此類中這些方法的實現。
例如:
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 };
}
(一類可以沒有抽象方法如果類本身不是摘要)。
另一個有效的原因是該類是一些基類,它是沒有意義的被實例化。您可以指定受保護的構造函數,也可以將其構造爲抽象。
偉大的答案,非常有用。謝謝。 – 2011-05-13 11:20:36
每個超類都不是抽象類。
例如對象 class是所有類的超類,但它不是抽象的。
我們將使用抽象類,我們不希望程序員或用戶創建對象。
還可以綁定默認屬性和行爲,以便擴展抽象的類必須強制繼承該屬性。
要回答您的一般問題,我們可能希望類是抽象的,以便在其中具有一些常規行爲,而子類具有特定的實現。
我已經看到它主要在很多地方有良好的一些默認的通用行爲,只有少數子類需要改變。另外,如另一個答案中的statd所示,如果我們不希望用戶實例化一般類但想要強制他使用特定的實現,抽象幫助。
每個超類不一定是抽象的,但Scott Meyer在他的「Effective C++」中提出,對象層次結構中的每個非葉類應該是抽象的。現在我們擁有Java,那麼這個概念應該擴展爲讀取「抽象或接口」。
您可以看到抽象類作爲某種產品的原型版本。例如,你有一個產品的規格,有幾種方法可以實施。抽象類指定了所有這些規範,但由於沒有默認設置,因此它沒有提供任何實現,它們必須通過各種版本的產品(您的子類)以不同的方式實現。但它可能已經實現了各種產品將具有的功能。
這自動意味着你不能初始化一個抽象類,因爲它沒有實現規範的某些部分。
possiblity duplicate http://stackoverflow.com/q/1320745/668970 – developer 2011-05-13 11:11:43
我不這麼認爲,達莫達。這是關於抽象的需要,而不是關於概念的含義。 – 2011-05-13 11:14:28
我同意Urs Reupke。 – 2011-05-13 11:15:28