Java インターフェースのサンプル(interface)

Javaのインターフェースのサンプルです。

目次

仕組み インターフェースとは
サンプル クラスが複数のインターフェースを実装する
  クラスがクラスの継承とインターフェースの実装を行う
  インスタンスの生成でインターフェースの型を指定する
  インターフェースのメソッドに処理内容を記述する(default)
  インターフェースが他のインターフェースを継承する
  インターフェースにstaticメソッドを追加する

インターフェースとは

アクセス修飾子  interface  インターフェース名  {
     [public static final] 変数の型 変数 = 値;  //定数
     [public abstract] 戻り値の型 メソッド名(引数);  //抽象メソッド
}
  • インターフェースは、interfaceというキーワードを指定します。
  • 定数と抽象メソッドを記述できます。
  • 抽象メソッドは、メソッドの定義はしますが、処理内容は記述しません(※)。
    →処理の概要を表すといえます。
    →処理内容は、抽象クラスを継承したクラスで記述します。
    ※Java8からメソッドにdefaultをつけることでメソッドの内容を記述できるようになりました。
  • 引数のデータ型をインターフェースの型にしておけば、テスト時のモッククラス等のようにクラスの内容が変わっても同じ引数のデータ型を使用できます。
  • 定数のpublic static finalとpublic abstractの記述は省略可能です。
  • 抽象メソッドは、継承先でメソッドのオーバーライドを強制します。
  • インターフェースは他のインターフェースも継承できます。
  • インスタンスの生成でインターフェースの型を指定した場合、そのインターフェースにあるメソッドのみ使用できます。

インターフェースを実装する書き方

アクセス修飾子  class  クラス名  implements  インターフェース名{
}
  • インターフェースの前にimplementsを付けます。
  • インターフェースを実装したクラスなのでクラス名の最後にimplを付ける場合があります。
  • インターフェースを継承してクラスを定義することを「インターフェースを実装する」と言います。
  • 1つのクラスに複数のインターフェースを実装することができます。その場合インターフェースをカンマで区切って記述します。
    →【違い】クラスの継承は、1つのクラスからのみできます。多重継承は不可です。

インターフェースのサンプルです。

package test1;

interface InterfaceA {
	String MOJI = "red";
	void printA();
} 
class Class1 implements InterfaceA{
	@Override
	public void printA() {
		System.out.println(MOJI);
	}
}
public class Test1 {
	public static void main(String[] args) {
		Class1 c1 = new Class1();
		c1.printA(); // red
	}
}

3~6行目は、インターフェースです。
4行目の変数は定数です。public static finalがついているとみなされます。
5行目は、抽象メソッドです。
7行目は、3行目のインターフェースを実装しています。
9行目は、5行目の抽象メソッドをオーバーライドしています。

クラスが複数のインターフェースを実装する

クラスは、複数のインターフェースを実装できます。

package test1;

interface InterfaceA {
	void printA();
}
interface InterfaceB {
	void printB(int cnt2);
}

class Class1 implements InterfaceA,InterfaceB {
	@Override
	public void printA() {
		System.out.println("a");
	}
	public void printB(int c) {
		System.out.println(c + 1);
	}
}
public class Test1 {
	public static void main(String[] args) {
		Class1 c1 = new Class1();
		c1.printA(); // a
		c1.printB(1); // 2
	}
}

10行目は、3行目と6行目のインターフェースを実装しています。

クラスがクラスの継承とインターフェースの実装を行う

クラスは、クラスの継承とインターフェースの実装を一緒にできます。

package test1;

interface InterfaceA {
	void printA();
}
class ClassTest{
}

class Class1 extends ClassTest implements InterfaceA{
	@Override
	public void printA() {
		System.out.println("a");
	}
}
public class Test1 {
	public static void main(String[] args) {
		Class1 c1 = new Class1();
		c1.printA(); // a
	}
}

9行目は、クラスを継承し、インターフェースを実装しています。

インスタンスの生成でインターフェースの型を指定する

インスタンスの生成でインターフェースの型を指定するサンプルです。

package test1;

interface InterfaceA {
	void printA();
}
interface InterfaceB {
	void printB(int cnt2);
}

class Class1 implements InterfaceA, InterfaceB {
	@Override
	public void printA() {
		System.out.println("a");
	}
	public void printB(int c) {
		System.out.println(c + 1);
	}
}
public class Test1 {
	public static void main(String[] args) {

		InterfaceA ia1 = new Class1();
		ia1.printA(); // a
		// ia1.printB(); //コンパイルエラー
 
		InterfaceB ib1 = new Class1();
		// ib1.printA(); //コンパイルエラー
		ib1.printB(1); // 2
	}
}

10行目のクラスは、3,6行目の2つインターフェースを実装しています。
22行目は、インスタンスの生成でインターフェース(InterfaceA)の型を指定しています。24行目のprintBメソッドは、InterfaceAにないので実行できません。
26行目は、インスタンスの生成でインターフェース(InterfaceB)の型を指定しています。27行目のprintAメソッドは、InterfaceBにないので実行できません。
22,26行目とも指定したインターフェースにあるメソッドのみ使用できます。

インターフェースのメソッドに処理内容を記述する(default)

インターフェースのメソッドに処理内容を記述するサンプルです。
defaultキーワードは、Java8から指定できるようになりました。

package test1;

interface InterfaceA {
	default void printA() {
		System.out.println("a");
	};
}
class Class1 implements InterfaceA{
}
public class Test1 {
	public static void main(String[] args) {
		Class1 c1 = new Class1();
		c1.printA(); // a
	}
}

3行目は、インターフェースです。
4行目は、メソッド名の前にdefaultをつけています。5行目にメソッドの処理内容を記述しているのでdefaultがないとコンパイルエラーになります。
8行目は、インターフェースを実装したクラスですがインターフェースのメソッドをオーバーライドしていません。
13行目は、メソッドを実行することができます。

※8行目のクラス内で4行目のdefaultメソッドをオーバーライドすることも可能です。

インターフェースが他のインターフェースを継承する

インターフェースが他のインターフェースを継承できます。

package test1;

interface InterfaceA {
	default void printA() {
		System.out.println("a");
	};
}
interface InterfaceB extends InterfaceA{
	default void printB() {
		System.out.println("b");
	};
}
class Class1 implements InterfaceB{
}
public class Test1 {
	public static void main(String[] args) {
		Class1 c1 = new Class1();
		c1.printA(); // a
		c1.printB(); // b
	}
}

8行目は、インターフェースがインターフェースを継承しています。

インターフェースにstaticメソッドを追加する

インターフェースにstaticメソッドを追加するサンプルです。

package test1;

interface InterfaceA {
	static void printA() {
		System.out.println("a");
	};
}
public class Test1 {
	public static void main(String[] args) {
		InterfaceA.printA(); // a
	}
}

4行目は、インターフェースにstaticメソッドを追加しています。
10行目は、staticメソッドを実行しています。

関連の記事

Java入門 クラスの仕組みとサンプル
Java コンストラクタのサンプル
Java 抽象クラスと抽象メソッドのサンプル(abstract)
Java シングルトン(Singleton)のサンプル
Java ポリモフィズムのサンプル(多態性)

△上に戻る