Javaで同じメソッド名で、それぞれのインターフェイスと抽象クラスの実装と拡張

dSanders:

私は、デフォルトの方法は、さまざまなシナリオでのダイヤモンドの問題に対処する方法を理解しようとしています。
そして、これは私が理解できないんだけど、シナリオの一つです。

以下は、説明、ある
デフォルトメソッド1.インターフェース方法()
メソッド2.抽象クラスメソッド()
3。具象クラス上記インタフェースを実装する抽象クラスを拡張します。

interface Interface {
    default void method() {
        System.out.println("Interface method");
    }
}


abstract class AbstractClass {
    void method() {
            System.out.println("Abstract class method");
    }
}


// Concrete class definition first starts
public class ConcreteClass extends AbstractClass implements Interface {

    @Override
    public void method() {
        super.method();
    }

    public static void main(String[] args) {
        Interface test = new ConcreteClass();
        test.method();
    }
}
// Concrete class definition first ends

// Concrete class definition Second starts
public class ConcreteClass extends AbstractClass implements Interface {

    public static void main(String[] args) {
        Interface test = new ConcreteClass();
        test.method();
    }
}
// Concrete class definition Second ends

私のクエリ、

1。なぜ定義が最初にいつものように出力を与えない「抽象クラスメソッド」私が使用しても、インターフェイスの具体的なクラスオブジェクトのタイプを?
2.定義第二はコンパイルできないのはなぜ?
コンパイラは、最初の定義では、抽象クラスの実装を使用している場合は、それは常に定義秒で抽象クラスの実装を使用することを識別することができるはずです。

この動作は非常に私に混乱され、任意のヘルプは大歓迎です。それ以外の場合は、より多くの私はこれを深く掘り下げ、より多くの混乱にはなります。


編集1:
2番目の定義でコンパイルエラーがある「継承されたメソッドAbstractClass.methodは()インタフェースでパブリック抽象メソッドを隠蔽することはできません」

マイケル:

デフォルト:デフォルトの方法はただということです。実装がある場合は、それが使用されます。存在しない場合、デフォルト値が使用されます。ここにはダイヤモンドの問題は(ただし、複数のデフォルト値を使用してそこにすることができます)がありません。

1)ダイナミックディスパッチ

2)抽象クラスは、名前のメソッド与えmethodパッケージプライベートアクセスを。インターフェイスは、公開することが要求されます。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=333932&siteId=1