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