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

目次

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

インターフェースとは

・インタフェースは、定数と抽象メソッドを記述できます。

・インターフェースの抽象メソッドは、メソッドの定義はしますが、処理内容は記述しません(※)。

→処理の概要を表すといえます。

→インターフェースを実装したクラスに、抽象メソッドのオーバーライドを強制します。処理内容はこのオーバライドしたメソッドに記述します。

※Java8からdefault,staticを追加することで処理内容を記述できるようになりました。

 

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

3行目はinterfaceがあります。

package test1;

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

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

 

インターフェースの構文

[アクセス修飾子]  interface インターフェース名  {
     [public static final] 変数の型 変数 = 値;  //定数
     [public abstract] 戻り値の型 メソッド名(引数);  //抽象メソッド
}

・public static finalとpublic abstractの記述は省略可能です。
・インターフェースは他のインターフェースも継承できます。
・インスタンスの生成でインターフェースの型を指定した場合、そのインターフェースにあるメソッドのみ使用できます。

 

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

アクセス修飾子  class  クラス名  implements インターフェース名{
}

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

 

使用方法

1.ポリモフィズムを実現します。メソッドの引数のデータ型をインターフェースの型にしておけば、同じインターフェースを実装している別のクラスのインスタンスを引数にできます。
https://itsakura.com/java_polymorphism

2.継承先でメソッドのオーバーライドを強制するのでメソッドの実装漏れを防ぎたいときに使用します。

 

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

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

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つのインターフェースをカンマ区切りで実装しています。

 

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

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

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行目は、クラスを継承し、インターフェースを実装しています。

 

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

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

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行目は、インターフェースがインターフェースを継承しています。

 

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

10行目は2つのインターフェースを実装しています。
22行目は、1つめのインターフェースのデータ型です。
26行目は、2つめのインターフェースのデータ型です。

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
	}
}

22行目は、インスタンスの生成でインターフェース(InterfaceA)の型を指定しています。24行目のprintBメソッドは、InterfaceAにないので実行できません。

26行目は、インスタンスの生成でインターフェース(InterfaceB)の型を指定しています。27行目のprintAメソッドは、InterfaceBにないので実行できません。

22,26行目とも指定したインターフェースにあるメソッドのみ使用できます。

 

defaultメソッド

3行目はinterfaceがあり、4行目はメソッドの前に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メソッド

3行目はinterfaceがあり、4行目はメソッドの前に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と出力される
	}
}

10行目は、staticメソッドを実行しています。

関連の記事

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

△上に戻る