Was ist der $ 1-Wert in classndateinamen?

  C: \ Programme \ Java \ jdk1.6.0_05 \ CoreJava \ v1 \ v1ch2 \ WelcomeApplet> Richt
  Datenträger in Laufwerk C hat kein Label.
  Die Seriennummer des Volumes lautet 2041-64E7

  Verzeichnis von C: \ Programme \ 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 Datei (en) 1.984 Bytes
                2 Dir (s) 2.557.210.624 Bytes frei

 C: \ Programme \ Java \ jdk1.6.0_05 \ CoreJava \ v1 \ v1ch2 \ Willkommensapplet> javac WelcomeApplet.java

 C: \ Programme \ Java \ jdk1.6.0_05 \ CoreJava \ v1 \ v1ch2 \ WelcomeApplet> Richt
  Datenträger in Laufwerk C hat kein Label.
  Die Seriennummer des Volumes lautet 2041-64E7

  Verzeichnis von C: \ Programme \ 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 Datei (en) 4,338 Bytes
                2 Dir (s) 2.557.202.432 Bytes frei

 C: \ Programme \ Java \ jdk1.6.0_05 \ CoreJava \ v1 \ v1ch2 \ WelcomeApplet>

Hier ist der Inhalt dieser Java-Datei:

/** @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(); } } }; } } 

Dies sind die .class Dateien, die die anonymen inneren classn enthalten .

In Ihrem Beispiel enthält WelcomeApplet.java eine class der obersten Ebene (namens WelcomeApplet ) und eine anonyme innere class, die in WelcomeApplet$1.class gespeichert WelcomeApplet$1.class .

Beachten Sie, dass der genaue Name der Dateien, die anonyme innere classn enthalten, nicht standardisiert ist und variieren kann. Aber in der Praxis habe ich noch kein anderes Schema als das hier beschriebene gesehen.

Wertspezifische Körper für ein enum sind auch anonyme innere classn :

Der optionale classnkörper einer Enum-Konstante definiert implizit eine anonyme classndeklaration ( § 15.9.5 ), die den unmittelbar einschließenden Enum-Typ erweitert.

Die $ 1 sind anonyme innere classn, die Sie in Ihrer WelcomeApplet.java Datei definiert haben.

zB Kompilieren

 public class Run { public static void main(String[] args) { System.out.println(new Object() { public String toString() { return "77"; } }); } private class innerNamed { } } 

würde zu Run.class , Run$1.class und Run$innerNamed.class erzeugt werden

Diese werden von den internen und statischen verschachtelten classn in der WelcomeApplet.java-Datei vom Java-Compiler generiert.

Siehe auch diese ähnliche Frage und Antwort .

Es ist von dieser “Linie” des Codes:

 return new ActionListener() { public void actionPerformed(ActionEvent event) { try { getAppletContext().showDocument(new URL(u)); } catch(MalformedURLException e) { e.printStackTrace(); } } }; 

ActionListener Sie den ActionListener deklarieren, ActionListener Sie bei jedem Aufruf dieser Methode eine Instanz der anonymen inneren class.

Selbst wenn die Methode nicht aufgerufen wird, wird die obige Zeile trotzdem in eine anonyme innere class kompiliert.

Die WelcomeApplet$1.class Datei wird für eine anonyme class in der WelcomeApplet.java-Quelle generiert (die anonyme class wird im Methodenaufruf makeURLActionListener generiert, indem ein new new ActionListener() {...} ).

Um dies klarer zu erklären, werden die anonymen classn jedes Mal zur Kompilierzeit generiert, wenn Sie eine konkrete benannte class instanziieren, die das Verhalten der konkreten class (oder der Schnittstelle) ganz oder teilweise inline wie folgt überschreibt:

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

Im obigen Beispielcode würde der Javac-Compiler genau wie in Ihrem Beispiel 2 classndateien erzeugen: HelloInternalClass.class und HelloInternalClass$1.class .

Die anonyme class in diesem Fall wäre eine Unterklasse von Runnable und würde in HelloInternalClass$1.class kompiliert werden. Wenn Sie im obigen Beispiel einen classnnamen von der runnable-Instanz getClass().getName() indem Sie getClass().getName() ), würden Sie feststellen, dass sie sich selbst als ” HelloInternalClass $ 1 ” betrachtet.

Erstellen:

 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{ } } 

Es ist schwer aus dem Code zu sehen ( new X{}() wäre besser gewesen als new X(){} ), aber x2 ist eine Instanz einer Unterklasse von A$X Diese Unterklasse ist A$1 .