匿名内部クラスは、コマンド モードで必要な Command オブジェクトなど、一度だけ使用する必要があるクラスの作成に適しています。匿名内部クラスの構文は少し奇妙です。匿名内部クラスが作成されると、そのクラスのインスタンスがすぐに作成され、そのクラス定義はすぐに削除され、その匿名内部クラスは再利用できません。
匿名内部クラスを定義するための形式は次のとおりです:
new 父类构造器(参数列表)|实现接口() { //匿名内部类的类体部分 }
上記の定義からわかるように、匿名内部クラスは親クラスを継承するか、インターフェイスを実装する必要がありますが、親クラスを継承するかインターフェイスを実装できるのは 1 つだけです。インターフェース。
匿名内部クラスについては、さらに 2 つのルールがあります:
1) 匿名内部クラスを抽象クラスにすることはできません。これは、システムが匿名内部クラスを作成すると、すぐに内部クラスのオブジェクトが作成されるためです。したがって、匿名内部クラスを抽象クラスとして定義することはできません。
2) 匿名内部クラスはコンストラクターを定義しません。匿名内部クラスにはクラス名がないため、コンストラクターを定義できませんが、インスタンス初期化ブロックを使用して、コンストラクターが必要なことを完了します。成し遂げる。
匿名内部クラスを作成する最も一般的な方法は、次のプログラムに示すように、インターフェイス タイプのオブジェクトを作成することです:
interface Product{ public double getPrice(); public String getName(); } public class TestAnonymous{ public void test(Product p){ System.out.println("购买了一个"+p.getName()+",花掉 了"+p.getPrice()); } public static void main(String[]args){ TestAnonymous ta = new TestAnonymous(); ta.test(new Product(){ public double getPrice(){ return 567; } public String getName(){ return "AGP显卡"; } }); } }
匿名内部クラスを抽象クラスにすることはできないため、匿名内部クラスは、その抽象親クラスまたはインターフェイスに含まれるすべての抽象メソッドを実装する必要があります。
Product 実装クラス オブジェクトを作成するための上記のコードは、次のコードに分割できます:
class AnonymousProduct implements Product{ public double getPrice(){ return 567; } public String getName(){ return "AGP显卡"; } } ta.test(new AnonymousProduct());
abstract class Device{ private String name; public Device(){ } public Device(String name){ this.name = name; } public abstract double getPrice(); //此处省略了name属性的setter和getter方法 } public class AnonymousInner{ public void test(Device d){ System.out.println("购买了一个"+d.getName()+",花掉了"+d.getPrice()); } public static void main(String[] args){ AnonymousInner ai = new AnonymousInner(); //调用有参数的构造器创建Device匿名实现类的对象 ai.test(new Device("电子示波器"){ public double getPrice(){ return 67; } }); //调用无参数的构造器创建Device匿名实现类的对象 Device d = new Device(){ //初始化块 { System.out.println("匿名内部类的初始化块..."); } //实现抽象方法 public double getPrice(){ return 56; } public Sting getName(){ return "键盘"; } }; ai.test(d); } }
匿名内部クラスを作成するときは、すべての抽象メソッドをインターフェイスまたは抽象親クラスに実装する必要があります。必要に応じて、親クラスの通常のメソッドをオーバーライドすることもできます。たとえば、上記のプログラムの 2 番目の太字のコード部分では、匿名内部クラスが抽象親クラス Device クラスの getName メソッドをオーバーライドします。抽象的なメソッドではありません。
匿名内部クラスが外部クラスのローカル変数にアクセスする必要がある場合、final 修飾子を使用して外部クラスのローカル変数を変更する必要があります。そうしないと、システムがエラーを報告します。
interface A{ void test(); } public class TestA{ public static void main(Strign[] args){ int age = 0; A a = new A(){ public void test(){ //下面语句将提示错误:匿名内部类内访问局部变量必须使用final修饰 System.out.println(age); } }; } }
匿名内部クラスに関連するその他の記事については、PHP 中国語 Web サイトに注目してください。