java कक्षा फ़ाइल नामों में $ 1 क्या है?




javac anonymous-class (5)

$ 1 अज्ञात आंतरिक कक्षाएं हैं जिन्हें आपने अपनी WelcomeApplet.java फ़ाइल में परिभाषित किया है।

उदाहरण के लिए संकलन

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

परिणामस्वरूप Run.class , Run$1.class Run$innerNamed.class और Run$innerNamed.class जा रहा है

C:\Program Files\Java\jdk1.6.0_05\CoreJava\v1\v1ch2\WelcomeApplet>dir
 Volume in drive C has no label.
 Volume Serial Number is 2041-64E7

 Directory of 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 File(s)          1,984 bytes
               2 Dir(s)   2,557,210,624 bytes free

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
 Volume in drive C has no label.
 Volume Serial Number is 2041-64E7

 Directory of 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 File(s)          4,338 bytes
               2 Dir(s)   2,557,202,432 bytes free

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

उस जावा फ़ाइल की सामग्री यहां दी गई है:

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

वे .class फ़ाइलें हैं जो अनाम आंतरिक कक्षाएं रखती हैं

आपके उदाहरण में WelcomeApplet.java में एक शीर्ष-स्तरीय कक्षा (जिसे WelcomeApplet कहा जाता है) और एक अनाम आंतरिक कक्षा है, जिसे WelcomeApplet$1.class में संग्रहीत किया जाएगा।

ध्यान दें कि अनाम आंतरिक कक्षाओं वाली फाइलों का सटीक नाम मानकीकृत नहीं है और भिन्न हो सकता है। लेकिन व्यवहार में मैंने अभी तक वर्णित किसी की तुलना में कोई अन्य योजना नहीं देखी है।

एक enum लिए मूल्य-विशिष्ट निकायों भी अज्ञात आंतरिक कक्षाएं हैं :

एक enum निरंतर का वैकल्पिक वर्ग निकाय एक अज्ञात वर्ग घोषणा ( §15.9.5 ) को स्पष्ट रूप से परिभाषित करता है जो तत्काल संलग्न enum प्रकार को बढ़ाता है।


ये जावा कंपाइलर द्वारा WelcomeApplet.java फ़ाइल में आंतरिक और स्थिर घोंसला वाले वर्गों से उत्पन्न होते हैं।

यह भी इसी सवाल और उत्तर को देखें


WelcomeApplet$1.class फ़ाइल WelcomeApplet.java स्रोत में अज्ञात वर्ग के लिए जेनरेट की जाती है (अज्ञात वर्ग विधि कॉल मेकुरलाक्शन लिस्टर में new new ActionListener() {...} एक्शनलिस्टर new new ActionListener() {...} कॉल करके उत्पन्न होता है)

अधिक स्पष्ट रूप से व्याख्या करने के लिए, गुमनाम कक्षाएं संकलित समय पर उत्पन्न होती हैं जब भी आपके पास एक कंक्रीट नामक वर्ग का तात्कालिकता होता है जो इस तरह के कंक्रीट वर्ग (या इंटरफ़ेस) के कुछ या सभी व्यवहार को ओवरराइड करता है:

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

उपर्युक्त नमूना कोड में, HelloInternalClass.class आपके उदाहरण में 2 वर्ग फ़ाइलों को उत्पन्न करेगा: HelloInternalClass.class और HelloInternalClass$1.class

इस उदाहरण में अज्ञात वर्ग HelloInternalClass$1.class का उप-वर्ग होगा और HelloInternalClass$1.class में संकलित किया जाएगा। संयोग से, यदि आप उपर्युक्त नमूने में getClass().getName() इंस्टेंस से क्लास नाम पूछेंगे ( getClass().getName() को कॉल करके getClass().getName() ) आप पाएंगे कि यह स्वयं को " हैलोइनरल क्लास $ 1 " के रूप में सोचता है।


सर्जन करना:

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

कोड से देखना मुश्किल है ( new X{}() new X(){} ) से बेहतर होता, लेकिन x2 A$X उप-वर्ग का उदाहरण है। यह सबक्लास A$1







anonymous-class