Какой файл $1 в классе?
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>
Вот содержимое этого 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:[email protected]"));
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();
}
}
};
}
}
Ответы
Ответ 1
Это файлы .class
, содержащие анонимные внутренние классы.
В вашем примере WelcomeApplet.java
содержится класс верхнего уровня (называемый WelcomeApplet
) и анонимный внутренний класс, который будет храниться в WelcomeApplet$1.class
.
Обратите внимание, что точное имя файлов, содержащих анонимные внутренние классы, не стандартизировано и может отличаться. Но на практике я еще не вижу никакой другой схемы, кроме описанной здесь.
Составляющие значение тела для enum
также являются анонимными внутренними классами:
Необязательное тело класса константы enum неявно определяет анонимное объявление класса (§15.9.5), которое расширяет сразу включаемый тип перечисления.
Ответ 2
$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
Ответ 3
Они генерируются из внутреннего и статического вложенных классов в файле WelcomeApplet.java компилятором java.
Смотрите также этот похожий вопрос и ответ.
Ответ 4
Именно из этой "строки" кода:
return new
ActionListener()
{
public void actionPerformed(ActionEvent event)
{
try
{
getAppletContext().showDocument(new URL(u));
}
catch(MalformedURLException e)
{
e.printStackTrace();
}
}
};
Как вы объявляете ActionListener
, вы делаете экземпляр анонимного внутреннего класса каждый раз, когда вызывается этот метод.
Даже если метод не вызывается, указанная выше строка все равно скомпилируется в анонимный внутренний класс независимо от того, что.
Ответ 5
Файл WelcomeApplet$1.class
создается для анонимного класса в источнике WelcomeApplet.java(анонимный класс генерируется в вызове метода makeURLActionListener, вызывая new new ActionListener() {...}
)
Чтобы более ясно объяснить, анонимные классы генерируются во время компиляции в любое время, когда у вас есть экземпляр конкретного именованного класса, который переопределяет некоторое или все поведение конкретного класса (или интерфейса) в виде строки следующим образом:
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".
Ответ 6
Создать:
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
.