20

私は状況に来ました:

public interface Intr {
    public void m1();
}

public abstract class Abs {
    public void m1() {
        System.out.println("Abs.m1()");
    }
    // public abstract void m1();
}

public class A extends Abs implements Intr {

    @Override
    public void m1() {
        // which method am I overriding, well it is Abs.m1() but why?
        // if method implemented is Abs.m1(), then why I am not getting error for Intr.m1() not implemented.
    }

}
4

4 に答える 4

26

両方の条件を同時に満たしています。すなわち。1 つの実装は、同時に抽象クラスの要件とインターフェイスの要件を満たします。

注意として、Intr別の継承チェーンで使用していない限り、必要ありません。implements Intrまた、抽象クラス定義に移動することも理にかなっています。

于 2012-07-02T15:37:41.320 に答える
5

別のクラスで定義されたメソッドのみをオーバーライドできます。

インターフェイスで宣言されたメソッドは単に実装されています。この区別は、多重継承の問題に取り組むために Java に存在します。クラスは 1 つの親クラスしか拡張できないため、への呼び出しはsuperあいまいさなしに解決されます。ただし、クラスは複数のインターフェースを実装でき、それらはすべて同じメソッドを宣言できます。インターフェイスを「必須」のリストと考えるのが最善です。クラスとして資格を得るにComparableは、compareTo()メソッドが必要ですが、それがどこから来たか、または他のどのインターフェイスが同じメソッドを必要とするかは問題ではありません。

したがって、技術的には、一挙にオーバーライドAbs.m1()して実装します。Intr.m1()

これも問題ないことに注意してください。

public class B extends Abs implements Intr {

    //m1() is inherited from Abs, so there's no need to override it to satisfy the interface
}
于 2012-07-02T15:38:54.897 に答える
0

@Overrideインターフェイスまたは抽象スーパークラスの違いなしでメソッドをオーバーライドすることを保証します。したがって、オーバーライドでエラーは発生しません。

一方、InterfaceメソッドもInterfaceコントラクトに十分なスーパークラスに実装されています。

于 2012-07-02T15:39:42.593 に答える