Java 匿名内部クラス インスタンスの簡単な分析
匿名クラスは名前を持たないクラスなので参照できません。これらは、作成時に新しいステートメントの一部として宣言する必要があります。これには、以下に示すように、別の形式の new ステートメントが必要です: new
Java コード
interface pr { void print1(); } public class noNameClass { public pr dest() { return new pr(){ public void print1() { System.out.println("Hello world!!"); } }; } public static void main(String args[]) { noNameClass c = new noNameClass(); pr hw=c.dest(); hw.print1(); } }
pr もクラスにすることができますが、外部から呼び出すメソッドはクラスまたはインターフェイスで宣言する必要があります。
おそらく、内部匿名クラスとして最も一般的に使用される場所です。 JavaはListnerにあり、Frameに追加されています。
次のように:
Java コード
import java.awt.*; import java.awt.event.*; public class QFrame extends Frame { public QFrame() { this.setTitle(\"my application\"); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { dispose(); System.exit(0); } }); this.setBounds(10,10,200,200); } }
内部匿名クラスは内部クラスを作成しますが、名前が付けられていません。つまり、インスタンスを参照する変数がありません。
new WindowAdapter() { public void windowClosing(WindowEvent e) { dispose(); System.exit(0); } }
new は、WindowAdapter オブジェクトを作成することです。次の {} は、括弧内の操作がこのデフォルト オブジェクトに作用することを示し、上記の Java プログラムの後に関数本体が続きます。
この使用法の目的は、オブジェクトのインスタンスを作成し、その関数の 1 つをオーバーライドすることです。 WindowAdapter コードを開くと、これを見つけることができます。抽象クラスです。これは、WindowListener インターフェイスの実装です。 Frame.addWindowListner(); のパラメータは WindowListner であり、実装は WindowAdapter から派生した匿名クラスを渡します。
1. 匿名クラスの存在を確認するには?名前が見えません。親クラスから new で作成されたオブジェクトのように感じます。また、匿名クラスには名前がありません。
最初に疑似コードを見てみましょう
abstract class Father(){ .... } public class Test{ Father f1 = new Father(){ .... } //这里就是有个匿名内部类 }
一般的に、オブジェクトを new するときは、括弧の後にセミコロンが必要です。つまり、オブジェクトが終了するときに new のステートメントが続きます。
ただし、匿名の内部クラスが括弧の後にあり、その括弧の中に新しいオブジェクトの特定の実装メソッドが含まれる場合は異なります。
抽象クラスを直接 new することはできないことがわかっているため、実装クラスを new する前に、まず実装クラスを作成する必要があります。
上記の疑似コードは、new が Father の実装クラスであることを意味します。この実装クラスは匿名の内部クラスです。
実際、上記の匿名内部クラスを分割すると、
class SonOne extends Father{ ...//这里的代码和上面匿名内部类,大括号中的代码是一样的 } public class Test{ Father f1 = new SonOne() ; }
2. 匿名内部クラスに関する注意事項
匿名クラスの宣言はコンパイル時に行われ、インスタンス化は実行時に行われることに注意してください。これは、for ループ内の新しいステートメントが、複数の異なる匿名クラスの 1 つのインスタンスを作成するのではなく、同じ匿名クラスの複数のインスタンスを作成することを意味します。
匿名内部クラスを使用する場合は、次の原則に注意してください:
・匿名内部クラスはコンストラクターを持つことができません。
・匿名内部クラスは静的メンバー、メソッド、クラスを定義できません。
・匿名の内部クラスは、パブリック、プロテクト、プライベート、または静的にすることはできません。
・匿名内部クラスのインスタンスは1つだけ作成できます。
· 匿名内部クラスは new の背後にある必要があり、暗黙的にインターフェイスを実装したり、クラスを実装したりするために使用されます。
・匿名内部クラスはローカル内部クラスであるため、ローカル内部クラスに対するすべての制限がそれらに影響します。
· 内部クラスは、外部クラスの静的変数または静的メソッドにのみアクセスできます。
匿名クラスと内部クラスのこれ:
場合によっては、いくつかの内部クラスと匿名クラスを使用します。匿名クラスでこれを使用する場合、これは匿名クラスまたは内部クラス自体を指します。このとき、外部クラスのメソッドと変数を使用したい場合は、外部クラスのクラス名を追加する必要があります
3. 匿名内部クラスの役割
Java の内部クラスは、C++ のネストされたクラスとは本質的に異なります。 C++ のネストされたクラスには、ラッパー クラスへのハンドルがありません。これはカプセル化の概念を表現しているだけですが、Java の内部クラスは異なり、パッケージ化クラスのメンバーにアクセスできます (つまり、パッケージ化クラスへのハンドルを持っています)。
匿名内部クラスは内部クラスの簡略化された書き方です: return new Wrapper {
...
};
以下と同等: Wrapped extends Wrapper {
...
}
return new Wrapped();クラスの役割はこれだけですか?
次のケースを考えてみましょう:
interface ICount { int count(); } class Parent { int i = 0; int count() { return i++; } }
class Child extends Parent { ICount getCount() { return new ICount { int i = 0; int count() { return (i *= 2); } } } }
public static void main(String[] args) { theApp = new Analyzer(); SwingUtilities.invokeLater(new Runnable() { // Anonymous Runnable class // object public void run() { // Run method executed in thread theApp.creatGUI(); // Call static GUI creator } }); } public static void main(String[] args) { theApp = new Analyzer(); // 创建一个对象 SwingUtilities.invokeLater(new Runnable() { // Anonymous Runnable class // 一个匿名内部类,他实现了一个线程 // 原本这个方法是传一个Runnable类型参数 // 这里可以通过这种匿名类的方式来实现 // object public void run() { // Run method executed in thread theApp.creatGUI(); // Call static GUI creator } }); }

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック











匿名の内部クラスはメモリ リークを引き起こす可能性があります。問題は、匿名の内部クラスが外部クラスへの参照を保持し、外部クラスのガベージ コレクションが妨げられることです。解決策には次のものが含まれます。 1. 弱参照を使用します。外部クラスが強参照によって保持されなくなった場合、ガベージ コレクターは弱い参照オブジェクトをすぐにリサイクルします。ガベージ コレクション中にメモリが必要になるため、ソフト参照オブジェクトがリサイクルされます。 Android アプリケーションなどの実戦では、匿名内部クラスによるメモリ リークの問題は、弱参照を使用することで解決でき、リスナーが不要な場合には匿名内部クラスを再利用できます。

匿名内部クラスは、明示的な名前を持たず、new 式を通じて作成される Java の特別な内部クラスであり、主に特定のインターフェイスの実装または抽象クラスの拡張に使用され、作成直後に使用されます。一般的な匿名内部クラスの設計パターンには次のものがあります。 アダプター パターン: 1 つのインターフェイスを別のインターフェイスに変換します。戦略パターン: アルゴリズムの定義と置換。オブザーバー パターン: オブザーバーを登録し、イベントを処理します。これは、文字列の長さによる TreeSet の並べ替え、匿名スレッドの作成など、実際のアプリケーションで非常に役立ちます。

匿名内部クラスは、プライベート メンバーにアクセスする必要がある、複数のインスタンスが必要な、継承が必要な、ジェネリック型にアクセスする必要がある場合の使用には適していません。

匿名内部クラスは、サブクラス化、コードの簡素化、およびイベント (ボタンのクリックなど) の処理を容易にする特別な内部クラスとして Java で使用されます。実際のケースは次のとおりです。 イベント処理: 匿名の内部クラスを使用して、ボタンのクリック イベント リスナーを追加します。データ変換: Collections.sort メソッドと匿名内部クラスをコンパレータとして使用してコレクションを並べ替えます。

匿名内部クラスの使用エラー: 非スレッドセーフ環境で未宣言の例外をキャッチすることを使用してスコープ外の変数にアクセスする

匿名内部クラスの制限には、外部ローカル変数にアクセスできないこと、チェックされたコードの冗長性をスローできないこと、および

匿名内部クラスのパフォーマンスの問題は、それらが使用されるたびに再作成されることです。これは、次の戦略によって最適化できます。 1. 匿名内部クラスをローカル変数に格納する。 2. 非静的内部クラスを使用する。 3. ラムダを使用する。表現。実際のテストでは、ラムダ式の最適化が最も効果的であることが示されています。

匿名の内部クラスにより、マルチスレッド コードの作成が簡素化され、名前を付ける必要がなくなり、スレッド クラスの即時定義と使用が可能になります。主な利点はコードを簡素化できることですが、コードを拡張できないという制限があります。 1 つまたは 2 つのスレッドをすばやく作成する必要がある場合に使用します。より複雑なロジックが必要な場合は、別のクラス ファイルを作成する必要があります。
