
[code]

    public interface a{
     default void sample(){
     System.out.print("A");
    }
    }
    
    public interface b extends a{
    
    }
    
    public interface c implements b{
     @Override
     public void sample();
      a.super.sample();
      System.out.print("java");
    }
    }
    }
    
    public class Main{
     public static void main(String[] args){
     a a = new c();
     a.sample();
    }
    }
    
[/code]

上記コードについて質問したいのですが、

[code]

    public interface b extends a{
    
    }
    
[/code]

`ｂ`クラスは`a`を実装しているのに、`sample()`を実装していないのは、  
インタフェースを実装するクラスとして間違えていると思うのですが、コンパイルエラーが出ておらず、疑問におもっております。  
`ｂ`クラスで`sample()`を実装しなくても可能か教えて頂きたいです。

インタフェースには以下のようなルールがあります。

  1. インタフェースのオブジェクトを生成することはできません。
  2. インタフェースを実装したクラスは宣言されているメソッドを実装しなければなりません。
  3. インタフェース内で定義した変数は、定数になり変更することができません。


CC BY-SA 4.0
2021-09-05T07:53:05.797
82251
2021-09-06T20:19:05.787
2021-09-05T08:48:26.697
43025
48068
question
java
インタフェースの実装について


質問文中のコードを、なるべく意図を保ったままコンパイルエラーを解消したコードが以下になります。

[code]

    public interface a {
        default void sample() {
            System.out.print("A");
        }
    }
    
[/code]

[code]

    public interface b extends a {
    
    }
    
[/code]

[code]

    public class c implements b {
        @Override
        public void sample() {
            b.super.sample();
            System.out.print("java");
        }
    }
    
[/code]

[code]

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

実際に想定しているコードは上記したものである、という前提で回答すると、

> `ｂ`クラスは`a`を実装しているのに、`sample()`を実装していないのは、  
>  インタフェースを実装するクラスとして間違えていると思うのですが、コンパイルエラーが出ておらず、疑問におもっております。

まず、 `b` はクラスでなくインタフェースです。  
また、仮に `b` は `a` を実装したクラスだとしても、 `sample()` は `a` インタフェースでデフォルト実装されているため、 `b`
での実装は省略できます。

ですので、

> `ｂ`クラスで`sample()`を実装しなくても可能か教えて頂きたいです。

の回答は yes ということになります。

* * *

> インタフェースを実装したクラスは宣言されているメソッドを実装しなければなりません。

については、Java8で default method が導入されました。  
default method によってデフォルトの実装が提供されている場合、実装クラス側での override は必須ではなくなっています。

  * [The Java® Language Specification Java SE 8 Edition > Chapter 9. Interfaces > 9.4. Method Declarations](https://docs.oracle.com/javase/specs/jls/se8/html/jls-9.html#jls-9.4)

> A default method (snip) provides a default implementation for any class that
> implements the interface without overriding the method.


CC BY-SA 4.0
2021-09-06T20:19:05.787
82299
2021-09-06T20:19:05.787
2808
82251
answer