🎯

【Java】クラス解説36・インターフェイス

2024/05/15に公開

インターフェイス

インターフェイスとは、下記の特徴があります。

  1. 直接的にインスタンス化できない。
  2. フィールドは定数のみです。暗黙的にpublic static finalになり、初期化子が必要になります。
  3. メソッドは原則論的にはpublicな抽象メソッド(=処理内容を実装しない)ですが、staticdefault及びprivateを用いることにより、処理内容を実装できるようになりました。
  4. インターフェイスの特性を引き継いだクラスを定義する時は、implementsを使用する。implementsによりポリモーフィズムを活用することができます。

インスタンス化できないコード例

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Fuzi fz = new Fuzi();
    }
}

interface Fuzi {
    
}

下記のエラーメッセージが出てくるので、interfaceがインスタンス化できないことが分かります。

Main.java:5: error: Fuzi is abstract; cannot be instantiated
        Fuzi fz = new Fuzi();
                  ^
1 error

フィールドが定数のみであるコード例

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Fuzi.fuzi = 2323;
    }
}

interface Fuzi {
    int fuzi = 23;
}

下記のエラーメッセージが出てくるので、変数fuziが定数であるため、値の再代入ができないことが分かります。

Main.java:5: error: cannot assign a value to final variable fuzi
        Fuzi.fuzi = 2323;
            ^
1 error

フィールドに初期化子が必要であるコード例

import java.util.*;

public class Main {
    public static void main(String[] args) {

    }
}

interface Fuzi {
    int fuzi;
}

下記のエラーメッセージが出てくるので、=を使って変数fuziに初期値を代入する必要があります。

Main.java:10: error: = expected
    int fuzi;
            ^
1 error

staticを用いた処理内容の実装

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Fuzi.print();
    }
}

// インターフェイスを定義
interface Fuzi {
    // staticなメソッドを定義
    static void print() {
        // 処理内容を実装
        System.out.println("23");
    }
}

出力結果

23

インターフェイスのメソッドは、本来、抽象メソッドであり処理内容を実装できません。
しかし、staticを用いることにより、処理内容を実装できました。


implementsとポリモーフィズムを用いたコード例

import java.util.*;

public class Main {
    public static void main(String[] args) {
        // アップキャスト
        Blooming o1 = new Fuzi();
        // ポリモーフィズム
        o1.bloom();
        // アップキャスト
        Growing o2 = new Fuzi();
        // ポリモーフィズム
        o2.grow();
    }
}

interface Blooming {
    void bloom();
}

interface Growing {
    void grow();
}

class Plant {
    
}

// インターフェイスを実装したサブクラスを定義
class Fuzi extends Plant implements Blooming, Growing {
    // オーバーライド
    public void bloom() {
        System.out.println("咲く");
    }
    
    // オーバーライド
    public void grow() {
        System.out.println("育つ");
    }
}

出力結果

咲く
育つ

インターフェイスの直接的なインスタンス化はできませんが、implementsによりポリモーフィズムを活用できるため、オーバーライドしたメソッドを実行することができます。


default、private及びimplementsを用いたコード例

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Fuzi o = new Sakura();
        o.print();
    }
}

// インターフェイスを定義
interface Fuzi {
    // defaultなメソッドを定義
    default void print() {
        // 処理内容を実装
        System.out.println(getString());
    }
    // privateなメソッドを定義
    private String getString() {
        return "23";
    }
}

class Sakura implements Fuzi {
    
}

出力結果

23

ポリモーフィズムにより、処理内容を実装したdefaultなメソッドにオーバーライドすることなくアクセスできました。
また、インターフェイス内のprivateなメソッドにアクセスすることができました。


Discussion