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(); 
               }
            }
         };
   }
}
45
demandé sur Matthias Braun 2009-07-02 19:55:41

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.

54
répondu Joachim Sauer 2013-06-10 11:48:17

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é

22
répondu jitter 2009-07-02 16:03:02

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 .

3
répondu Kosi2801 2017-05-23 12:09:57

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.

2
répondu jjnguy 2013-09-03 14:35:17

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

1
répondu Roland Tepp 2009-07-02 16:41:49

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 .

0
répondu ericj 2017-03-21 12:35:19