Developer

【はじめてのJava】特殊なメソッド【インタフェース編】
2021.10.30
Lv1

【はじめてのJava】特殊なメソッド【インタフェース編】

はじめてのJava

このシリーズでは、初めてJavaやプログラミングを勉強する方向けに、Javaによるプログラミングの基礎を説明していきます。
目標レベルは、Javaの資格試験の一つである「Oracle Certified Java Programmer, Silver」(通称Java Silver)に合格できる程度の知識の習得です。
はじめてJavaやプログラムに触れる方にもできるだけわかりやすい解説を心がけていきます。


インタフェース

今回の記事では、「インタフェース」の機能のうち、Java1.8で追加された特殊なメソッドについて解説していきます。
従来、インタフェースには抽象メソッドした記述することができませんでした。
Java1.8からは、インタフェースに通常のメソッドを記述することができる機能が追加されました。
それが「default」メソッドと「static」メソッドです。

目次


defaultメソッド

インタフェースでは、抽象メソッドのみを定義して、実装するクラスでそのメソッドをオーバーライドするという使い方しかできませんでしたが、Java1.8からは処理を記述したメソッドを定義できるようになりました。
インタフェースで処理を持ったメソッドを定義するためにはメソッドに「default」キーワードをつけて定義します。

interface TestInterface {
	
	void methodA(String s); //従来の抽象メソッド
	
	default void methodB(String s){ //defaultキーワードを利用して、処理が記述されたメソッドを定義している。
		System.out.println(s);
	}
}

class Test implements TestInterface {
	
	public void methodB(String s){ //インタフェースに定義された抽象メソッドをオーバーライドしている
		
		methodB("Hello"); //defaultメソッドとして定義したメソッドを呼び出し。
		
	}
}

defaultメソッドを利用することで、処理が書かれたメソッドをインタフェースに定義することができましたが、defaultメソッドを定義する際に注意しなければならない点があります。
インタフェースは、複数継承が可能になっているということは、前回の記事で解説していました。
複数継承を行う場合、継承もとになっているインタフェースに、引数とメソッド名が同じメソッドある場合、コンパイルエラーになってしまいます。
この場合、継承先のインタフェースでdefaultメソッドをオーバーライドすれば、正常にコンパイルすることができます。
継承もとのインタフェースで定義されたdefaultメソッドを呼び出す場合、「super」キーワードを利用します。

interface TestInterface1 {

	default void test() {
		System.out.println("テストインタフェース1");
	}
}

interface TestInterface2{

	default void test() {
		System.out.println("テストインタフェース2");
	}
}

interface TestInterface3 extends TestInterface1,TestInterface2 { //2つのインタフェースで「test()」メソッドが定義されているためコンパイルエラー

}

interface TestInterface3 extends TestInterface1,TestInterface2 {
	
	@Override
	default void test(){ //継承先のインタフェースでtestメソッドをオーバーライドすれば問題ない!
	
		TestInterface1.super.test();
		↑TestInterface1に定義されたtestメソッドを呼び出している。
	}
}

staticメソッド

Java1.8でインタフェースの中にdefaultメソッドという処理内容を記述することができるメソッドを定義することができるようになりましたが、それと同時に「staticメソッド」も定義することができるようになりました。
staticメソッド」は、クラスに定義され、インスタンス化を行わなくても呼び出して実行することができるメソッドです。
基本的には、オブジェクトに依存しないような処理を記述する際に利用されるメソッドです。
インタフェースでも通常のクラスと同じように「static」キーワードを利用してメソッドの定義を行います。

interface TestInterface {

	static void test(){
		System.out.println("Test"); //staticメソッドを定義している。
	}

}

インタフェースに定義されたstaticメソッドはインタフェースを実装したクラスの中で呼び出すことができます。
staticメソッドを呼び出す場合には、「インタフェース名.staticメソッド名」で呼び出します。

interface TestInterface {

	static void test(){
		System.out.println("Test"); //staticメソッドの定義
	}

}
class Test implements TestInterface { //インタフェースを実装したクラスを作成している
	
	public void method(){
		
		TestInterface.test(); //「インタフェース名.メソッド名」でstaticメソッドの呼び出し。
		
	}
}

インタフェース編・次回の内容

今回はJava1.8で追加されたdefaultメソッドやstaticメソッドを定義する方法と使用方法を紹介しました。
インタフェース編は今回で終了です。
インタフェースをうまく活用して効率的なクラス設計をできるよう、いろいろと試してみてください。


初めてのJavaシリーズの目次はこちら
インタフェース編の記事一覧はこちら


java 11 の練習問題一覧はこちら
はじめてのJavaシリーズの練習問題一覧はこちら