5

いくつかの OOP 資料を見ているときに、次の質問を考えて、少し混乱しました。

次のインターフェース、抽象クラス、および具象クラスを持つことを検討してください。

package one;

public interface A {

    void doStuff();
}

package one;


public abstract class B implements A {

    public abstract void doStuff();


}

class C extends B{


    public void doStuff() {

    }
 }

class Cは、 method の実装を提供しない限りコンパイルされませんdoStuff()。ここでの質問:

1-doStuff()クラスCのメソッドは、インターフェイスAのメソッドの実装ですか、それともクラスBの抽象メソッドの実装ですか? より具体的には、JVM は関数をインターフェースまたは抽象クラスの呼び出された関数としてどのように扱うでしょうか?

2-doStuff()抽象クラスBdoStuff()の抽象メソッドは、インターフェースAのメソッドの「実装」と見なされますか? そのため、クラスCdoStuff()がインターフェイスの ? の代わりに抽象クラスのバージョンを実装することが必須になります。

4

5 に答える 5

4

質問1の場合:クラスCのdoStuffメソッドは、BとCの両方に対するdoStuffメソッド宣言の実装です。これは、抽象クラスBとインターフェイスAのdoStuffメソッド宣言が互いに同じ署名を持っているためです。実際、BがCを実装している場合、doStuffメソッドを再度宣言する必要はありません。

質問2の場合:いいえ、BのdoStuffは単なる宣言であり、メソッドの実装ではありません。Bにメソッドの実装や追加のメソッド宣言がない場合、クラスBは不要です。基本的に、抽象クラスは、サブクラスの便宜のために高レベルのロジックを含む一種のテンプレートです。

于 2013-03-04T13:33:49.110 に答える
1

インターフェイスでは、すべてのメソッドはpublicabstractです。

これを知っていると、インターフェイス A の doStuff は実際には public abstract void doStuff(). 抽象クラス B には同じメソッド シグネチャがあるため、見覚えがあるはずです。

質問 1 に答えるには、クラス BdoStuff()はインターフェイス Aと同じdoStuff()です。Java のすべてのメソッドはvirtualdoStuff()であるため、C が A、B、または C として宣言されているかどうかに関係なく、呼び出しは同じになります。

質問 2 については、いいえ。BdoStuff()は、実際には何もしない冗長なコードです。doStuff()C は、B が宣言するかどうかに関係なく、A を実装していdoStuff()ます。

于 2013-03-21T18:21:06.617 に答える
0

を削除すると、

 public abstract void doStuff();

抽象クラスでは、このクラスを継承する子はこのメソッドを実装する必要があります。

クラス B でこのメソッドを削除して、クラス C で結果を確認してください。

http://docs.oracle.com/javase/tutorial/java/IandI/abstract.htmlの抽象クラスがインタフェースを実装する場合のセクションを参照してください。

于 2013-03-04T13:08:00.743 に答える
0

あなたが探している説明はここにあると思います。

質問 1: クラス C のメソッドは両方を実装しています。ただし、これは B を拡張するだけなので、B の抽象メソッドと未実装のインターフェイスを実装するだけで済みます。

質問 2: 実装とは見なされません。抽象クラスは、すべてのインターフェイス メソッドを実装する必要はありません。クラス C での実装は必須です (クラス B に抽象実装がない場合でも)。

于 2013-03-04T13:40:52.450 に答える