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

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

目次

仕組み インターフェースとは
サンプル インターフェースのサンプル
クラスが複数のインターフェースを実装する
  クラスがクラスの継承とインターフェースの実装を行う
  インターフェースがインターフェースを継承する
  変数にインターフェースの型を指定する
defaultメソッド / staticメソッド

インターフェースとは

インターフェースの宣言

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

使用方法

  • 1.ポリモフィズムを実現します。メソッドの引数のデータ型をインターフェースの型にしておけば、同じインターフェースを実装している別のクラスのインスタンスを引数にできます。
    https://itsakura.com/java_polymorphism
  • 2.継承先でメソッドのオーバーライドを強制するのでメソッドの実装漏れを防ぎたいときに使用します。

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

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

 

インターフェースのサンプル

package test1;

interface Printer { // インターフェース
	String MOJI = "red"; // 定数
	void print(); // 抽象メソッド
} 
class Box implements Printer{ //インターフェスを実装
	@Override
	public void print() { //オーバーライド
		System.out.println(MOJI);
	}
}
public class Test1 {
	public static void main(String[] args) {
		Box box = new Box();
		box.print(); // red
	}
}

7行目は、3行目のインターフェースを実装しています。
9行目は、5行目の抽象メソッドをオーバーライドしています。

 

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

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

package test1;

interface Printer { //1つめのインターフェース
	void print();
}
interface Calc { //1つめのインターフェース
	void calc(int cnt);
} 

class Box implements Printer,Calc {//上記の2つ
	@Override
	public void print() {
		System.out.println("red");
	}
	public void calc(int c) {
		System.out.println(c + 1);
	}
}
public class Test1 {
	public static void main(String[] args) {
		Box box = new Box();
		box.print(); // red
		box.calc(1); // 2
	}
}

10行目は、2つのインターフェースをカンマ区切りで実装しています。

 

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

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

package test1;

interface Printer { //1つめのインターフェース
	void print();
}
class Process{ //クラス
}

class Box extends Process implements Printer {//上記の2つ
	@Override
	public void print() {
		System.out.println("red");
	}
}
public class Test1 {
	public static void main(String[] args) {
		Box box = new Box();
		box.print(); // red
	}
}

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

 

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

package test1;

interface InterfaceA { //1つめのインターフェース
	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行目は、インターフェースがインターフェースを継承しています。

 

変数にインターフェースの型を指定する

package test1;

interface InterfaceA {//1つめのインターフェース
	void printA();
}
interface InterfaceB {//2つめのインターフェース
	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();//1つめのインターフェースの型
		ia1.printA(); // a
		// ia1.printB(); //コンパイルエラー
 
		InterfaceB ib1 = new Class1();//2つめのインターフェースの型
		// ib1.printA(); //コンパイルエラー
		ib1.printB(1); // 2
	}
}

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

 

defaultメソッド

Java8からdefaultメソッドを指定できるようになりました。

package test1;

interface InterfaceA {
	default void printA() { //defaultメソッド
		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メソッドをオーバーライドすることも可能です。

 

staticメソッド

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

package test1;

interface InterfaceA {
	static void printA() { //staticメソッド
		System.out.println("a");
	};
}
public class Test1 {
	public static void main(String[] args) {
		InterfaceA.printA(); //aと出力される
	}
}

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

関連の記事

Java 抽象クラスと抽象メソッドのサンプル(abstract)
Java ポリモーフィズムのサンプル(多態性)

△上に戻る