@yamayoshi013

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

[Java- silver]デフォルトメソッドをオーバーライドしたメソッドから、元のメソッドの呼び出しについて

Q&A

Closed

Java- silver 合格についてデフォルトメソッドの継承について
ある参考書にて、下記の説明がありました。
1.サブインターフェースやインターフェースを直接実現したクラスでしか利用できない
2.オーバーライドしたメソッドからの呼び出しは、2つ以上の実現や継承の階層をまたいで行えない

例)
参考書に記載されている内容と実装して表示された結果に剥離があったので、詳細についてご教授いただきたいと考えております。
上記参考書の内容だと2つ以上の実現や継承の階層をまたいで行えないとあったのですが、エラーもなく表示がされました。
参考書の記載と私の認識にズレがあるのでしょうか。

表示された文字

Hello
Java

メインクラス)

public class Main {
    public static void main(String[] args) {
        A a = new C();
        a.sample();
    }
}

ソースコード1(Aクラス)

public interface A {
    default void sample() {
        System.out.println("Hello");
    }
}

ソースコード2(Bクラス)

public interface B extends A {
    
}

ソースコード3(Cクラス)

public class C implements B {
    @Override
    public void sample() {
        B.super.sample();
        System.out.println("Java");
    }
}


0 likes

3Answer

ソースコード2(Bクラス)を以下のようにしたときに、Aクラスsample()を呼び出せない、ということでは?

public interface B extends A {
    default void sample() {
        System.out.println("Hello World!");
    }   
}
0Like

返信が遅くなり、申し訳ございません。
お忙しい中ご回答いただき、ありがとうございます。
ただ、解答部分にこのような記載がありました。
「設問のコードでは、次のようなインターフェースとクラスの関係になっているため、CクラスのsampleメソッドからAインターフェースのsampleメソッドを呼び出すことはできません

A interface
[sample(): void]

B interface

C class
[sample(): void]

このような記載があったので、文面的にはCクラスからは一切Aインターフェースを見れないのではないかと思ったのですが、違うのでしょうか。

何卒、よろしくお願いいたします。

0Like

Comments

  1. 上の4つのファイルをコンパイルして実行すると、Helloと出ます。
    これは、『CクラスのsampleメソッドからAインターフェースのsampleメソッドを呼び出せている』からでは?

    $ javac Main.java A.class B.class C.java
    $ java Main
    Hello
    Java
    $
    
  2. @yamayoshi013

    Questioner

    なるほど!腑に落ちました。
    お忙しい中、ありがとうございました!

  3. 「腑に落ちる」ことは、理解を深める上で重要ですね。
    もし、解決であれば、当Q&Aをクローズしていただけたらと思います。

不慣れなもので申し訳ございません!
クローズさせていただきます。
ありがとうございました!

0Like

Your answer might help someone💌