匿名内部クラスは名前のない内部クラスです
名前がないため、匿名内部クラスは通常、コード記述を簡素化するために使用されます
しかし、匿名内部クラスを使用するには前提条件があります:継承する必要があります。 1 つの親クラスを使用するか、インターフェイスを実装します
例 1: 抽象メソッドを実装するために匿名の内部クラスを使用しないでください
abstract class Person { public abstract void eat(); } class Child extends Person { public void eat() { System.out.println("eat something"); } } public class Demo { public static void main(String[] args) { Person p = new Child(); p.eat(); } }
実行結果: 何かを食べる
ご覧のとおり、Child を使用して Person クラスを継承し、 Childインスタンスを実装し、それをPersonクラスへの参照にアップキャストします
しかし、ここでのChildクラスが一度しか使われない場合、独立したクラスとして書くのは面倒ではないでしょうか?
今回は匿名内部クラスを導入します
例 2: 匿名内部クラスの基本的な実装
abstract class Person { public abstract void eat(); } public class Demo { public static void main(String[] args) { Person p = new Person() { public void eat() { System.out.println("eat something"); } }; p.eat(); } }
実行結果: 何かを食べる
ご覧のとおり、curly の抽象クラス person にメソッドを直接配置しています。括弧で囲んで実装しました
これでクラスの記述を省略できます
さらに、匿名内部クラスをインターフェースでも使用できます
例 3: インターフェースで匿名内部クラスを使用する
interface Person { public void eat(); } public class Demo { public static void main(String[] args) { Person p = new Person() { public void eat() { System.out.println("eat something"); } }; p.eat(); } }
実行結果: 何かを食べる
上記の例からわかるように、クラスが抽象またはインターフェイスである限り、そのサブクラスのメソッドは匿名の内部クラスを使用して実装できます
最も一般的な状況はマルチスレッド実装です。マルチスレッドは Thread クラスを継承するか、Runnable インターフェースを継承する必要があります
例 4: Thread クラスの匿名内部クラス実装
public class Demo { public static void main(String[] args) { Thread t = new Thread() { public void run() { for (int i = 1; i <= 5; i++) { System.out.print(i + " "); } } }; t.start(); } }
実行結果: 1 2 3 4 5
例 5: 匿名Runnable インターフェースの内部クラス実装
public class Demo { public static void main(String[] args) { Runnable r = new Runnable() { public void run() { for (int i = 1; i <= 5; i++) { System.out.print(i + " "); } } }; Thread t = new Thread(r); t.start(); } }
実行結果: 1 2 3 4 5