Java匿名内部クラスの原理と使い方の詳細


本明細書の例は、Javaの匿名内部クラスの原理と使用法を説明する。皆さんに参考にしてあげます。具体的には以下の通りです。
一点の目
匿名の内部クラスは一回だけ使うクラスを作成するのに適しています。匿名の内部クラスを定義するシンタックスフォーマットは以下の通りです。

new      (    ) |     ()
{
   //          
}

上記の定義から、匿名の内部クラスは親クラスを継承しなければならないか、またはインターフェースを実装しなければならないが、最大で親クラスを継承するか、またはインターフェースを実現するしかないことがわかる。
二つの規則
  • 匿名の内部類は抽象類ではない。
  • 匿名の内部クラスは、コンストラクタを定義することができません。匿名の内部クラスにはクラス名がないので、コンストラクタを定義することはできないが、匿名の内部クラスはブロックを初期化し、コンストラクタが完了する必要がある作業を初期化ブロックによって行うことができる。
  • 二実戦
    1点目
    最も一般的な匿名の内部クラスを作成する方法は、あるインターフェースタイプのオブジェクトを作成することである。
    2コード
    
    interface Product
    {
      public double getPrice();
      public String getName();
    }
    public class AnonymousTest
    {
      public void test(Product p)
      {
       System.out.println("     " + p.getName()
         + ",   " + p.getPrice());
      }
      public static void main(String[] args)
      {
       AnonymousTest ta = new AnonymousTest();
       //   test()   ,      Product  ,
       //              
       ta.test(new Product()
       {
         public double getPrice()
         {
          return 567.8;
         }
         public String getName()
         {
          return "AGP  ";
         }
       });
      }
    }
    
    
    3運転
    AGPのグラフィックカードを買いましたが、567.8を使いました。
    4説明
    匿名の内部クラスを定義するには、クラスキーを必要とせず、匿名の内部クラスを定義する際に、その匿名の内部クラスのオブジェクトを直接生成する。
    匿名の内部クラスは抽象的なクラスではないので、匿名の内部クラスは、その抽象的な親またはインターフェースに含まれるすべての抽象的な方法を実現しなければならない。
    実戦
    1点目
    インタフェースを通して匿名の内部クラスを作成する場合、匿名の内部クラスはコンストラクタを作成すると表示できないので、匿名の内部クラスには暗黙的なコンストラクタが一つしかないので、newインターフェース名の後の括弧にパラメータ値が入らない。
    父のクラスを継承して匿名の内部クラスを作成する場合、匿名の内部クラスは父と似たようなコンストラクタを持つことになります。ここで似ているのは同じ参照リストを持つことです。
    2コード
    
    abstract class Device
    {
      private String name;
      public abstract double getPrice();
      public Device(){}
      public Device(String name)
      {
       this.name = name;
      }
      //      name setter getter  
      public void setName(String name)
      {
       this.name = name;
      }
      public String getName()
      {
       return this.name;
      }
    }
    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.8;
         }
       });
       //            Device        
       Device d = new Device()
       {
         //     
         {
          System.out.println("          ...");
         }
         //       
         public double getPrice()
         {
          return 56.2;
         }
         //          
         public String getName()
         {
          return "  ";
         }
       };
       ai.test(d);
      }
    }
    
    
    3運転
    電子オシロスコープを買いました。67.8を使いました。
    匿名の内部クラスの初期化ブロック…
    キーボードを買いましたが、56.2%かかりました。
    Deviceを父とする匿名の内部クラスを作成すると、パラメータを入力することができます。親のパラメータを呼び出すためのコンストラクタを表します。パラメータを入力しなくてもいいです。親のパラメータなしのコンストラクタを呼び出します。
    匿名の内部クラスを作成するには、インターフェースまたは抽象的な親クラスのすべての抽象的な方法を実現しなければならない。必要があれば、親の普通の方法を書き直してもいいです。
    実戦
    1点目
    Java 8の前に、Javaは、ローカルの内部クラス、匿名の内部クラスによってアクセスされることを要求するローカル変数は、final修飾を使用しなければならない。Java 8からこの制限がキャンセルされた。Java 8は、よりスマートである。ローカル変数が匿名の内部クラスにアクセスされると、自動的にfinal修飾を使用することに関連する。
    2コード
    
    interface A
    {
      void test();
    }
    public class ATest
    {
      public static void main(String[] args)
      {
       int age = 8;   // ①
       //             
       //   age             ,  age    final   
       //age = 2;
       A a = new A()
       {
         public void test()
         {
          //  Java 8           :age    final  
          //  Java 8  ,     、          final     
          System.out.println(age);
         }
       };
       a.test();
      }
    }
    
    
    3結果
    8
    4説明
    Java 8は、この機能を「effectively final」と呼び、匿名の内部クラスにアクセスされた局部変数に対して、finalで修飾してもいいし、finalで修飾しなくてもいいですが、finalで修飾された方法で使用しなければなりません。
    もっと多くのjava関連の内容に興味がある読者は当駅のテーマを調べてもいいです。「Javaは対象プログラムに向かって入門と階段教程を設計します。」、「Javaデータ構造とアルゴリズム教程」、「Java操作DOMノード技術のまとめ」、「Javaファイルとディレクトリの操作テクニックのまとめ」、「Javaキャッシュ操作テクニックのまとめ
    本論文で述べたように、皆さんのjavaプログラムの設計に役に立ちます。