2011-01-27 21 views
7

आंतरिक कक्षाएं सामान्य कक्षाओं की तुलना में अधिक हल्के हैं, या अंत में जावा सामान्य कक्षाओं की तरह आंतरिक कक्षाओं को संकलित करता है?आंतरिक कक्षाएं हल्के वजन वाले हैं?

मुझे पता है कि जावा में कक्षाएं बहुत हल्के नहीं हैं, और वे परमेजन मेमोरी का हिस्सा हैं, इसलिए मैं जानना चाहता हूं कि आंतरिक कक्षाओं के रूप में बंद होने वाले कार्यों का उपयोग करना सर्वोत्तम है या मानक कक्षाएं ठीक है भी?

+1

जेवीएम में केवल आदिम डेटा प्रकार ('int',' float', आदि) और कक्षाएं हैं। उनके बीच कुछ भी नहीं है। – Gabe

उत्तर

17

आंतरिक कक्षाएं और अज्ञात आंतरिक कक्षाएं .class फ़ाइलों को संकलित करती हैं। उदाहरण के लिए:

class Outer { 
    class Inner { 

    } 

    Object function() { 
      return new Object() { 

      }; 
    } 
} 

तीन .class फ़ाइलें, Outer.class, Outer$Inner.class, और Outer$1.class उत्पन्न होगा। वे अन्य वर्गों की तुलना में अधिक "हल्के" नहीं हैं, और (मेरे सर्वोत्तम ज्ञान के लिए) प्रदर्शन प्रदर्शन से दूसरे पर एक का उपयोग करने का कोई फायदा नहीं है। बेशक, आंतरिक कक्षाएं और विशेष रूप से अज्ञात आंतरिक कक्षाएं वास्तव में उन संदर्भों में उपयोगी होती हैं जहां नियमित कक्षाएं कोड के लिए कठिन होती हैं, लेकिन यह एक अलग मुद्दा है।

+7

+1। यदि आंतरिक कक्षाएं कुछ भी "भारी" हैं क्योंकि उनमें कृत्रिम तरीकों और फ़ील्ड होते हैं जो संकलक विशेष दृश्यता नियमों को सुविधाजनक बनाने के लिए बनाता है जो उनके पास उनके वर्ग के संबंध में होते हैं। – Thilo

+0

वाह! जानकारी के लिए धन्यवाद! – Waneck

1

वे हल्के वजन नहीं हैं, लेकिन उनके पास सीमाएं हैं। AFAIK, आप किसी अज्ञात आंतरिक वर्ग के एक से अधिक उदाहरण नहीं बना सकते हैं, और इसलिए यदि आपकी आवश्यकताओं की आवश्यकता है, तो आपको एक गैर-अज्ञात वर्ग का उपयोग करना होगा।

संपादित करें 1: सभी टिप्पणियों और स्पष्टीकरणों के लिए धन्यवाद। कृपया मुझे यह बेहतर समझने में मदद करें ... मैं समझता हूं कि आपके पास गुमनाम आंतरिक कक्षाओं के कई उदाहरण हो सकते हैं, लेकिन अगर मैं एक अज्ञात आंतरिक एक्शनलिस्टर ऑब्जेक्ट को उदाहरण के लिए घोषित करता हूं, तो मेरे पास के कई उदाहरण कैसे हो सकते हैं जो कक्षा और केवल वह कक्षा प्रतिबिंब का उपयोग किए बिना? अग्रिम धन्यवाद (या मुझे इसे अपने प्रश्न में पूछना चाहिए?)!

ठीक है, क्योंकि मुझे कोई काटने नहीं मिल रहा है ... मुझे कोड के साथ प्रदर्शित करने दें। मैं यहाँ एक गुमनाम ActionListener बनाने कहते हैं:

JButton button = new JButton("Button"); 

    button.addActionListener(new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent arg0) { 
     System.out.println("Button says \"Foo!\""); 
    } 

    }); 

    JOptionPane.showMessageDialog(null, button); 

मैं एक गुमनाम ActionListener बना सकते हैं और भी एक ही बार में इस वर्ग की एक वस्तु बना सकते हैं। जो मैंने हमेशा पढ़ाया है, मैंने यहां अपनी पोस्ट के शीर्ष पर जो उल्लेख किया है (और इसके लिए डिंग किया गया है) था, यह असंभव नहीं था (प्रतिबिंब के जादू के बिना) यह अज्ञात वर्ग का एक और उद्देश्य बनाने के लिए मुश्किल है, केवल एक वस्तु बनाई जा सकती है, और ऐसी स्थितियों में जहां केवल एक वस्तु की आवश्यकता होती है, यह ठीक है। लेकिन अन्य परिस्थितियों में, यह ठीक नहीं है। और यकीन है कि आप एक से अधिक समान गुमनाम ActionListener कक्षाएं एक के रूप में पाश के लिए बना सकते हैं,:

JPanel panel = new JPanel(new GridLayout(5, 5)); 
    JButton[] buttons = new JButton[25]; 
    for (int i = 0; i < 25; i++) { 
    final int btnNumber = i; 
    buttons[i] = new JButton(String.valueOf(btnNumber)); 
    buttons[i].addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      System.out.println("From button " + btnNumber); 
     } 
    }); 
    panel.add(buttons[i]); 
    } 
    JOptionPane.showMessageDialog(null, panel); 

लेकिन फिर भी ऐसा है, तो प्रत्येक गुमनाम यहां बनाए गए वर्ग अलग है। इसका महत्व हो सकता है यदि इस प्रकार के श्रोता का उपयोग एकाधिक जेबट्टेंस द्वारा किया जाता है, जिसमें इसका राज्य है, और इसका व्यवहार इस स्थिति पर निर्भर करता है। इस बात से सहमत? असहमत? किसी भी इनपुट के लिए पहले से ही धन्यवाद!

+3

आपके पास गुमनाम आंतरिक कक्षाओं के कई उदाहरण हो सकते हैं, उदाहरण के लिए, कक्षा को 'फॉर' लूप में डालें और इसे कई बार तुरंत चालू करें।मुझे लगता है कि जावा को इन कक्षाओं के लिए एक ही प्रकार की आवश्यकता होती है, लेकिन मुझे याद नहीं है कि यह सही है या नहीं। – templatetypedef

+1

आप इसे सोच रहे हैं। एक अज्ञात भीतरी कक्षा अभी भी एक कक्षा है। कृपया आप जितने चाहें उतने उदाहरण प्राप्त कर सकते हैं। जैसा कि आप निर्दिष्ट करना चाहते हैं, आप भी कई अज्ञात आंतरिक कक्षाएं प्राप्त कर सकते हैं। कंपाइलर संकलन समय पर यह सब संभालता है। इसे प्राप्त होने वाला पहला अनाम विनिर्देश Foo $ 1 का प्यारा नाम प्राप्त करता है, दूसरा Foo $ 2 है, और इसी तरह। कोड 'नया रननेबल() {...}' जैसे 'Foo.new 1() 'बन जाता है। –

+0

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

7

आंतरिक कक्षाएं अभी भी कक्षाएं हैं और उन्हें अभी भी क्लासलोडर द्वारा लोड किया जाना है। अगर कुछ भी है, तो विपरीत सच है। एक गैर स्थैतिक आंतरिक वर्ग अभिभावक वर्ग को कचरा होने से रोक सकता है क्योंकि इसमें उस वर्ग का संदर्भ है जिसका मालिक है।

+1

+1। मूल संदर्भ के अलावा, संबंधित वर्गों से "निजी" विधियों को कॉल करने की अनुमति देने के लिए सिंथेटिक तरीके भी हैं। – Thilo

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