Qu'est-ce que les noms de fichier $1 dans class?
C:Program FilesJavajdk1.6.0_05CoreJavav1v1ch2WelcomeApplet>dir Volume in drive C has no label. Volume Serial Number is 2041-64E7 Directory of C:Program FilesJavajdk1.6.0_05CoreJavav1v1ch2WelcomeApplet 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 FilesJavajdk1.6.0_05CoreJavav1v1ch2WelcomeApplet>javac WelcomeApplet.java C:Program FilesJavajdk1.6.0_05CoreJavav1v1ch2WelcomeApplet>dir Volume in drive C has no label. Volume Serial Number is 2041-64E7 Directory of C:Program FilesJavajdk1.6.0_05CoreJavav1v1ch2WelcomeApplet 2009-07-02 23:54 . 2009-07-02 23:54 .. 2009-07-02 23:54 975 WelcomeApplet.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 FilesJavajdk1.6.0_05CoreJavav1v1ch2WelcomeApplet>
voici le contenu de ce fichier 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();
}
}
};
}
}
6 réponses
ce sont les fichiers .class
qui contiennent les classes intérieures anonymes .
dans votre exemple WelcomeApplet.java
contient une classe supérieure (appelée WelcomeApplet
) et une classe interne anonyme, qui sera stockée dans WelcomeApplet.class
.
notez que le nom exact des fichiers contenant des classes internes anonymes n'est pas normalisé et peut varier. Mais en pratique, je n'ai pas encore vu d'autre schéma que celui décrit ici.
les corps spécifiques à une valeur pour enum
sont également des classes intérieures anonymes :
le corps de classe optionnel d'une constante enum définit implicitement une déclaration de classe anonyme( §15.9.5 ) cela étend le type immédiatement enveloppant enum.
les $1 sont des classes internes anonymes que vous avez définies dans votre fichier WelcomeApplet.java
.
p.ex. compilation
public class Run {
public static void main(String[] args) {
System.out.println(new Object() {
public String toString() {
return "77";
}
});
}
private class innerNamed {
}
}
générerait Run.class
, Run.class
et Run$innerNamed.class
serait généré
ceux-ci sont générés à partir des classes internes et statiques imbriquées dans L'applet WelcomeApplet.fichier java par le compilateur java.
Voir aussi cette similaires " question et réponse .
il est de cette "ligne" de code:
return new
ActionListener()
{
public void actionPerformed(ActionEvent event)
{
try
{
getAppletContext().showDocument(new URL(u));
}
catch(MalformedURLException e)
{
e.printStackTrace();
}
}
};
la façon dont vous déclarez le ActionListener
vous faites une instance de la classe interne anonyme chaque fois que cette méthode est appelée.
même si la méthode n'est pas appelée, la ligne ci-dessus est quand même compilée dans une classe interne anonyme quoi qu'il arrive.
le fichier WelcomeApplet.class
est généré pour une classe anonyme dans le WelcomeApplet.java source (la classe anonymous est générée dans la méthode makeURLActionListener en appelant new new ActionListener() {...}
)
pour expliquer plus clairement, les classes anonymous sont générées au moment de la compilation chaque fois que vous avez une instanciation d'une classe appelée concrete qui surpasse tout ou partie du comportement de la classe (ou de l'interface) en ligne comme ceci:
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();
}
}
dans le code échantillon ci-dessus, le compilateur javac générerait 2 fichiers de classe comme dans votre exemple: HelloInternalClass.class
et HelloInternalClass.class
.
la classe anonymous dans ce cas serait une sous-classe de Runnable et serait compilée en HelloInternalClass.class
. Soit dit en passant, si vous demandez un nom de classe à l'instance exécutable dans l'exemple ci-dessus (en appelant getClass().getName()
), vous trouverez qu'elle se considère comme " HelloInternalClass$1 ".
créer:
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{
}
}
il est difficile de voir à partir du code ( new X{}()
aurait été mieux que new X(){}
), mais x2
est une instance d'une sous-classe de A$X
. La présente sous-classe est A
.