ホームページ Java &#&チュートリアル Java 匿名内部クラス インスタンスの簡単な分析

Java 匿名内部クラス インスタンスの簡単な分析

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

匿名クラスは名前を持たないクラスなので参照できません。これらは、作成時に新しいステートメントの一部として宣言する必要があります。これには、以下に示すように、別の形式の new ステートメントが必要です: 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++; 
} 
}
ログイン後にコピー

Child クラスがあり、Parent の count() メソッドを継承するだけでなく、ICount インターフェイスに count メソッドを実装したいと考えています。内部クラスはその才能を発揮できます:

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 
} 
}); 
}
ログイン後にコピー



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

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

ホット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 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

Java の匿名内部クラスはメモリ リークの問題をどのように解決しますか? Java の匿名内部クラスはメモリ リークの問題をどのように解決しますか? May 01, 2024 pm 10:30 PM

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

Java の匿名内部クラスの設計パターンは何ですか? Java の匿名内部クラスの設計パターンは何ですか? May 02, 2024 pm 04:42 PM

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

Java 匿名内部クラスが使用に適さないのはどのようなシナリオですか? Java 匿名内部クラスが使用に適さないのはどのようなシナリオですか? May 03, 2024 pm 05:42 PM

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

Java の匿名内部クラスの利点は何ですか? Java の匿名内部クラスの利点は何ですか? Apr 30, 2024 am 11:39 AM

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

Java の匿名内部クラスでよくある間違いは何ですか? Java の匿名内部クラスでよくある間違いは何ですか? May 02, 2024 am 09:03 AM

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

Java 匿名内部クラスの制限は何ですか? Java 匿名内部クラスの制限は何ですか? May 01, 2024 pm 02:18 PM

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

Java 匿名内部クラスのパフォーマンスを最適化するにはどうすればよいですか? Java 匿名内部クラスのパフォーマンスを最適化するにはどうすればよいですか? May 02, 2024 am 08:48 AM

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

Java の匿名内部クラスはスレッドにどのように適用されますか? Java の匿名内部クラスはスレッドにどのように適用されますか? May 02, 2024 pm 01:57 PM

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

See all articles