0

クラスにインターフェイスを実装するときは、そのインターフェイスで定義されたすべてのメソッドがクラスのソース コードに表示されるようにする必要があります。では、なぜこのコードは簡単にコンパイルできるのでしょうか?

interface A {
    void f();
}
class X {
    public void f() {}
}
class Y extends X implements A {
}
4

5 に答える 5

5

メソッドをX既に実装しているためextends 、これにより、そのメソッドの実装が継承されます。f()YX

この場合、解決はメソッド シグネチャによって行われます。また、 classXは、 A インターフェイスを実装していなくても、正しいシグネチャを持つメソッドを持っています。したがって、実装クラスにYもそのメソッドがあります。

そのような構造を持つことは有効ですが、クラスにインターフェースも実装させる方法がない場合にのみ使用する必要がありXます(外部ライブラリ、コードフリーズ、悪いボスなど)。何が起こっている...コードを読んでいる人は、クラスXに移動し、そこでメソッドを見つける必要f()があります...

最初に質問を読み違えましたが、これらも存在する場合に有効ですX implements A
句を明示的に指定したとしてもX implements A、それは問題ではありません。この場合は冗長です。

Xが抽象的で実装されてYいない場合f()、も抽象として宣言Yされていない限り、メソッドの実装が強制されYます。

于 2013-10-14T06:50:36.113 に答える
2

一部のインターフェイス メソッドが派生クラスに実装されていないが、基本クラスにある場合は、基本クラスからの実装が使用されます。

インターフェース

interface A {
    void f();
}

基本クラス

class X {
    public void f() {}
}

ここで、コンパイラは methodf()をチェックし、その定義が同じクラスに記述されていない場合は、基底クラスで定義を探します。これは継承の基本的なプロパティです

派生クラス

class Y extends X implements A {
   

}

f()class に間接的に存在していると理解できますY

最初のコンパイラは class を読み取りY、次に interface に移動し、次にclass 内A のメソッドを検索します。そこに書かれていない場合は、基本クラスで検索します。f()Yx

于 2013-10-14T06:52:00.257 に答える