匿名クラスは名前を持つことができないクラスであるため、参照する方法がありません。これらは、作成時に新しいステートメントの一部として宣言する必要があります。これには、次のような別の形式の new ステートメントが必要です。 new <クラスまたはインターフェイス> <クラスの本体> この形式の new ステートメントは、指定されたクラスを拡張する新しい匿名クラスを宣言するか、指定されたインターフェイスを実装します。また、そのクラスの新しいインスタンスを作成し、それをステートメントの結果として返します。拡張されるクラスと実装されるインターフェイスは新しいステートメントのオペランドであり、その後に匿名クラスの本体が続きます。匿名クラスが別のクラスを拡張する場合、その本体は、他の標準クラスと同様に、クラスのメンバーにアクセスしたり、そのメソッドをオーバーライドしたりできます。匿名クラスがインターフェイスを実装する場合、その本体はインターフェイスのメソッドを実装する必要があります。
Javaコード
次のようにコードをコピーします。
インターフェースPR
{
void print1();
}
パブリッククラス noNameClass
{
パブリック pr dest()
{
新しいpr(){を返す
public void print1()
{
System.out.println("Hello world!!");
}
};
}
public static void main(String args[])
{
noNameClass c = 新しい noNameClass();
pr hw=c.dest();
hw.print1();
}
}
PR はクラスにすることもできますが、外部から呼び出すメソッドはクラスまたはインターフェイスで宣言する必要があります。匿名クラス内のメソッドは外部から呼び出すことはできません。
おそらく、Java の内部匿名クラスで最も一般的に使用される場所は、Listner を Frame に追加することです。
次のように:
Javaコード
次のようにコードをコピーします。
java.awt.* をインポートします。
インポート java.awt.event.*;
public class QFrame extends Frame {
public QFrame() {
this.setTitle(/"私のアプリケーション/");
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
処分();
System.exit(0);
}
});
this.setBounds(10,10,200,200);
}
}
内部匿名クラスは内部クラスを作成しますが、名前は与えられません。つまり、インスタンスを参照する変数はありません。
次のようにコードをコピーします。
new WindowAdapter() {
public void windowClosing(WindowEvent e) {
処分();
System.exit(0);
}
}
new は WindowAdapter オブジェクトを作成することです。次の {} は、括弧内の操作がデフォルトのオブジェクト名に作用することを示します。上記の Java プログラムの次は関数本体です。
この使用法の目的は、オブジェクトのインスタンスを作成し、その関数の 1 つをオーバーライドすることです。 WindowAdapter コードを開くと見つけることができます。抽象クラスです。これは、WindowListener インターフェイスの実装です。 Frame.addWindowListner(); のパラメータは WindowListner であり、実装は WindowAdapter から派生した匿名クラスを渡します。
1. 匿名クラスの存在を確認するにはどうすればよいですか?名前が見えません。親クラスから new で作成されたオブジェクトのように感じます。また、匿名クラスには名前がありません。
まずは擬似コードを見てみましょう
次のようにコードをコピーします。
抽象クラス Father(){
....
}
パブリック クラス Test{
Father f1 = new Father(){ .... } //ここには匿名の内部クラスがあります
}
一般に、新しいオブジェクトを作成する場合は、括弧の後にセミコロンが必要です。つまり、新しいオブジェクトのステートメントが終了します。
ただし、匿名の内部クラスがあり、括弧の後に中括弧があり、その中括弧内に新しいオブジェクトの特定の実装メソッドが含まれる場合は異なります。
抽象クラスを直接 new することはできないことがわかっているため、その実装クラスを new する前に実装クラスが存在する必要があります。
上記の疑似コードは、new が Father の実装クラスであり、この実装クラスが匿名の内部クラスであることを示しています。
実際、上記の匿名内部クラスを分割すると、
次のようにコードをコピーします。
クラス SonOne は Father{ を拡張します
...//ここのコードは上記の匿名内部クラスと同じであり、中括弧内のコードは
}
パブリック クラス Test{
父 f1 = 新しい SonOne();
}
2. 匿名内部クラスに関する注意事項 匿名クラスの宣言はコンパイル時に行われ、インスタンス化は実行時に行われます。これは、for ループ内の新しいステートメントが、複数の異なる匿名クラスの 1 つのインスタンスを作成するのではなく、同じ匿名クラスの複数のインスタンスを作成することを意味します。
匿名内部クラスを使用する場合は、次の原則に留意してください。
・匿名内部クラスはコンストラクタを持つことができません。
・匿名内部クラスでは静的メンバー、メソッド、クラスを定義できません。
・匿名内部クラスは、public、protected、private、static にすることはできません。
・匿名内部クラスのインスタンスは1つだけ作成できます。
・匿名内部クラスは new の後ろにある必要があり、暗黙的にインターフェイスを実装したり、クラスを実装したりするために使用されます。
・匿名内部クラスはローカル内部クラスであるため、ローカル内部クラスに対する制限はすべてローカル内部クラスに影響します。
・内部クラスは外部クラスの静的変数または静的メソッドにのみアクセスできます。
これは匿名クラスと内部クラスでは次のようになります。
場合によっては、内部クラスや匿名クラスを使用することもあります。匿名クラスでこれを使用する場合、これは匿名クラスまたは内部クラス自体を指します。このとき、外部クラスのメソッドや変数を利用したい場合は、外部クラスのクラス名を追加する必要があります。
3. 匿名内部クラスの役割
Java の内部クラスは、C++ の入れ子クラスとは根本的に異なります。C++ の入れ子クラスには、ラッパー クラスへのハンドルがありません。これはカプセル化の概念を表現しているだけですが、Java の内部クラスは異なり、ラッピング クラスのメンバーにアクセスできます (つまり、ラッピング クラスへのハンドルを持っています)。
匿名内部クラスは、内部クラスを記述する簡略化された方法です。 return new Wrapper {
...
};
以下と同等: Wrapped extends Wrapper {
...
}
新しいWrapped()を返します;
これが匿名内部クラスの唯一の役割ですか?
次の場合を考えてみましょう。
次のようにコードをコピーします。
インターフェイス ICount {
int count();
}
親クラス {
int i = 0;
int count() {
i++ を返します。
}
}
Child クラスがありますが、これは Parent の count() メソッドを継承するだけでなく、ICount インターフェイスに count メソッドを実装したいと考えています。この場合、どうすればよいでしょうか。内部クラスが作用する可能性があります。
次のようにコードをコピーします。
class Child extends Parent {
ICount getCount() {
新しい ICount {を返す
int i = 0;
int count() {
戻り値 (i *= 2);
}
}
}
}
このコードを見てください
次のようにコードをコピーします。
public static void main(String[] args) {
theApp = 新しいアナライザー();
SwingUtilities.invokeLater(new Runnable() { // 匿名 Runnable クラス
// 物体
public void run() { // スレッドで実行されるメソッドの実行
theApp.creatGUI(); // 静的 GUI クリエーターを呼び出します。
}
});
}
public static void main(String[] args) {
theApp = new Analyzer(); // オブジェクトを作成します。
SwingUtilities.invokeLater(new Runnable() { // 匿名 Runnable クラス
// スレッドを実装する匿名内部クラス
// 元々、このメソッドは Runnable 型パラメータを渡すためのものでした // これは、この匿名クラス メソッドを通じて実現できます
// 物体
public void run() { // スレッドで実行されるメソッドの実行
theApp.creatGUI(); // 静的 GUI クリエーターを呼び出します。
}
});
}