web-dev-qa-db-ja.com

サブクラスはインターフェースを継承しますか?

簡単な質問です。インターフェイスと継承について学んでいます。

これは実際のコードではなく、単なる例です。抽象クラスAnimalがあるとしましょう。馬や犬などのグループにはいくつかの継承があります。インターフェイス「ペット」もあります。 Animalのさまざまなサブクラスで使用されます。犬の「犬」のサブクラスは、インターフェース「ペット」を実装します。したがって、「犬」のすべてのサブクラスも、「犬」の各サブクラスに「ペット」を個別に実装することなく、「ペット」インターフェースを実装します。

33
munchschair

あなたが持っている場合:

abstract class StaffMember implements MyInterface

どこで

interface MyInterface {
    void myMethod();
} 

次に、StaffMemberを拡張するすべてのクラスはMyInterface型を継承し、MyInterfaceインスタンスがオペランド/引数として予期されるコードの他の部分で、この基本型によってそれらを参照できます。

void otherMethod(MyInterface param) { //... }

インターフェイスMyInterfaceの実際の実装は、抽象クラス、または抽象クラスを拡張するクラスのいずれかで実行できます。重要なことは、この場合、myMethod()が継承階層のどこかに指定されていることです。これにより、JVMは呼び出す定義を見つけることができます。

17
csvan

いや.

インターフェイスは、クラスがどのように見えるかを定義します(最低限)。これを基本クラスに実装するか、最下位のサブクラスに実装するかは関係ありません。

インターフェイスは、サブクラスと基本クラスの階層全体に完全に実装する必要があり、インターフェイス実装シグネチャが配置されているレベル(_implements Interface_)で定義する必要があります。

サブクラス自体にはインターフェースに関する知識はありませんが、基本クラスを通じて暗黙的な接続があります。

私は優しい人だから:

_public class Test {
    public static void main(String[] args) {
        BaseClass obj = new SubClass();
        obj.test();
        obj.test2();

        SomeInterface obj2 = new SubClass();
        obj2.test();
        obj2.test2();
    }
}

interface SomeInterface {
    public void test();

    public void test2();
}

abstract class BaseClass implements SomeInterface {
    @Override
    public abstract void test();

    @Override
    public void test2() {
        try {
            System.out.println(Arrays.toString(this.getClass().getMethod("test2", null).getDeclaringClass().getInterfaces()));
        } catch (NoSuchMethodException | SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }   
}

class SubClass extends BaseClass {
    @Override
    public void test() {
        try {
            System.out.println(Arrays.toString(this.getClass().getMethod("test", null).getDeclaringClass().getInterfaces()));
        } catch (NoSuchMethodException | SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

}   
_

}

出力:

_[]
[interface SomeInterface]
[]
[interface SomeInterface]
_

ご覧のとおり、test()SubClassに実装されている)は実装されているインターフェイスを返しませんが、test2()BaseClass)は、インターフェイスがそのクラスによって実装されていることを示しています。抽象クラスでは、定義をabstractとしてマークすることにより、サブクラスに実装されるように実装するインターフェースからメソッドを実装できます。

mainメソッドでわかるように、オブジェクトをBaseClassまたはSomeInterfaceとして定義することは機能し、違いはありません。

11
Jeroen Vannevel