web-dev-qa-db-fra.com

Quel est le $ 1 dans les noms de fichier de classe?

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(); 
               }
            }
         };
   }
}
50
omg

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 enumsont é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.

56
Joachim Sauer

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

24
jitter

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 .

4
Kosi2801

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.

2
jjnguy

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 ".

1
Roland Tepp

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.

0
ericj