0

簡単なものが欠けていることを本当に願っていますが、次を読んでいます: http://docs.oracle.com/javase/tutorial/java/IandI/override.html

2 つのクラスと 1 つのインターフェイスがあります。文字通り、この Oracle ドキュメント ページに示されている「ユース ケース」です。ただし、JUnit テストを実行すると、スーパークラスのメソッドのみが呼び出され 、そのメソッドには呼び出されたくない単純なデフォルトがあります。

インターフェイスには、次のメソッド シグネチャが含まれています。

public interface RecordServiceInterface {
    List<String> searchRecords(String id) throws ServiceException;
}

インターフェイスを実装するスーパークラスには、このメソッドがデフォルトで含まれています。Eclipse IDE は、実装クラスによって実装されていない欠落メソッドを検出すると、これを挿入します。

public class RecordService implements RecordServiceInterface {
    public List<String> searchRecords(String id) throws ServiceException {
        // TODO Auto-generated method stub
        return null;
    }
}

実行時に、デバッガーをステップ実行すると、上記のみが呼び出されます...毎回。

次に、サブクラスはスーパークラスを拡張し、オーバーライドしたい実際の実装を持ちます。

public class MyRecordService extends RecordService {
    @Override
    public List<String> searchRecords(String id) throws ServiceException {  
        List<String> myList = new ArrayList<String>();

        // ...

        return myList;
    }
}

のポイントを完全に見逃しているに違いありません@Override@Override実行中、アノテーションを使用してメソッドに入ることが繰り返し失敗します。

4

4 に答える 4

2

@Override アノテーションが行うことは、オーバーライドできるクラス継承のどこにも対応するメソッドがない場合、コンパイラにエラーを生成させることだけです。したがって、オーバーライドされたメソッドが実際に何かをオーバーライドすることを確認するためのものです。

MyRecordService からのメソッドが呼び出されず、RecordService クラスからのメソッドが呼び出された場合、間違ったオブジェクトがインスタンス化されていると推測されます。目の前にあるのは、MyRecordService 型ではなく、RecordService 型のオブジェクトです。

コードのその部分を提供していないため、これは、継承が問題ないように見えるという事実に基づいた推測にすぎません。

于 2013-07-05T23:12:09.377 に答える
0

@Overridesuper class' またはinstance' のメソッドをオーバーライドしようとするとき、および時折メソッドをオーバーライドしようとするときに、タイプミスをキャッチするための効果的なfinal方法です (設計上、オーバーライドできません)。

オーバーライドの行為により、何を呼び出すかを選択できる場合、メソッドをオーバーライドするためのフォールスルー アプローチが可能になります。

例えば:

RecordServiceInterface service = new RecordService();
RecordService service2 = new RecordService();

と の両方serviceservice2、 からの実装RecordServiceが呼び出されます。今考えてみましょう:

RecordServiceInterface service3 = new MyRecordService();
RecordService service4 = new MyRecordService();
MyRecordService service5 = new MyRecordService();

service3service4およびservice5の実装MyRecordServiceが呼び出されます。

オーバーライドは、それがチェーンの一部でない限り、親の型のメソッドを置き換えません (たとえば、最後のブロックで作成された 3 つのインスタンスすべてを3介して5)。do のインスタンスがObject型でない場合 (MyRecordServiceこの場合)、そのインスタンスのメソッドはその動作でオーバーライドされません。 serviceそして引き続きの実装service2を呼び出します。RecordService

別の例を使用すると、より明確になる場合があります。

public interface Runnable {
    void run();
}

public class RunnableA implements Runnable {
    @Override
    public void run() { System.out.println("A"); }
}

public class RunnableB extends RunnableA {
    @Override
    public void run() { System.out.println("B"); }
}

public class RunnableC implements Runnable {
    @Override
    public void run() { System.out.println("C"); }
}

それらのいずれかのインスタンスしか持てないため、 の呼び出しごとに 1 行しか出力されませんinstance.run()。クラスパスに存在するものではなく、インスタンスの実装に依存します。

于 2013-07-05T23:27:58.123 に答える
0

@Overrideコンパイル時の注釈であり、注釈付きのメソッドが実際にスーパークラス/インターフェースから何かをオーバーライドすることを確認するために使用されます。実行時の動作には影響しません。

テストのコードを投稿して、何をしようとしているのかをより明確に把握できるようにします。

于 2013-07-05T23:13:59.273 に答える
0

@Overridejavadocでわかるように、の保持ポリシー@Overrideは SOURCE です。つまり、コンパイル時に使用されますが、生成されたバイナリ コード (クラス ファイル) にはなりません。

特に、SOURCE 保持ポリシーは次のように定義されています。

注釈はコンパイラによって破棄されます。

于 2013-07-05T23:15:34.093 に答える