簡體   English   中英

Java中的抽象類和方法,繼承

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM