Java 类文件名中的$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

$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 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{     
    }
}