/ / जावा नेस्टेड क्लासेस- हुड के तहत? - जावा

जावा नेस्टेड क्लासेस- हुड के तहत? - जावा

मेरे पास जावा के भीतर नेस्टेड कक्षाओं से संबंधित कुछ प्रश्न हैं।

  • स्मृति के आवंटन के संबंध में नेस्टेड कक्षाएं "हुड के नीचे" कैसे दिखाई देती हैं?

  • आप एक के भीतर एक स्थिर चर घोषित नहीं कर सकतेनेस्टेड क्लास (मुझे लगता है कि सटीक त्रुटि यह थी कि स्थिर विशेषताओं को केवल शीर्ष स्तर की कक्षा में घोषित किया जा सकता है)। ऐसा क्यों है और नेस्टेड वर्गों के लिए अन्य प्रतिबंध क्या हैं?

यदि संभव हो, तो कृपया कहें कि क्या आपका उत्तर जावा-विशिष्ट है, या क्या C ++ भी समान नियमों का पालन करता है?

उत्तर:

उत्तर № 1 के लिए 1

आंतरिक कक्षाएं नियमित रूप से समान हैंकक्षाएँ जहाँ तक स्मृति और संकलन का संबंध है। (शायद उनकी याददाश्त में कामयाब होने के तरीके में कुछ अंतर है, लेकिन यह औसत जावा डेवलपर के लिए दृश्यमान नहीं है) वास्तव में, जब आप एक वर्ग को संकलित करते हैं जिसमें एक आंतरिक वर्ग होता है, तो आप संकलित .class फ़ाइल देख सकते हैं जैसा OuterClass$InnerClass.class। जहां तक ​​मुझे पता है, जेवीएम उनके साथ ऐसा ही व्यवहार करता है।

जहाँ तक स्थिर चरों का संबंध है, मैं निश्चित नहीं हूँ कि समस्या क्या है। उदाहरण के लिए, यह मेरे लिए चलता है:

public class Tester {
public static void main(String[] args) {
System.out.println(InnerTester.MY_STRING);
}

public class InnerTester {
public static final String MY_STRING = "MY_STRING";
}
}

संपादित करें

जैसा कि जेफरी ने बताया, यह संकलन नहीं है:

public class Tester {
public static void main(String[] args) {
System.out.println(InnerTester.MY_STRING);
}

public class InnerTester {
public static String MY_STRING = "MY_STRING";
}
}

अंतर यह है, मेरे पास पहले स्थिर चर को अंतिम रूप में सूचीबद्ध किया गया था।

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

मुझे मिला इस उस पर भी चर्चा।


उत्तर № 2 के लिए 1

मूल रूप से एक नेस्टेड वर्ग सिर्फ एक वर्ग है जिसमें संलग्न उदाहरण का उल्लेख किया गया है।

जब तक यह एक स्थिर नेस्टेड क्लास नहीं है (जिसके अंदर आप स्थिर क्षेत्रों / विधियों की घोषणा कर सकते हैं)। इस मामले में यह नाम में एक और पथ तत्व के साथ सिर्फ एक वर्ग है (पैकेज + वर्ग नाम घेरना)।

दूसरे शब्दों में। नॉन-स्टैटिक नेस्टेड क्लास (आंतरिक वर्ग) - बिना इंक्लोजिंग इंस्टेंस के मौजूद नहीं हो सकता (जैसे किसी किताब के अंदर पेज)। और आप तुरंत इस प्रकार हैं:

 Book book = ... // a book instance;
Book.Page page = book.new Page(); // requires an enclosing instance

लेकिन स्टेटिक नेस्टेड क्लास - पूरी तरह से स्वतंत्र है, यह सिर्फ नाम के स्थान का सवाल है।

 Outer.NestedStatic instance = new Outer.NestedStatic(); // just name-space

यहां अधिक जानकारी: http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html


जवाब के लिए 0 № 3

एक नेस्टेड क्लास बस दूसरे वर्ग के अंदर एक प्रकार की परिभाषा है। जावा इस बात की परवाह नहीं करता है कि नए प्रकार को किस दायरे में परिभाषित किया गया है, और आपको किसी विशेष तरीके से इस आंतरिक वर्ग को "हैंडल" करने की आवश्यकता नहीं है।

यह स्थिर क्षेत्रों के साथ एक गैर-स्थिर आंतरिक वर्ग होने का कोई मतलब नहीं होगा, क्योंकि गैर-स्थिर आंतरिक वर्ग का कोई भी संदर्भ आवश्यक रूप से एक उदाहरण चर है। केवल अगर आंतरिक वर्ग बनाया गया है। static क्या इसे वैधानिक रूप से निर्दिष्ट करना भी संभव होगा - इस मामले में, स्टैटिक इनर क्लास एक स्टैंडअलोन क्लास है, जिसमें एनक्लोविंग क्लास नाम अभी तक किसी अन्य नामस्थान स्तर के रूप में कार्य करता है।