[英]Abstract classes and methods in Java, Inheritance
我有B類,它繼承自A類。超類A是抽象的,包含一個抽象方法。 我不想在B類中實現抽象方法,因此我需要將類B聲明為抽象。 聲明B類抽象,有兩件事對我有用(程序編譯並正確運行):
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();
}
問候
在Java中, abstract
類注釋表明該類不能直接實例化。 一個類可以被聲明為abstract
因為它永遠不應該被實例化(也許它只包含靜態方法),或者因為它的子類應該被實例化。
這並不是說一個要求abstract
類包含abstract
方法(逆為真:含有一個或多個類abstract
方法必須是abstract
。)
你是否應該復制抽象方法定義的問題可能被認為是一個風格問題 - 但我很難提出一個支持重復定義的論據(我能提出的唯一論據就是這種情況)類層次結構可能會更改語義或方法的使用,因此您希望在類B中提供額外的javadoc。)
反對重新定義abstract
方法的主要論點是重復的代碼很糟糕 - 它使重構變得更加麻煩等等(所有經典的“不重復的代碼”參數都適用。)
它們在功能上是相同的,但第一個是首選,因為它更短並且不奇怪。
去#1。 重寫子類中的方法聲明令人困惑。 而且你實際上在抽象類中不需要任何抽象方法,無論父類是否是抽象的。
所以,問題是:在java中對抽象類進行子類化並且不想提供實現時,首選哪個?
a)也將子類標記為抽象
b)將子類標記為抽象並重寫標記為抽象的方法簽名?
我會選擇第一個:
a)將子類標記為抽象。
前者已經有了抽象方法聲明,重復它沒有意義。
你是對的,這兩種情況是等價的。 案例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 {
...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.