Developer

【はじめてのJava】匿名クラス【匿名クラスとラムダ式編】
2021.11.30
Lv1

【はじめてのJava】匿名クラス【匿名クラスとラムダ式編】

はじめてのJava

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


匿名クラス

今回の記事では、「匿名クラス」という機能を紹介していきます。

目次


匿名クラスとは

以前の記事で、抽象クラスやインタフェースについて解説しました。
抽象クラスやインタフェースは直接インスタンス化することができず、サブクラスや実装クラスを作成してクラスやメソッドを利用するものでした。
抽象クラスのサブクラスや実装クラスを作成して利用しますが、プログラムの中で何らかのインタフェース等を利用したい処理が出てくるたびに実装クラスを作成しなければいけなくなります。
抽象クラスやインタフェースを利用したい箇所がそこだけに限られている場合でも、実装したいメソッドごとに実装クラスを作成することになり、定義するクラスが非常に多くなってしまいます。

その手間を省くために、「匿名クラス」というものを利用することができます。
匿名クラスを利用することで、新しくクラスを作成せずに抽象クラスやインタフェースをそのままインスタンス化させるような動作を行うことができます。
そのため、実装クラスを作成せずに抽象クラスやインタフェースのメソッドを利用できます。

ただし、匿名クラスは明確なクラスとして定義しないので、匿名クラスを利用したそのスコープ内や利用した場所でしかインスタンス化したオブジェクトを利用できません。


匿名クラスの作成

匿名クラスの作成方法には2つのパターンがあります。
匿名クラスで作成したオブジェクトを変数に格納してスコープ内で利用する」パターンと「匿名クラスでオブジェクトを作成し、その場で即座にメソッドを呼び出すために利用する」パターンです。
言葉だけの説明ではわかりにくいので、実際にソースコードを見ながら確認していきます。

匿名クラスで作成したオブジェクトを変数に格納してスコープ内で利用する

匿名クラスを利用して作成したオブジェクトを変数に代入して利用する方法です。
オブジェクトを格納する変数のデータ型はインタフェースを指定します。

(例)Sampleインタフェースを匿名クラスで実装し、抽象メソッドをオーバーライドして利用する

interface Sample{ //Sampleインタフェースの定義

	public void test(); //抽象メソッド「test()」を定義

}
class TokumeiSample1{
	public static void main(String[] args){
		
		Sample sam = new Sample() { //Sample型の変数「sam」を定義し、匿名クラスで実装する
			
			@Override //インタフェースに定義された抽象メソッドのオーバーライド
			public void test(){
				System.out.println("testメソッドのオーバーライド");
			}
		};
		
		//定義されたローカル変数の「sam」はスコープ内で呼び出しが可能になります。
		sam.test();
		//samオブジェクトのtest()メソッドを呼び出す。
	}
}

匿名クラスでオブジェクトを作成し、その場で即座にメソッドを呼び出すために利用する

匿名クラスを利用してインタフェースを実装し、その場でメソッドを実行したいだけの場合、実装したクラスを作成する必要もありませんし、変数に格納する必要もありません。
そのような場合、匿名クラスを利用してオブジェクトを作成し、直接メソッドを呼び出すことができます。

(例)Sampleインタフェースを匿名クラスで実装し、抽象メソッドをオーバーライドして、直接メソッドを実行する

interface Sample{ //Sampleインタフェースの定義

	public void test(); //抽象メソッド「test()」を定義

}
class TokumeiSample2{
	public static void main(String[] args){
		
		new Sample() { //変数の宣言を行わずに、匿名クラスで実装する
			
			@Override //インタフェースに定義された抽象メソッドのオーバーライド
			public void test(){
				System.out.println("testメソッドのオーバーライド");
			}
		}.test(); // 実装クラスに対して直接メソッドの呼び出しを行います。
	}
}

匿名クラスとラムダ式編・次回の内容

今回は匿名クラスについて紹介しました。
次回は、匿名クラスと同様な機能をより短縮した記述で行うことができるラムダ式や関数型インタフェースの使い方を解説していきます。


初めてのJavaシリーズの目次はこちら
匿名クラスとラムダ式編の記事一覧はこちら


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