2012-04-18 14 views
6

इसलिए मुझे कुछ समय पहले इस कोड का उदाहरण ऑनलाइन मिला और मैं इसे फिर से चला रहा हूं लेकिन काफी उलझन में हूं।जावा - इंटरफ़ेस, एक इंटरफेस को तत्काल?

इसे देखने से, जो मैं इकट्ठा करता हूं (और यह गलत हो सकता है) यह है कि यह प्रिंटर ऑब्जेक्ट में नंबर प्रिंटर क्लास में प्रिंट विधि में जाता है। हालांकि, इंटरफ़ेस को प्रिंटर भी कहा जाता है, इसलिए क्या हम प्रिंटर इंटरफ़ेस के अज्ञात वर्ग को तुरंत चालू नहीं कर रहे हैं, विधियों को परिभाषित कर रहे हैं और फिर इसे पास कर रहे हैं?

मेरा मूल प्रश्न है, क्या मेरी प्रारंभिक धारणा सही है? और यदि ऐसा है तो मैंने सोचा कि आप एक इंटरफ़ेस को तुरंत चालू नहीं कर सकते?

public class NumberPrinter { 

    public interface Printer { 
     public void print (int idx); 
    } 

    public static void print (Printer p) { 
     for (int i = 0; i < 4; i++) { 
      p.print(i); 
     } 
    } 

    public static void main(String[] args) { 
     print(new Printer() { 

      @Override 
      public void print(int idx) { 
       System.out.println(idx); 
      } 

     }); 
    } 

} 
+0

ऐसा लगता है कि यह एक डुप्लिकेट प्रश्न हो सकता है। यहां जाकर देखें http://stackoverflow.com/questions/4000062/can-we-create-an-object-of-an-interface – astidham2003

उत्तर

17

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

यह एक गैर-नामित कक्षा बनाता है जो Printer इंटरफ़ेस लागू करता है।

+0

आह, मुझे लगता है कि मुझे वह मिल गया है! – mino

3

आपकी धारणा सही है, और आप एक इंटरफ़ेस को तुरंत चालू नहीं कर सकते हैं। हालांकि आप एक अज्ञात वर्ग को तुरंत चालू कर सकते हैं, जो कोड कर रहा है।

+0

तो आप एक इंटरफ़ेस के अज्ञात आंतरिक वर्ग को तुरंत चालू कर सकते हैं? – mino

+0

हां, यह सही है। –

1

आपको नंबर प्रिंटर के प्रिंट फ़ंक्शन के लिए प्रिंटर ऑब्जेक्ट की आवश्यकता है। जब आप उस फ़ंक्शन को कॉल करते हैं तो आप वास्तव में प्रिंटर इंटरफ़ेस को तुरंत चालू नहीं करते हैं लेकिन आप इसके कार्यान्वयन को तुरंत चालू करते हैं और यही कारण है कि यह काम कर रहा है।

आपकी धारणा रास्ते से सही थी।

+0

तो, क्षमा करें, मैं उलझन में हूं कि आप इसे अज्ञात आंतरिक कक्षा क्यों पारित कर सकते हैं? क्या यह प्रिंटर प्रकार का एक वस्तु है? – mino

+0

चूंकि यह अज्ञात आंतरिक वर्ग है, इसलिए इसका कोई उद्देश्य नहीं है, इसलिए मुझे नहीं लगता कि यहां कोई प्रिंटर ऑब्जेक्ट है। नया प्रिंटर() कॉल उस वर्ग का एक नया उदाहरण बनाता है और इसे कथन के परिणाम के रूप में देता है। – Chris911