2011-11-16 3 views
5

में एक घुमावदार आंतरिक वर्ग निम्न प्रोग्राम Anonymous नामक एक आंतरिक वर्ग का उपयोग करता है जो स्वयं अपने संलग्न वर्ग Main को बढ़ाता है।जावा

package name; 

public class Main 
{ 
    private final String name; 

    Main(String name) 
    { 
     this.name = name; 
    } 

    private String name() 
    { 
     return name; 
    } 

    private void reproduce() 
    { 
     new Anonymous().printName(); 
    } 

    private class Anonymous extends Main 
    { 
     public Anonymous() 
     { 
      super("reproduce"); 
     } 

     public void printName() 
     { 
      System.out.println(name()); 
     } 
    } 

    public static void main(String[] args) 
    { 
     new Main("main").reproduce(); 
    } 
} 

main() प्रणाली में केवल बयान बाहरी वर्ग Main के निर्माता एक स्ट्रिंग मुख्य और बस उसके बाद विधि reproduce() बुलाया जा रहा है की आपूर्ति का आह्वान।


reproduce method बयान new Anonymous().printName(); जो Anonymous वर्ग वस्तु पर printName() विधि का आह्वान होता है। super(); कन्स्ट्रक्टर एक नई स्ट्रिंग की आपूर्ति कर रहा है को इसके संलग्न सुपर क्लास Main पर पुन: उत्पन्न करें।


तदनुसार, printName विधि के भीतर बयान System.out.println(name()); स्ट्रिंग प्रदर्शित करना चाहिए की तुलना में मुख्य बल्कि पुन: पेश लेकिन यह हमेशा स्ट्रिंग मुख्य प्रदर्शित करता है। ऐसा क्यों है?

उत्तर

16

क्योंकि आपने Main.name() को private के रूप में घोषित किया है, इसलिए यह सुपरक्लास विधि के रूप में दिखाई नहीं दे रहा है। हालांकि, यह Anonymous की संलग्न कक्षा की विधि के रूप में दिखाई देता है, इसलिए इसे संलग्न वस्तु पर बुलाया जाता है।

तो अगर आप public या protected रूप Main.name() घोषित, तो आप वास्तव में "reproduce" देखेंगे। वैकल्पिक रूप से, यदि आप Anonymous को static के रूप में घोषित करते हैं, तो यह अब संकलित नहीं होता है।

+0

+1 अच्छी तरह से देखा गया। – skaffman