Java 类文件名中的$1是什么?
$1是您在Java 类文件名中的$1是什么?,java,javac,anonymous-class,Java,Javac,Anonymous Class,$1是您在WelcomeApplet.java文件中定义的匿名内部类 e、 g.汇编 /** @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
WelcomeApplet.java
文件中定义的匿名内部类
e、 g.汇编
/**
@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();
}
}
};
}
}
将导致生成
Run.class
,Run$1.class
和Run$innerNamed.class
,这些文件包含
在您的示例中,WelcomeApplet.java
包含一个顶级类(称为WelcomeApplet
)和一个匿名内部类,它们将存储在WelcomeApplet$1.class
中
请注意,包含匿名内部类的文件的确切名称没有标准化,可能会有所不同。但在实践中,除了这里描述的方案,我还没有看到任何其他方案
枚举的值特定主体
:
枚举常量的可选类主体隐式定义了一个匿名类声明(),该声明扩展了立即封闭的枚举类型
这些由java编译器从WelcomeApplet.java文件中的内部和静态嵌套类生成
另请参见此项。它来自此代码的“行”:
public class Run {
public static void main(String[] args) {
System.out.println(new Object() {
public String toString() {
return "77";
}
});
}
private class innerNamed {
}
}
声明ActionListener
的方式是每次调用匿名内部类时都创建该类的实例
即使没有调用该方法,无论发生什么情况,上面的行仍然会编译成一个匿名内部类。WelcomeApplet$1.class文件是为WelcomeApplet.java源中的匿名类生成的(通过调用
new-new-ActionListener(){…}
,在方法调用makeURLActionListener中生成匿名类)
为了更清楚地解释,匿名类是在编译时生成的,只要您有一个具体命名类的实例化,该实例化重写了具体类(或接口)的部分或全部内联行为,如下所示:
return new
ActionListener()
{
public void actionPerformed(ActionEvent event)
{
try
{
getAppletContext().showDocument(new URL(u));
}
catch(MalformedURLException e)
{
e.printStackTrace();
}
}
};
在上面的示例代码中,javac编译器将生成两个类文件,就像您的示例中一样:HelloInternalClass.class
和HelloInternalClass$1.class
此实例中的匿名类将是Runnable的一个子类,并将编译成HelloInternalClass$1.class
。顺便说一句,如果您在上面的示例中从Runnable实例中询问类名(通过调用getClass().getName()
),您会发现它认为自己是“HelloInternalClass$1”.创建:
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();
}
}
公共A类{
公共静态void main(字符串[]args){
X=新的X();
X x2=新的X(){
};
ClassBut WelcomeApplet.java文件中没有内部类。让我用文件内容更新。是的,有。它是这样开始的:return new ActionListener(){public void actionPerformed…小程序中有一个内部类,即在makeURLActionListener()中创建的ActionListener-Metod是一个类的内联定义。你说new ActionListener(),然后是{…}中的类定义,在{…}中你实现了actionPerformed方法。我已经在这里粘贴了源代码,并且没有匿名的内部函数class@Shore:是的。你知道什么是匿名内部类吗?有一个匿名类:new ActionListener(){…}将创建ActionListener的匿名子类“匿名内部类”的定义是什么?给出的链接解释了什么是匿名内部类。它只是一个未命名的普通类……它在Java Swing中大量使用,因此,如果您阅读有关事件侦听器的Swing教程,您会发现更多有关它的信息,因为您似乎是从小程序开始的。但是,在中的所有源代码中都没有这样的匿名内部类makeURLActionListener()您正在为ActionListener生成一个匿名内部类。这是源:)如果未调用该类怎么办?会生成“$1.Class”吗?是的。该类无论如何都会生成。但是,您永远不会有这些对象的任何实例。
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();
}
}
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{
}
}