C:\Program Files\Java\jdk1.6.0_05\CoreJava\v1\v1ch2\WelcomeApplet>dir Volume in drive C has no label. Volume Serial Number is 2041-64E7 Directory of 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 File(s) 1,984 bytes 2 Dir(s) 2,557,210,624 bytes free 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 Volume in drive C has no label. Volume Serial Number is 2041-64E7 Directory of 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 File(s) 4,338 bytes 2 Dir(s) 2,557,202,432 bytes free C:\Program Files\Java\jdk1.6.0_05\CoreJava\v1\v1ch2\WelcomeApplet>
Here is the content of that Java file:
/**
@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();
}
}
};
}
}
The
WelcomeApplet$1.class
file is generated for an anonymous class in the WelcomeApplet.java source (the anonymous class is generated in the method call makeURLActionListener by callingnew new ActionListener() {...}
)To explain more clearly, the anonymous classes are generated at compile time any time you have an instantiation of a concrete named class that overrides some or all of the behavior of the concrete class (or interface) inline like this:
In the above sample code, the javac compiler would generate 2 class files just like in your example:
HelloInternalClass.class
andHelloInternalClass$1.class
.The anonymous class in this instance would be a subclass of Runnable and would be compiled into
HelloInternalClass$1.class
. Incidentally, if you would ask a class name from the runnable instance in the above sample (by callinggetClass().getName()
) you would find that it thinks of itself as "HelloInternalClass$1".These are generated from the inner and static nested classes in the WelcomeApplet.java file by the java compiler.
See also this similar question and answer.
Create:
It is hard to see from the code (
new X{}()
would have been better thannew X(){}
), butx2
is an instance of a subclass ofA$X
. This subclass isA$1
.Those are the
.class
files that hold the anonymous inner classes.In your example
WelcomeApplet.java
contains a top-level class (calledWelcomeApplet
) and an anonymous inner class, which will be stored inWelcomeApplet$1.class
.Note that the exact name of the files holding anonymous inner classes is not standardized and might vary. But in practice I've yet to see any other scheme than the one described here.
Value-specific bodies for an
enum
are also anonymous inner classes:The $1 are anonymous inner classes you defined in your
WelcomeApplet.java
file.e.g. compiling
would result in
Run.class
,Run$1.class
andRun$innerNamed.class
being generatedIt is from this 'line' of code:
The way you are declaring the
ActionListener
you are making an instance of the anonymous inner class each time that method is called.Even if the method is not called, the above line still gets compiled into an anonymous inner class no matter what.