無名クラスについて

ちゃんと理解してなかった無名クラスについて調べたので忘れた時用のメモです。

記述方法

new インタフェース型 () { メソッドの実装 }
または
new 抽象クラス型 () { メソッドの実装 }
または
new クラス型 () { オーバーライドしたいメソッドの実装 }

注意点

  • インタフェースまた抽象クラスの場合は抽象メソッドを全て実装しないとエラーとなる。
  • クラス型の場合は final でない、かつ可視なクラスでないといけない。
  • 2つ以上のメソッドを実装したり、1つのメソッドでも処理が多かったりするならば使用を考えた方がいい。
  • 無名クラス内の実装したメソッドからメソッド外の変数を参照する場合には下記のような注意が必要。*1
public class Hoge {
	//クラス変数
	private static String str1 = "static";
	//インスタンス変数
	private String str2 = "instance";

	public void foo() {
		//ローカル変数
		String str3 = "local";
		//final宣言されたローカル変数
		final String str4 = "final local";

		(new Thread() {
			public void run() {
				System.out.println(str1); // OK
				System.out.println(str2); // OK
				System.out.println(str3); // NG
				System.out.println(str4); // OK
			}
		}).start();
	}

	public static void main(String[] args) {
		Hoge h = new Hoge();
		h.foo();
	}
}

/*
クラス変数・インスタンス変数は参照出来ますが、
ローカル変数は参照出来ません。
ローカル変数を参照する為にはfinal宣言が必要となります。
*/

*1:適当なコードですみません><