web-dev-qa-db-ja.com

クラスファイル名の$ 1とは何ですか?

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 Dir 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のボリュームには何もありませんlabel。
ボリュームシリアル番号は2041-64E7 
 
 C:\ Program Files\Java\jdk1.6.0_05\CoreJava\v1\v1ch2\WelcomeApplet [.____。のディレクトリです。 ] 
 2009-07-02 23:54。
 2009-0 7-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 Dir 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:[email protected]"));
      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(); 
               }
            }
         };
   }
}
55
omg

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

あなたの例ではWelcomeApplet.Javaには、最上位クラス(WelcomeAppletと呼ばれる)と匿名の内部クラスが含まれ、WelcomeApplet$1.class

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

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

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

61
Joachim Sauer

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

例えばコンパイル

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

Run.classRun$1.class、およびRun$innerNamed.classが生成されます

26
jitter

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

こちらもご覧ください 同様の質問と回答

5
Kosi2801

次のコードの「行」からです。

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

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

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

2
jjnguy

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

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

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コンパイラはHelloInternalClass.classHelloInternalClass$1.classのように2つのクラスファイルを生成します。

このインスタンスの匿名クラスはRunnableのサブクラスであり、HelloInternalClass$1.classにコンパイルされます。ちなみに、上記のサンプルの実行可能なインスタンスからクラス名を(getClass().getName()を呼び出すことで)求めると、「HelloInternalClass $ 1」と見なされることがわかります。

1
Roland Tepp

作成:

_public class A {
    public static void main(String[] args) {
        X x=new X();
        X x2=new X(){   
        };
        Class<? extends Object>c2=x2.getClass();
        Class<? extends Object>s2=x2.getClass().getSuperclass();

        boolean b=false;
    }
    private static class X{     
    }
}
_

コードから見るのは困難です(new X{}()new X(){}より優れていたはずですが、_x2_は_A$X_のサブクラスのインスタンスです。このサブクラスは_A$1_です。

0
ericj