Java interface と abstract について

Java の interface と abstract についてご紹介します。比較すると分かりやすいので、よく比較されがちな2つです。

サンプルとなるコードを見ながらだと理解が早いと思いますので、サンプルとなるコードと合わせて説明していきます。

interface

まずはインターフェースの説明です。3つのサンプルとなるファイルを使用して説明していきます。

InterfaceTest.java

interface InterfaceTest{
  // 定義のみ
  void test();
}

これがインターフェースです。インターフェースは定義だけで実装がありません。

InterfaceTestImplement.java

class InterfaceTestImplement implements InterfaceTest {

  // 必ず実装が必要
  public void test(){
    System.out.println("test");
  };

  //実装しなくてもしても良い
  public void test2(){
    System.out.println("test2");
  };
}

インターフェースの実装です。インターフェースで定義したメソッドを必ず実装しなくてはなりません。実装しないとエラーになります。

最低限インターフェースに定義されたメソッドを実装すればよく、インターフェースに定義されていないメソッドも実装することが出来ます。

Main.java

import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        InterfaceTestImplement interfaceTestImplement = new InterfaceTestImplement();
        interfaceTestImplement.test();
        interfaceTestImplement.test2();
    }
}

インターフェースの実装をインスタンス化して使用します。インターフェース自体はインスタンス化することは出来ません。

abstract

続いてアブストラクトの説明です。こちらも3つのサンプルとなるファイルを使用して説明していきます。

AbstractTest.java

abstract class AbstractTest{

  // 定義のみ
  abstract void test();

  // abstractの無い定義はエラーになる
  // void test2();

  // 実装も記述出来る
  void test3(){
    System.out.println("test3");
  };
}

これがアブストラクトです。アブストラクトは定義と実装を記述することが出来ます。定義を記述する際は先頭に abstract と記述しないとエラーになります。

また、クラスの先頭にも abstract を記述しないとエラーになります。

AbstractTestExtends.java

class AbstractTestExtends extends AbstractTest {

  // 必ず実装が必要
  public void test(){
    System.out.println("test");
  };

  //実装しなくてもしても良い 
  public void test2(){
    System.out.println("test2");
  };
}

アブストラクトの実装です。アブストラクトで定義したメソッドを必ず実装しなくてはなりません。実装しないとエラーになります。

最低限アブストラクトに定義されたメソッドを実装すればよく、アブストラクトに定義されていないメソッドも実装することが出来ます。

Main.java

import java.util.*;

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

    // アブストラクトの実装をインスタンス化
    AbstractTestExtends abstractTestExtends = new AbstractTestExtends();
    abstractTestExtends.test();

    // アブストラクトの実装でのみ実装したメソッドも呼び出せる
    abstractTestExtends.test2();

    // アブストラクトでのみ実装したメソッドも呼び出せる
    abstractTestExtends.test3();
  }
}

アブストラクトの実装をインスタンス化して使用します。アブストラクト自体はインスタンス化することは出来ません。

アブストラクトの実装をインスタンス化すると、アブストラクトで実装したメソッドも使用することが出来ます。これはアブストラクトの実装でアブストラクトを extends で継承しているからですね。

以上、Java interface と abstract についてでした。