Javaのインターフェースについて

今回のお題

今回のお題は、Javaのインターフェースについてです。

目次

  • そもそもinterfaceとは
  • interfaceの定義
  • interfaceの継承
  • default
  • static
  • 抽象クラスとの違い

そもそもinterfaceとは

そもそもinterfaceとは何なのでしょうか?

他の言語ではあまり聞かない用語ですが、基本的には「具体的な処理やインスタンスを持たないクラスのようなもの」を指します。

 

より具体的に言うと、

  • インスタンスは生成できない。
  • メソッドの定義は不可能ではないが、一手間必要。
  • メンバー変数の定義は可能だが、更新ができない。
    またその都合上、必ず初期値のセットが必要。

などの特徴があります。

 

よく似た概念として抽象クラスがありますが、両者の違いは後述します。

interfaceの定義

では、具体的なinterfaceの定義方法を見ていきましょう。

 

interface Interface1{

    public String message = "こんにちは";

  

 

interfaceの定義はこれだけです。

ですが、これだけだと抽象クラスと同じで何もできないので、他のクラスに継承させて実際に処理を行っていきます。

interfaceの継承

では、上記のInterface1を継承していきます。

// 継承したクラスの作成

class Class1 implements Interface1{

    public void hello(){
        System.out.println(message);

    }

}

// インスタンスの作成とメソッドの実行

instance1 = new Class1();

instance1.hello();

 

Interface1を継承したClass1を作成し、そのClass1のインスタンスに対してhello()メソッドを実行しています。

継承は、extendsではなくimplementsで行います。

注意点は、helloメソッドにおける変数messageの使い方ですね。

通常であればあhelloメソッドの引数として渡してあげることになるのですが、今回は定数なので、引数として使わずに直接メソッド内に記述してしまってOKです。

defaultとは

先程はInterface1を継承してClass1を作り、その中にhello()メソッドを定義しました。

他にメソッドを定義する方法としては、Interface側に抽象メソッドを定義し、それを継承先でオーバーライドすると言う方法もあります。

ですがJava8以降、それ以外の方法としてinterface側でdefault句を用いてメソッドを定義するという方法が使えるようになりました。

 

default句の使用例

interface Interface1{

    public String message = "こんにちは";

    default String hello(){
        System.out.println(message);

    }

}

// 継承したクラスの作成

class Class1 implements Interface1{

    // 何も書かなくてOK

}

// インスタンスの作成とメソッドの実行

instance1 = new Class1();

instance1.hello();

 

interface側でメソッドを定義しているので、クラス側では何も追加しなくてOKです。

同じinterfaceを複数のclassに継承して同じメソッドを定義するときなどには便利になりそうですね。

static句

さて、default句にも出番がありそうなことはわかりましたが、それでも継承やインスタンスの生成などの手間は必要です。

何かもっと良い方法はないのでしょうか?

それが、タイトルにもある通りのstatic句です。

interfaceに対して直接メソッドを使用できる形にすることで、継承やインスタンス生成の手間を省いてしまおうというわけですね。

 

以下、使用例です。

// インターフェースとメソッドの定義

interface Interface1{

    public String message = "こんにちは";

    public static String hello(){
        System.out.println(message);

    }

}

// そのまま実行してOK

Interface1.hello();

抽象クラスとの違い

ここまでインターフェースについて見てきましたが、見れば見るほど抽象クラスと似ていますよね。

実は、インターフェースと抽象クラスには大きな違いがあります。

それは、「抽象クラスは多重継承ができないが、インターフェースは多重継承が可能」と言うことです。

多重継承とは、複数のインターフェースを同時に継承させて一つのクラスを作ることです。

多重継承させる場合は、継承元同士をカンマで区切ります。

 

多重継承の例

class Class1 implements Interface1, Interface2{ .... }

終わりに

以上がJavaのinterfaceについてでした。

他の言語では見ない概念なので理解するのに少しかかりそうですが、多重継承などは便利そうだなと感じました。