ホームページ  >  記事  >  Java  >  匿名内部クラスの詳細

匿名内部クラスの詳細

高洛峰
高洛峰オリジナル
2016-12-15 12:25:201138ブラウズ

匿名内部クラスは、コマンド モードで必要な 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显卡";  
   }  
  });  
 }  
}

上記のプログラムの TestAnonymous クラスは、Product オブジェクトを必要とするテスト メソッドを定義します。ただし、Product は単なるインターフェイスであり、オブジェクトを直接作成することはできません。そのため、この Product インターフェイス実装クラスを繰り返し使用する必要がある場合は、Product インターフェイス実装クラスのオブジェクトを作成してこのメ​​ソッドに渡すことを検討してください。独立したオブジェクトは実装クラスを通じて定義する必要があります。この Product インターフェイス実装クラスを 1 回だけ使用する必要がある場合は、上記のプログラムのメソッドを使用して匿名の内部クラスを定義できます。

上記のプログラムでわかるように、匿名クラスを定義するために class キーワードは必要ありません。代わりに、匿名内部クラスを定義するときに、匿名内部クラスのオブジェクトが直接生成されます。上記の太字のコード部分は、匿名クラスのクラス本体部分です。

匿名内部クラスを抽象クラスにすることはできないため、匿名内部クラスは、その抽象親クラスまたはインターフェイスに含まれるすべての抽象メソッドを実装する必要があります。
Product 実装クラス オブジェクトを作成するための上記のコードは、次のコードに分割できます:

class AnonymousProduct implements Product{  
  public double getPrice(){  
   return 567;  
    }  
  public String getName(){  
   return "AGP显卡";  
    }  
 }  
 ta.test(new AnonymousProduct());

インターフェイスの実装によって匿名内部クラスが作成される場合、匿名内部クラスは明示的にコンストラクターを作成できないため、匿名内部クラスはコンストラクターのみを持ちます。 1 つは暗黙的なパラメーターなしのコンストラクター
であるため、新しいインターフェイス名の後の括弧内にパラメーター値を渡すことはできません。
ただし、親クラスを継承して匿名内部クラスを作成した場合、匿名内部クラスは親クラスと同様のコンストラクターを持ちます。ここでの類似性とは、同じ仮パラメーターのリストを持つことを指します。
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);  
  }  
 }

上記のプログラムは、抽象親クラス Device を作成します。この抽象親クラスには 2 つのコンストラクターが含まれています。1 つはパラメーターなし、もう 1 つはパラメーターありです。 Device

を親クラスとして匿名内部クラスを作成する場合、パラメータを渡すことはできます(上記プログラムの最初の段落の太字部分など)、パラメータを渡すことはできません(上のプログラムの2番目の太字部分など)上記プログラム)文字部分)。

匿名内部クラスを作成するときは、すべての抽象メソッドをインターフェイスまたは抽象親クラスに実装する必要があります。必要に応じて、親クラスの通常のメソッドをオーバーライドすることもできます。たとえば、上記のプログラムの 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);  
    }   
   };  
  }  
 }

上記のプログラムの太字のサブコードは、匿名内部クラスが外部クラスのローカル変数にアクセスすることを意味します。age 変数は Final 修飾子で変更されていないため、太字のコードはコンパイル例外を引き起こします。




匿名内部クラスに関連するその他の記事については、PHP 中国語 Web サイトに注目してください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。