2008-12-19 7 views
17

अगर मैं एक आंतरिक वर्ग, इस तरह है:

public class Test 
{ 
    public class Inner 
    { 
     // code ... 
    } 

    public static void main(String[] args) 
    { 
     // code ... 
    } 
} 

जब मैं यह संकलन, मैं उम्मीद यह दो फ़ाइलों उत्पन्न करनी चाहिए:

Test.class 
Test$Inner.class 

तो क्यों मैं कभी कभी SomeClass तरह classfiles देख पा रहे हैं $ 1। कक्षा, भले ही SomeClass में "1" नामक एक आंतरिक वर्ग नहीं है? SomeClass $ 1.class गुमनाम इनर क्लासों का प्रतिनिधित्व करता है:

+0

क्या आप स्पष्टीकरण दे सकते हैं कि आपने टेस्ट.क्लास और टेस्ट $ Inner.class क्यों नहीं देखा? मैं उसी पैकेज में एक और SomeClass मानता हूं जिसने क्लास फाइलों को देखा जो आपने देखा था? –

उत्तर

21

SomeClass $ 1.class गुमनाम आंतरिक वर्ग

hava गुमनाम आंतरिक वर्ग अनुभाग here

+1

ध्यान दें कि आंतरिक कक्षाओं के नाम निर्दिष्ट नहीं हैं इसलिए उन्हें इस फ़ॉर्म का होना आवश्यक नहीं है और यह उस पर भरोसा करने के लिए एक बग होगा। लेकिन कहा जा रहा है कि, मैंने अभी तक एक संकलक नहीं देखा है जो विभिन्न नाम उत्पन्न करता है। –

3

पर एक नज़र hhafez पर निर्माण करने के लिए प्रतिनिधित्व करते हैं। इस तरह के एक वर्ग का एक उदाहरण

public class Foo{ 
    public void printMe(){ 
    System.out.println("redefine me!"); 
    } 
} 


public class Bar { 
    public void printMe() { 
    Foo f = new Foo() { 
     public void printMe() { 
     System.out.println("defined"); 
     } 
    }; 
    f.printMe(); 
    } 
} 
एक सामान्य मुख्य से

होगा, अगर आप नए बार() कहा जाता है। यह printMe मुद्रित होगा "परिभाषित" और संकलन निर्देशिका में आप पाएंगे Bar1.class

उपरोक्त कोड में इस खंड:

Foo f = new Foo() { 
     public void printMe() { 
     System.out.println("defined"); 
     } 
    }; 

एक गुमनाम आंतरिक वर्ग कहा जाता है।

8

आपको SomeClass$1.class जैसे कुछ भी मिलेंगे यदि आपकी कक्षा में एक निजी आंतरिक वर्ग (अज्ञात नहीं है) लेकिन आप इसे मूल वर्ग में किसी बिंदु पर तुरंत चालू करते हैं।

उदाहरण के लिए:

public class Person { 

    private class Brain{ 
     void ponderLife() { 
      System.out.println("The meaning of life is..."); 
     } 
    } 

    Person() { 
     Brain b = new Brain(); 
     b.ponderLife(); 
    } 
} 

यह लाभ होगा:

Person.class 
Person$Brain.class 
Person$1.class 

निजी तौर पर मुझे लगता है कि जब एक सरल अंतरफलक या एक अमूर्त वर्ग को लागू करने में एक विशिष्ट गुमनाम वर्ग की तुलना में विशेष रूप से पढ़ने के लिए थोड़ा आसान है कि केवल एक और स्थानीय वस्तु में पारित किया जाता है।

+1

जैवैक ऐसा क्यों करता है? इस मामले पर अधिक स्पष्ट रूप से पूछा गया है: http://stackoverflow.com/questions/2883181/why-is-an-anonymous-inner-class-containing- कुछ भी नहीं- जनरेटेड- सेम- यह- कोड –

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