C:\Program Files\Java\jdk1.6.0_05\CoreJava\v1\v1ch2\WelcomeApplet> dir Le volume dans le lecteur C n'a pas d'étiquette . Le 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 gratuits C:\Program Files\Java\jdk1.6.0_05\CoreJava\v1\v1ch2\WelcomeApplet> javac WelcomeApplet.Java .. C.\Java\jdk1.6.0_05\CoreJava\v1\v1ch2\WelcomeApplet> dir Le volume dans le lecteur C n'a pas d'étiquette . Le 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 15h04 1,402 WelcomeApplet.Java 4 Fichier (s) 4 338 octets 2 Dir (s) 2 557 202 432 octets gratuits C:\Programmes\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();
}
}
};
}
}
Ce sont les fichiers .class
qui contiennent les classes internes anonymes .
Dans votre exemple, WelcomeApplet.Java
contient une classe de niveau supérieur (appelée WelcomeApplet
) et une classe interne anonyme, qui seront stockées dans WelcomeApplet$1.class
.
Notez que le nom exact des fichiers contenant des classes internes anonymes n'est pas normalisé et peut varier. Mais dans la pratique, je n’ai encore vu aucun régime autre que celui décrit ici.
Les corps spécifiques à une valeur pour une enum
sont également des classes internes anonymes :
Le corps de classe facultatif d'une constante enum définit implicitement une déclaration de classe anonyme ( §15.9.5 ) qui étend le type enum englobant immédiatement.
Les $ 1 sont des classes internes anonymes définies dans votre fichier WelcomeApplet.Java
.
par exemple. compiler
public class Run {
public static void main(String[] args) {
System.out.println(new Object() {
public String toString() {
return "77";
}
});
}
private class innerNamed {
}
}
entraînerait la génération de Run.class
, Run$1.class
et Run$innerNamed.class
Ils sont générés à partir des classes imbriquées internes et statiques du fichier WelcomeApplet.Java par le compilateur Java.
Voir aussi cette question et réponse similaires .
C'est à partir 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 la ActionListener
vous créez une instance de la classe interne anonyme à chaque appel de cette méthode.
Même si la méthode n'est pas appelée, la ligne ci-dessus reste compilée dans une classe interne anonyme, quoi qu'il arrive.
Le fichier WelcomeApplet$1.class
est généré pour une classe anonyme dans le source WelcomeApplet.Java (la classe anonyme est générée dans l'appel de méthode makeURLActionListener en appelant new new ActionListener() {...}
).
Pour expliquer plus clairement, les classes anonymes sont générées au moment de la compilation chaque fois que vous obtenez une instanciation d'une classe nommée concrète qui remplace tout ou partie du comportement de la classe concrète (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 l'exemple de code ci-dessus, le compilateur javac générerait deux fichiers de classe, comme dans votre exemple: HelloInternalClass.class
et HelloInternalClass$1.class
.
La classe anonyme dans cette instance serait une sous-classe de Runnable et serait compilée dans HelloInternalClass$1.class
. Incidemment, si vous demandiez un nom de classe à partir de l'instance exécutable dans l'exemple ci-dessus (en appelant getClass().getName()
), vous constateriez 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é meilleur que new X(){}
), mais x2
est une instance d'une sous-classe de A$X
. Cette sous-classe est A$1
.