66
C:\Program Files\Java\jdk1.6.0_05\CoreJava\v1\v1ch2\WelcomeApplet>dir
 ドライブ C のボリュームにはラベルがありません。
 ボリュームシリアル番号は 2041-64E7 です

 C:\Program Files\Java\jdk1.6.0_05\CoreJava\v1\v1ch2\WelcomeAppletのディレクトリ

2009-07-02 23:54 .
2009-07-02 23:54 ..
2004-09-06 14:57 582 WelcomeApplet.html
2004-09-06 15:04 1,402 WelcomeApplet.java
               2 ファイル 1,984 バイト
               2 ディレクトリ 2,557,210,624 バイト空き

C:\Program Files\Java\jdk1.6.0_05\CoreJava\v1\v1ch2\WelcomeApplet>javac WelcomeApplet.java

C:\Program Files\Java\jdk1.6.0_05\CoreJava\v1\v1ch2\WelcomeApplet>dir
 ドライブ C のボリュームにはラベルがありません。
 ボリュームシリアル番号は 2041-64E7 です

 C:\Program Files\Java\jdk1.6.0_05\CoreJava\v1\v1ch2\WelcomeAppletのディレクトリ

2009-07-02 23:54 .
2009-07-02 23:54 ..
2009-07-02 23:54 975 WelcomeApplet$1.class
2009-07-02 23:54 1,379 WelcomeApplet.class
2004-09-06 14:57 582 WelcomeApplet.html
2004-09-06 15:04 1,402 WelcomeApplet.java
               4 ファイル 4,338 バイト
               2 ディレクトリ 2,557,202,432 バイト空き

C:\Program Files\Java\jdk1.6.0_05\CoreJava\v1\v1ch2\WelcomeApplet>

その Java ファイルの内容は次のとおりです。

/**
   @version 1.21 2002-06-19
   @author Cay Horstmann
*/

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;

public class WelcomeApplet extends JApplet
{
   public void init()
   {
      setLayout(new BorderLayout());

      JLabel label = new JLabel(getParameter("greeting"), SwingConstants.CENTER);
      label.setFont(new Font("Serif", Font.BOLD, 18));
      add(label, BorderLayout.CENTER);

      JPanel panel = new JPanel();

      JButton cayButton = new JButton("Cay Horstmann");
      cayButton.addActionListener(makeURLActionListener(
         "http://www.horstmann.com"));
      panel.add(cayButton);

      JButton garyButton = new JButton("Gary Cornell");
      garyButton.addActionListener(makeURLActionListener(
         "mailto:gary@thecornells.com"));
      panel.add(garyButton);

      add(panel, BorderLayout.SOUTH);
   }

   private ActionListener makeURLActionListener(final String u)
   {
      return new
         ActionListener()
         {
            public void actionPerformed(ActionEvent event)
            {
               try
               {
                  getAppletContext().showDocument(new URL(u));
               }
               catch(MalformedURLException e) 
               { 
                  e.printStackTrace(); 
               }
            }
         };
   }
}
4

6 に答える 6

69

これらは、匿名の内部クラス.classを保持するファイルです。

あなたの例WelcomeApplet.javaには、トップレベルのクラス(と呼ばれるWelcomeApplet)と、に格納される匿名の内部クラスが含まれていWelcomeApplet$1.classます。

匿名の内部クラスを保持するファイルの正確な名前は標準化されておらず、異なる場合があることに注意してください。しかし、実際には、ここで説明したもの以外のスキームはまだ見たことがありません。

の値固有のボディは、enum 匿名の内部クラスでもあります

列挙型定数のオプションのクラス本体は、直接囲んでいる列挙型を拡張する匿名クラス宣言 ( §15.9.5 ) を暗黙的に定義します。

于 2009-07-02T15:59:06.073 に答える
31

WelcomeApplet.java$1 は、ファイルで定義した匿名の内部クラスです。

例: コンパイル

public class Run {
    public static void main(String[] args) {
        System.out.println(new Object() {
            public String toString() {
                return "77";
            }
        });
    }
    private class innerNamed {
    }
}

Run.classとなりRun$1.classRun$innerNamed.class生成される

于 2009-07-02T15:57:34.920 に答える
6

これらは、Java コンパイラによって、WelcomeApplet.java ファイル内のネストされた内部および静的クラスから生成されます。

この同様の質問と回答も参照してください。

于 2009-07-02T15:59:48.617 に答える
4

これは、次の「行」のコードからのものです。

return new
    ActionListener()
    {
        public void actionPerformed(ActionEvent event)
        {
            try
            {
                getAppletContext().showDocument(new URL(u));
            }
            catch(MalformedURLException e) 
            { 
                e.printStackTrace(); 
            }
        }
    };

ActionListenerメソッドが呼び出されるたびに、匿名の内部クラスのインスタンスを作成していることを宣言する方法。

メソッドが呼び出されなくても、上記の行は何があっても匿名の内部クラスにコンパイルされます。

于 2009-07-02T16:06:52.520 に答える
1

このWelcomeApplet$1.classファイルは、WelcomeApplet.java ソース内の匿名クラス用に生成されます (匿名クラスは、メソッド呼び出し makeURLActionListener で を呼び出して生成されますnew new ActionListener() {...}) 。

より明確に説明すると、次のようにインラインで具象クラス (またはインターフェイス) の動作の一部またはすべてをオーバーライドする具象名前付きクラスのインスタンス化がある場合はいつでも、コンパイル時に匿名クラスが生成されます。

class HelloInternalClass {
  public static final void main(String[] args) {
    // print in another thread
    new Thread(new Runnable() {
      public void run() {
        System.out.println("Printed from another thread");
      }
    }).start();
  }
}

上記のサンプル コードでは、javac コンパイラは例のように 2 つのクラス ファイルを生成しHelloInternalClass.classますHelloInternalClass$1.class

このインスタンスの無名クラスはRunnableのサブクラスになり、にコンパイルされHelloInternalClass$1.classます。ちなみに、上記のサンプルの実行可能なインスタンスから ( を呼び出して) クラス名を尋ねると、それ自体が「 HelloInternalClass$1getClass().getName() 」と認識されていることがわかります。

于 2009-07-02T16:41:49.707 に答える