私が意味するのは:
interface B {...}
interface A extends B {...} // allowed
interface A implements B {...} // not allowed
私はそれをグーグルで見つけました this :
implements
は、インターフェースのメソッドの実装を定義することを示します。ただし、インターフェイスには実装がないため、これは不可能です。
ただし、インターフェイスは100%抽象クラスであり、抽象クラスはメソッドを実装せずにインターフェイス(100%抽象クラス)を実装できます。 「インターフェース」として定義しているときの問題は何ですか?
詳細に、
interface A {
void methodA();
}
abstract class B implements A {} // we may not implement methodA() but allowed
class C extends B {
void methodA(){}
}
interface B implements A {} // not allowed.
//however, interface B = %100 abstract class B
implements
は実装を意味します。interface
は、実装のためではなくinterface
を提供するためだけに宣言するものです。
100%abstract class
はinterface
と機能的に同等ですが、必要に応じて実装することもできます(この場合、100%abstract
のままではありません)。したがって、JVMの観点からそれらは異なるものです。
また、100%抽象クラスのメンバー変数には、インターフェイス内で暗黙的にpublic static final
であるアクセス修飾子を含めることができます。
implements
は、動作がabstract
メソッドに対して定義されることを意味し(明らかに抽象クラスを除く)、実装を定義します。
extends
は、動作が継承されることを意味します。
インターフェイスを使用すると、1つのインターフェイスが別のインターフェイスと同じ動作をする必要があると言うことができ、実際の実装さえありません。 extends
別のインターフェイスへのインターフェイスを実装するよりも、それがより理にかなっているのはそのためです。
サイドノートで、abstract
クラスがabstract
メソッドを定義できる場合(インターフェースが行うのと同じ方法)でも、classであり、さらに継承(拡張)および実装されていません。
概念的には、2つの「ドメイン」クラスとインターフェースがあります。これらのドメイン内では常に拡張されており、クラスのみがインターフェイスを実装しています。これは一種の「境界を越える」ものです。したがって、基本的にインターフェイスの「拡張」は、クラスの動作を反映しています。少なくとも、これが背後にあるロジックだと思います。誰もがこの種のロジックに同意しているわけではないようです(私は自分で少し工夫していると思います)。実際、まったく異なる2つのキーワードを使用する技術的な理由はありません。
ただし、インターフェイスは100%抽象クラスであり、抽象クラスはメソッドを実装せずにinterface(100%抽象クラス)を実装できます。 「インターフェース」として定義しているときの問題は何ですか?
これは単に慣習の問題です。 Java言語の作者は、「拡張」がこの関係を記述する最良の方法であると判断したため、私たち全員が使用しています。
一般的に、インターフェイスは「100%抽象クラス」ですが、そのようには考えていません。通常、インターフェイスは、派生元のクラスではなく、特定の主要なメソッドを実装する約束として考えられます。そのため、インターフェイスとクラスでは異なる言語を使用する傾向があります。
他の人が述べているように、「実装」ではなく「拡張」を選択する正当な理由があります。
これが私の大学でOOPS(コアJava)で学んだことを少しでもお役に立てば幸いです。
Implementsは、インターフェイスのメソッドの実装を定義することを意味します。ただし、インターフェイスには実装がないため、これは不可能です。ただし、インターフェイスは別のインターフェイスを拡張できます。つまり、メソッドを追加してその型を継承できます。
以下に例を示します。これは私の理解であり、OOPで学んだことです。
interface ParentInterface{
void myMethod();
}
interface SubInterface extends ParentInterface{
void anotherMethod();
}
そして、あることを心に留めておいてください。あるインターフェースは別のインターフェースのみを拡張でき、あるクラスでその機能を定義したい場合は、以下のように実装されたインターフェースのみです。
public interface Dog
{
public boolean Barks();
public boolean isGoldenRetriever();
}
これで、クラスがこのインターフェイスを実装する場合、これは次のようになります。
public class SomeClass implements Dog
{
public boolean Barks{
// method definition here
}
public boolean isGoldenRetriever{
// method definition here
}
}
抽象クラスにいくつかの抽象関数の定義と宣言があり、それらの関数を定義したい場合、またはそれらの関数を実装すると言うことができる場合、抽象クラスは拡張することしかできないため、そのクラスを拡張するとします。以下に例を示します。
public abstract class MyAbstractClass {
public abstract void abstractMethod();
}
MyAbstractClassのサブクラスの例は次のとおりです。
public class MySubClass extends MyAbstractClass {
public void abstractMethod() {
System.out.println("My method implementation");
}
}