Qu'est-ce que le $1 dans la classe des noms de fichiers?
C:\Program Files\Java\jdk1.6.0_05\CoreJava\v1\v1ch2\WelcomeApplet>dir Le Volume dans le lecteur C n'a pas d'étiquette. Numéro de Série du Volume est 2041-64E7 Répertoire de 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 Fichier(s) 1,984 octets 2 Dir(s) 2,557,210,624 octets libres 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 Le Volume dans le lecteur C n'a pas d'étiquette. Numéro de Série du Volume est 2041-64E7 Répertoire de 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 Fichier(s) 4,338 octets 2 Dir(s) 2,557,202,432 octets libres C:\Program Files\Java\jdk1.6.0_05\CoreJava\v1\v1ch2\WelcomeApplet>
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:[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();
}
}
};
}
}
Vous devez vous connecter pour publier un commentaire.
Ceux sont les
.class
fichiers qui détiennent le les classes internes anonymes.Dans votre exemple
WelcomeApplet.java
contient un haut-niveau de la classe (appeléeWelcomeApplet
) et un anonyme intérieur de la classe, qui sera stockée dansWelcomeApplet$1.class
.Noter que le nom exact des fichiers anonyme holding les classes internes ne sont pas normalisés et peuvent varier. Mais dans la pratique je n'ai pas encore tout autre régime que celui qui est décrit ici.
Valeur des organes spécifiques pour un
enum
sont aussi les classes internes anonymes:L' $1 sont les classes internes anonymes que vous avez défini dans votre
WelcomeApplet.java
fichier.par exemple la compilation de
entraînerait
Run.class
,Run$1.class
etRun$innerNamed.class
généréCelles-ci sont générées à partir de l'intérieur et de la statique des classes imbriquées dans le WelcomeApplet.java fichier par le compilateur java.
Voir aussi ce la même question et la réponse.
C'est à partir de cette "ligne" de code:
La façon de déclarer les
ActionListener
vous faites une instance de la anonyme intérieur de la classe à chaque fois que la méthode est appelée.Même si la méthode n'est pas appelée, la ligne ci-dessus obtient toujours compilé dans un anonyme intérieur de la classe, peu importe quoi.
La
WelcomeApplet$1.class
fichier est généré pour la classe anonyme dans le WelcomeApplet.java source (la classe anonyme est généré dans l'appel de la méthode makeURLActionListener en appelantnew new ActionListener() {...}
)Pour expliquer plus clairement, de l'anonyme classes sont générées au moment de la compilation tout moment, vous disposez d'une instanciation d'un béton de la classe nommée qui remplace certains ou de l'ensemble du comportement du béton de classe (ou l'interface) inline comme ceci:
Dans l'exemple ci-dessus le code, le compilateur javac serait de générer des 2 fichiers de classe, tout comme dans votre exemple:
HelloInternalClass.class
etHelloInternalClass$1.class
.La classe anonyme dans cet exemple, pourrait être une sous-classe de Praticable et seraient rassemblés dans
HelloInternalClass$1.class
. D'ailleurs, si vous demandez à un nom de classe à partir de l'exécutable exemple dans l'exemple ci-dessus (en appelantgetClass().getName()
) que vous trouverez qu'il pense de lui-même comme "HelloInternalClass$1".Créer:
Il est difficile de voir dans le code (
new X{}()
aurait été mieux quenew X(){}
), maisx2
est une instance d'une sous-classe deA$X
. Cette sous-classe estA$1
.