検索

匿名内部クラスの詳細

Dec 15, 2016 pm 12:25 PM
匿名内部クラス

匿名内部クラスは、コマンド モードで必要な 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 までご連絡ください。
JVMは、Javaの「Write and、Run Anywhere」(Wora)機能にどのように貢献しますか?JVMは、Javaの「Write and、Run Anywhere」(Wora)機能にどのように貢献しますか?May 02, 2025 am 12:25 AM

JVMは、バイトコード解釈、プラットフォームに依存しないAPI、動的クラスの負荷を介してJavaのWORA機能を実装します。 2。標準API抽象オペレーティングシステムの違い。 3.クラスは、実行時に動的にロードされ、一貫性を確保します。

Javaの新しいバージョンは、プラットフォーム固有の問題にどのように対処しますか?Javaの新しいバージョンは、プラットフォーム固有の問題にどのように対処しますか?May 02, 2025 am 12:18 AM

Javaの最新バージョンは、JVMの最適化、標準的なライブラリの改善、サードパーティライブラリサポートを通じて、プラットフォーム固有の問題を効果的に解決します。 1)Java11のZGCなどのJVM最適化により、ガベージコレクションのパフォーマンスが向上します。 2)Java9のモジュールシステムなどの標準的なライブラリの改善は、プラットフォーム関連の問題を削減します。 3)サードパーティライブラリは、OpenCVなどのプラットフォーム最適化バージョンを提供します。

JVMによって実行されたバイトコード検証のプロセスを説明します。JVMによって実行されたバイトコード検証のプロセスを説明します。May 02, 2025 am 12:18 AM

JVMのバイトコード検証プロセスには、4つの重要な手順が含まれます。1)クラスファイル形式が仕様に準拠しているかどうかを確認し、2)バイトコード命令の有効性と正確性を確認し、3)データフロー分析を実行してタイプの安全性を確保し、検証の完全性とパフォーマンスのバランスをとる。これらの手順を通じて、JVMは、安全で正しいバイトコードのみが実行されることを保証し、それによりプログラムの完全性とセキュリティを保護します。

プラットフォームの独立性は、Javaアプリケーションの展開をどのように簡素化しますか?プラットフォームの独立性は、Javaアプリケーションの展開をどのように簡素化しますか?May 02, 2025 am 12:15 AM

java'splatformendencealLowsApplicationStorunOperatingSystemwithajvm.1)singlecodebase:writeandcompileonceforallplatforms.2)easyUpdates:updatebytecodeforsimultaneousdeployment.3)テストの実験効果:scalbortffortfforduniverbehaviol.4)

Javaのプラットフォームの独立性は、時間とともにどのように進化しましたか?Javaのプラットフォームの独立性は、時間とともにどのように進化しましたか?May 02, 2025 am 12:12 AM

Javaのプラットフォームの独立性は、JVM、JITコンピレーション、標準化、ジェネリック、ラムダ式、Projectpanamaなどのテクノロジーを通じて継続的に強化されています。 1990年代以来、Javaは基本的なJVMから高性能モダンJVMに進化し、さまざまなプラットフォームでのコードの一貫性と効率を確保しています。

Javaアプリケーションでプラットフォーム固有の問題を緩和するためのいくつかの戦略は何ですか?Javaアプリケーションでプラットフォーム固有の問題を緩和するためのいくつかの戦略は何ですか?May 01, 2025 am 12:20 AM

Javaはプラットフォーム固有の問題をどのように軽減しますか? Javaは、JVMおよび標準ライブラリを通じてプラットフォームに依存します。 1)bytecodeとjvmを使用して、オペレーティングシステムの違いを抽象化します。 2)標準のライブラリは、パスクラス処理ファイルパス、CHARSETクラス処理文字エンコードなど、クロスプラットフォームAPIを提供します。 3)最適化とデバッグのために、実際のプロジェクトで構成ファイルとマルチプラットフォームテストを使用します。

Javaのプラットフォームの独立性とマイクロサービスアーキテクチャの関係は何ですか?Javaのプラットフォームの独立性とマイクロサービスアーキテクチャの関係は何ですか?May 01, 2025 am 12:16 AM

java'splatformentencentenhancesmicroservicesecturectureby byofferingdeploymentflexability、一貫性、スケーラビリティ、およびポート可能性。1)展開の展開の展開は、AllosmicRoserviThajvm.2)deploymentflexibility lowsmicroserviceSjvm.2)一貫性のあるAcrossServicessimplisimpligiessdevelisementand

GraalvmはJavaのプラットフォーム独立目標とどのように関係していますか?GraalvmはJavaのプラットフォーム独立目標とどのように関係していますか?May 01, 2025 am 12:14 AM

Graalvmは、Javaのプラットフォームの独立性を3つの方法で強化します。1。言語間の相互運用性、Javaが他の言語とシームレスに相互運用できるようにします。 2。独立したランタイム環境、graalvmnativeimageを介してJavaプログラムをローカル実行可能ファイルにコンパイルします。 3.パフォーマンスの最適化、Graalコンパイラは、Javaプログラムのパフォーマンスと一貫性を改善するための効率的なマシンコードを生成します。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール