1

Anonymous クラスの基本は理解していると思いますが、明確にしたいことがあります。このような構文がある場合

class A
{
       class AnonymousClass1 Implements ActionListener{}
}
class A
{
     public A()
     {
        JButton btn = new JButton();

       btn.addActionListener( new ActionListener(){} );
     }
}

最初の例のように、匿名クラスが実際にクラス A の内部クラスである場合: 理論的には、セマンティクスは正しいでしょうか?

正確にはどうなりますか?Javaファイルがコンパイルされると、匿名クラス用に.classファイルが作成されるため、参照できると思います(しかし、見つかりませんでした)。A のオブジェクトがインスタンス化されると、ボタン オブジェクトが作成され、btn は addActionListener() メソッドを呼び出します。このメソッドは、このbtn.addActionListener(new AnonymousClassOne())AnonymousClassOne のようなものをコンパイラによって与えられた一般的な名前に実際に渡します。

そうでない場合はどうなりますか?ありがとう。

4

2 に答える 2

4

Anonymousクラスはドル記号とその後の数字で認識できます- Class$1.class。これらのクラスはあなた自身の便宜のためだけのものです。これを想像してみてください:

class SaveButtonListener implements ActionListener {
  ...
}

class OpenButtonListener implements ActionListener {
  ...
}

これは非常に面倒です。したがって、匿名クラスを使用して実装をすぐに作成できます。コンパイラーは、ドル記号の前に名前を付け、その後にいくつかの識別子を付けます。

舞台裏で行われるのJavaは、自動生成された名前で新しい内部クラスを作成することです。

私の説明が面倒だと思ったら、遠慮なく質問してください。私は今疲れています。

于 2011-10-15T14:57:24.060 に答える
2
class A
{
    public A()
    {
        JButton btn = new JButton();
        btn.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                // ...
            }
        });
    }
}

コンパイラによって多かれ少なかれ次のように書き直されます。

class A
{
    private class SomeCuteName implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            // ...
        }
    }

    public A()
    {
        JButton btn = new JButton();
        btn.addActionListener(new SomeCuteName());
    }
}
于 2011-10-15T18:07:11.590 に答える