2009-01-06 34 views
10

我有繼承自類A的類B。超類A是抽象的,包含一個抽象方法。我不想在類B中實現抽象方法,因此我需要聲明類B也是抽象的。聲明B類抽象,有兩件事情正在爲我工​​作(程序編譯和運行正確):Java中的抽象類和方法繼承

1.)我沒有在類B中聲明任何抽象方法,即使認爲類是抽象的。我認爲這是有效的,因爲類繼承了類A的抽象方法,這足以讓類聲明爲抽象類:我們不需要在類中直接聲明任何其他抽象方法。 2)我在類B中聲明瞭與它在類A中聲明相同的抽象方法。這是某種重寫(?),與在java中重寫(與使用相同的頭文件不同,但提供不同的實現),在這裏我只是再次使用該方法的相同頭。

這兩件事情都在起作用,我不確定它們是否都是好的,以及它們中的一些是否優先(更正確)。這兩種方式是否相同(它們對於Java意味着什麼)?

這裏我舉一些例子說明類,讓我對你意味着更加清晰:

案例1):

public abstract class A { 
    public abstract String giveSum(); 
} 

public abstract class B extends A { 

} 

病例2):

public abstract class A { 
    public abstract String giveSum(); 
} 

public abstract class B extends A { 
    public abstract String giveSum(); 
} 

問候

回答

8

他們在功能上是平等的,但第一個是首選,因爲它更短,並不奇怪。

+1

如何「不會混淆讀者關於是否定義新方法」而不是「不奇怪」? ;-) – 2009-01-06 18:39:49

+0

「不奇怪」是短:-) – 2009-01-06 21:36:06

2

與#1一起去。重寫子類中的方法聲明令人困惑。而且,實際上在抽象類中不需要任何抽象方法,無論父類是否抽象。

+0

但是,如果在類中沒有聲明抽象方法(並且類不從類抽象類繼承),將類聲明爲抽象類是否合理? – user42155 2009-01-06 18:35:12

2

所以,問題是:什麼時候在Java中對一個抽象類進行子類分類並且不想提供實現時首選?

一)標記的子類的抽象太

B)標記的子類的抽象也和重新寫標記爲抽象方法的簽名?

我會去的第一個:

一)標記過的子類的抽象。

前者已經是抽象方法聲明,沒有必要重複它。

35

在Java中,abstract類註釋指示該類不能直接實例化。一個類可以聲明爲abstract,因爲它不應該被實例化(可能它只包含靜態方法),或者因爲它的子類應該被實例化。

這是abstract類包含abstract方法的要求(逆真:包含一個或多個abstract方法必須是abstract一類。)

的你是否應該重複的問題抽象方法的定義可能被認爲是一個樣式問題 - 但我很難提出一個贊成重複定義的論證(我能想到的唯一論點是在類層次結構可能改變語義的情況下或使用該方法,因此您想提供額外的javado c)。

反對重新定義abstract方法的主要觀點是重複代碼很糟糕 - 它使得重構更加麻煩,並且這樣(所有經典的「不重複代碼」參數都適用)。

1

你說得對,這兩種情況是等價的。情況1)更簡單,情況2)是代碼重複 - 避免它。但可能有一個這樣做的原因:

如果A類的方法不返回String,但可以說,C,B類可重寫它(因爲Java 5中),更具體的返回類型,可以說,d(類延伸C):

public abstract class A { 
    public abstract C giveSum(); 
} 

public abstract class B extends A { 
    public abstract D giveSum(); 
} 

public class C { 
    ... 
} 

public class D extends C { 
    ... 
}