2012-07-09 6 views
52

हैं, मैं अपने विकास आईडीई के रूप में ग्रहण का उपयोग कर रहा हूं। मैं इसे अपने आवेदन को .jar फ़ाइल में निर्यात करने के लिए भी उपयोग करता हूं। जब मैं .jar फ़ाइल में अपनी कक्षाओं को देखता हूं, तो मेरे कुछ वर्गों में उस वर्ग का नाम होता है, एक डॉलर का चिह्न, फिर एक संख्या। उदाहरण:जावा संकलित कक्षाओं में डॉलर के संकेत

  • खोजें $ 1.class
  • खोजें $ 2.class
  • $ 3.class
  • Find.class

खोजें मैंने देखा है यह बड़ा वर्गों पर करता है। क्या ऐसा इसलिए है क्योंकि कक्षाएं इतनी बड़ी हो जाती हैं, यह इसे कई वर्गों में संकलित करती है? मैंने गुमराह किया है और कई मंचों पर देखा है, और जावा दस्तावेज़ीकरण की खोज की है लेकिन इससे संबंधित कुछ भी नहीं मिला है। क्या कोई समझा सकता है?

उत्तर

69

आंतरिक कक्षाएं, यदि आपकी कक्षा में कोई भी मौजूद है, तो संकलित किया जाएगा और कक्षा फ़ाइल ClassName$InnerClassName होगी। बेनामी आंतरिक कक्षाओं के मामले में, यह संख्याओं के रूप में दिखाई देगा। कक्षा का आकार (जावा कोड) कई वर्गों की पीढ़ी का नेतृत्व नहीं करता है।

उदा। कोड के इस टुकड़े को देखते हुए:

public class TestInnerOuterClass { 
    class TestInnerChild{ 

    } 

    Serializable annoymousTest = new Serializable() { 
    }; 
} 

वर्ग जो उत्पन्न हो जाएगा हो जाएगा:

  1. TestInnerOuterClass.class
  2. TestInnerOuterClass$TestInnerChild.class
  3. TestInnerOuterCasss$1.class

अद्यतन:

अज्ञात वर्ग का उपयोग करना एक बुरा अभ्यास नहीं माना जाता है, यह केवल उपयोग पर निर्भर करता है।

चेक पर this चर्चा अतः

+0

ठीक है, तो क्या गुमनाम वर्ग होना बुरा है? मुझे समझ में नहीं आता कि यह कैसे काम करता है। यदि मैं कक्षा में कक्षा का नया इंस्टेंस वैरिएबल बनाता हूं, तो यह एक अज्ञात वर्ग है? – Frizinator

+0

नहीं, अज्ञात वर्ग होना बुरा नहीं है, यह उपयोग पर निर्भर करता है। मेरे पोस्ट को अपडेट किया गया – mprabhat

+4

कक्षा निकाय वाले एम्स स्वचालित रूप से एक अज्ञात आंतरिक वर्ग उत्पन्न करेंगे जो enum क्लास को बढ़ाता है, और इस प्रकार इसमें एक और वर्ग फ़ाइल उत्पन्न करता है। – dlaidlaw

10

इसका कारण यह है कि आप इस बड़े वर्ग के भीतर गुमनाम वर्गों है। वे इस नामकरण सम्मेलन का उपयोग करके संकलित हो जाते हैं।

The Anonymous Class Conundrum

0

देखें अपनी टिप्पणी का उत्तर देने के बारे में अनाम कक्षाओं बुरा कर रहे हैं। वे निश्चित रूप से नहीं हैं। एक JButton की जाने वाली कार्रवाई श्रोता आवंटित करने के लिए इस पर विचार करें:

JButton button = new JButton(...); 
button.addActionListener(new ActionListener() { ... }); 

या इस "नाम" संपत्ति द्वारा एक मामले असंवेदनशील तरह करने के लिए

Collections.sort(array, new Comparator<Foo>() { 
    public int compare(Foo f1, Foo f2) { 
     return f1.getName().toLowerCase().compareTo(f2.getName().toLowerCase()); 
    } 
}); 

तुम भी Runnable का एक बहुत दिखाई देंगे अज्ञात कक्षाओं के रूप में कॉल करने योग्य।

5

@mprabhat द्वारा प्रस्तुत ऊपर मामलों के अलावा, अन्य मामलों हो सकता है:

  1. अगर आप वर्ग एक enum चर एक अलग वर्ग है कि के लिए भी उत्पन्न होगा होते हैं। उत्पन्न क्लास का नाम क्लासनाम $ Name_of_enum होगा।
  2. अपनी कक्षा एक्स यानी विरासत में अन्य वर्ग वाई प्रदान कर रहा है, तो नाम className $ 1.class या className से बनाए गए .class होगा $ 1 $ 1.class
  3. अपने वर्ग हैं एक्स एक अंतरफलक वाई लागू कर रहा है, तो नाम className $ 1.class या className $ 1 $ 1.class से बनाए गए .class होगा।

इन मामलों जार में .class फाइलों पर मेरी निरीक्षण के derivations हैं।

+0

मेरे पास एक वर्ग है जो इन मानदंडों में से कोई भी नहीं मिलता है, और class.getName() अभी भी गलत है - Group.java के लिए, यह समूह _ $$ _ jvst248_20 देता है। मुझे कुछ पता नहीं है क्या चल रहा है। निश्चित रूप से कोई enums, विस्तार या लागू करता है। – Amalgovinus

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^