class级文件中的$ 1是多less?

  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(s)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个Dir(s)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(); } } }; } } 

这些是持有匿名内部类的.class文件。

在你的例子中, WelcomeApplet.java包含一个顶级的类(叫做WelcomeApplet )和一个匿名的内部类,它将存储在WelcomeApplet$1.class

请注意,匿名内部类文件的确切名称是不标准化,可能会有所不同。 但在实践中,我还没有看到任何其他计划,除了这里描述的计划。

一个enum价值特定的机构也是匿名的内部类 :

一个枚举常量的可选类体隐式定义了一个匿名类声明(第15.9.5节 ),它扩展了立即封闭的枚举types。

$ 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.classRun$innerNamed.class被生成

这些是由java编译器在WelcomeApplet.java文件中的内部和静态嵌套类生成的。

另请参阅这个类似的问题和答案 。

这是从这个“行”的代码:

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

每次调用方法时,声明ActionListener的方法都是创build匿名内部类的实例。

即使这个方法没有被调用,上面的代码仍然被编译成一个匿名的内部类,不pipe怎样。

WelcomeApplet$1.class源中的匿名类生成WelcomeApplet$1.class文件(通过调用new new ActionListener() {...} )在方法调用makeURLActionListener中生成匿名类

为了更清楚地解释,匿名类是在编译时生成的,只要你有一个具体的命名类的实例,就可以像这样embedded具体类(或接口)的一些或全部行为:

 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.classHelloInternalClass$1.class

此实例中的匿名类将是Runnable的子类,并将被编译到HelloInternalClass$1.class 。 顺便说一句,如果你要从上面的示例中的可运行实例中调用类名(通过调用getClass().getName() ),你会发现它认为自己是“ HelloInternalClass $ 1 ”。

创build:

 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(){} )好,但是x2A$X的子类的一个实例。 这个小类是A$1