クラスにインターフェイスを実装するときは、そのインターフェイスで定義されたすべてのメソッドがクラスのソース コードに表示されるようにする必要があります。では、なぜこのコードは簡単にコンパイルできるのでしょうか?
interface A {
void f();
}
class X {
public void f() {}
}
class Y extends X implements A {
}
メソッドをX
既に実装しているためextends 、これにより、そのメソッドの実装が継承されます。f()
Y
X
この場合、解決はメソッド シグネチャによって行われます。また、 classX
は、 A インターフェイスを実装していなくても、正しいシグネチャを持つメソッドを持っています。したがって、実装クラスにY
もそのメソッドがあります。
そのような構造を持つことは有効ですが、クラスにインターフェースも実装させる方法がない場合にのみ使用する必要がありX
ます(外部ライブラリ、コードフリーズ、悪いボスなど)。何が起こっている...コードを読んでいる人は、クラスX
に移動し、そこでメソッドを見つける必要f()
があります...
最初に質問を読み違えましたが、これらも存在する場合に有効ですX implements A
。
句を明示的に指定したとしてもX implements A
、それは問題ではありません。この場合は冗長です。
X
が抽象的で実装されてY
いない場合f()
、も抽象として宣言Y
されていない限り、メソッドの実装が強制されY
ます。
一部のインターフェイス メソッドが派生クラスに実装されていないが、基本クラスにある場合は、基本クラスからの実装が使用されます。
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()
Y
x