2014-11-24 11 views
5

मेरे पास आंतरिक कक्षा के अंदर इंटरफ़ेस क्यों नहीं हो सकता है? वे स्वाभाविक रूप से static क्यों हैं? क्षमा करें अगर यह एक बेवकूफ सवाल है, तो मैंने बार-बार Google को अपना सर्वश्रेष्ठ प्रयास करने की कोशिश की है, लेकिन मैं इसे अपने सिर के चारों ओर लपेट नहीं सकता। मैं इन्हें आंतरिक कक्षाओं/स्थानीय वर्गों में क्यों घोषित नहीं कर सकता हूं?अंतरफलक स्थिर क्यों हैं?

इसके अलावा एक पुष्टि के रूप में, एक इंटरफ़ेस में स्थिर अंतिम चर हो सकता है क्योंकि वे राज्य या किसी भी प्रकार के कार्यान्वयन को सही नहीं निर्दिष्ट करते हैं? अगर हम static खो देते हैं और केवल एक फाइनल का उपयोग करते हैं, तो हमें एक उदाहरण की आवश्यकता होती है जो किसी भी कारण का कारण नहीं है जिससे आप इंटरफ़ेस को तुरंत चालू नहीं कर सकते हैं। क्षमा करें, मैं वास्तव में उलझन में हूं, और मुझे पता है कि मुझे सिर्फ एक और सवाल करना चाहिए, लेकिन मुझे लगता है कि ये दो प्रश्न कुछ हद तक संबंधित हैं।

उत्तर

5

स्थिर का अर्थ है - "किसी विशेष उदाहरण से संबंधित नहीं है"।इसलिए, जैसा कि आप इंगित करते हैं, static वर्ग Foo का क्षेत्र एक ऐसा क्षेत्र है जो Foo उदाहरण से संबंधित नहीं है, बल्कि Fooकक्षा से संबंधित है।

अब सोचें कि एक इंटरफ़ेस क्या है - यह एक अनुबंध है, विधियों की एक सूची जो कक्षाएं जो इसे लागू करने का वादा करती हैं। इसके बारे में सोचने का एक और तरीका यह है कि एक इंटरफ़ेस उन विधियों का एक सेट है जो "किसी विशेष वर्ग से संबंधित नहीं हैं" - कोई भी कक्षा इसे कार्यान्वित कर सकती है, जब तक यह उन विधियों को प्रदान करे।

तो, यदि कोई इंटरफ़ेस किसी विशेष वर्ग से संबंधित नहीं है, तो स्पष्ट रूप से किसी वर्ग के इंस्टेंस से संबंधित नहीं हो सकता है - है ना?

* नोट, जैसा कि @ ओउल्स्टेड बताता है, कक्षाओं के भीतर इंटरफेस को परिभाषित करने के तरीके हैं। लेकिन, आपके सिर को लपेटने के प्रयोजनों के लिए एक इंटरफेस क्या है (जो कि आप जिस पर काम कर रहे हैं), मैं अब उन संभावनाओं को अनदेखा कर दूंगा क्योंकि वे सामान्य रूप से इंटरफेस के उद्देश्य से विचलित हो जाते हैं और संभवतः अस्पष्ट हैं।

+0

इसके अलावा, मैं कहूंगा कि ओपी का उपयोग 'स्थिर' शब्द का उपयोग जावा 'इंटरफेस' के संदर्भ में सही/सटीक नहीं है। इंटरफेस एक शीर्ष-स्तरीय भाषा निर्माण है, लेकिन वे इस तरह से "स्थैतिक" नहीं हैं कि किसी विधि या फ़ील्ड को 'स्थैतिक' घोषित किया जा सकता है। – aroth

+0

हाँ, मैं इस बिंदु से पूरी तरह से सहमत हूं कि कक्षा के भीतर एक इंटरफेस का उपयोग करना - अकेले घोंसला वाले वर्ग को - अक्सर इस्तेमाल नहीं किया जाना चाहिए। –

+0

@ ड्रूमोरोर ने उस उत्तर को हटा दिया, यदि आप नेस्टेड कक्षाओं से निपटना चाहते हैं तो आप उन्हें अपने उत्तर में शामिल करना चाहेंगे। –

4

मेरे पास आंतरिक कक्षा के अंदर इंटरफ़ेस क्यों नहीं हो सकता है?

क्योंकि इंटरफेस परोक्ष स्थिर हैं: JLS §8.5.1:

एक सदस्य इंटरफेस परोक्ष स्थिर है (§9.1.1)। स्थिर इंटरफ़ेस को अनावश्यक रूप से निर्दिष्ट करने के लिए किसी सदस्य इंटरफ़ेस की घोषणा के लिए अनुमति है।

और आपके पास आंतरिक कक्षा में गैर-अंतिम स्थिरता नहीं हो सकती है।

वे स्पष्ट रूप से स्थिर क्यों हैं?

क्योंकि जिस तरह से उन्होंने इसे डिज़ाइन किया है।

मैं इन्हें आंतरिक कक्षाओं/स्थानीय कक्षाओं में क्यों घोषित नहीं कर सकता?

क्योंकि वे स्पष्ट रूप से स्थैतिक हैं।

हमारे इंटरफ़ेस में स्थिर अंतिम चर हो सकता है क्योंकि वे राज्य या किसी भी प्रकार के कार्यान्वयन को सही नहीं निर्दिष्ट करते हैं?

दाएं।

अगर हम स्थिर खो देते हैं और सिर्फ एक अंतिम उपयोग करते हैं, हम एक उदाहरण

अधिकार की जरूरत है।

जो कोई समझ नहीं आता है कि आप एक इंटरफ़ेस को तुरंत चालू नहीं कर सकते हैं।

हाँ आप कर सकते हैं। आप एक कक्षा को तुरंत चालू कर सकते हैं जो इंटरफ़ेस लागू करता है, या आप इसे विधि-स्थानीय अज्ञात कार्यान्वयन को तुरंत चालू कर सकते हैं। वास्तविक मुद्दा यहां इंटरफेस की एकाधिक विरासत है।

+0

थोड़ा सोचने के बाद, मुझे लगता है कि "मैं आंतरिक कक्षाओं/स्थानीय कक्षाओं में इन्हें क्यों घोषित नहीं कर सकता?" कम से कम नामित कक्षाओं के लिए भी "क्योंकि जिस तरह से उन्होंने इसे डिजाइन किया है" होना चाहिए। नाम स्थान संकलन समय पर है, इसलिए ऐसा करने के लिए कोई तकनीकी कारण नहीं है। अब नामस्थान के बिना स्थानीय वर्ग अधिक समस्याग्रस्त हो सकते हैं, उनके संदर्भ में कोई अच्छा तरीका नहीं होगा। –

0

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

हालांकि, आप एक नेस्टेड कक्षा के अंदर एक इंटरफेस कर सकते हैं। @owlstead जवाब देखें। 'स्थैतिक' कीवर्ड को 'आंतरिक वर्ग' की घोषणा पर रखकर, यह प्रथम श्रेणी का नागरिक बन जाता है, जो बाहरी वर्ग के बाहर से संदर्भित होता है और (अधिकतर) बाहरी वर्ग के संदर्भ से स्वतंत्र होता है। नेस्टेड कक्षाओं को बाहरी वर्ग के बाहर तुरंत चालू किया जा सकता है; आंतरिक कक्षाएं नहीं कर सकती हैं।

+0

"'आंतरिक वर्ग' की घोषणा पर 'स्थिर' कीवर्ड रखना" शब्दों में एक विरोधाभास है। आपका मतलब है 'नेस्टेड क्लास'। – EJP

3

वे [इंटरफेस] स्वाभाविक रूप से static क्यों हैं?

एक static और एक गैर static नेस्टेड वर्ग में उनके उदाहरणों enclosing उदाहरणों (युक्त वर्ग की) करने के लिए अंतर्निहित संदर्भ है या नहीं है के बीच का अंतर है, साथ ही युक्त दायरे से स्थानीय चर करने के लिए। जावा 8 से पहले, इंटरफ़ेस के लिए ऐसे अंतर्निहित संदर्भों का उपयोग करने का कोई तरीका नहीं था, क्योंकि एक इंटरफ़ेस किसी गैर-स्थैतिक फ़ील्ड को प्रारंभ नहीं कर सकता था या कोई विधि कार्यान्वयन प्रदान नहीं कर सका। (यह अभी भी गैर स्थैतिक क्षेत्रों को प्रारंभ नहीं कर सकता है, हालांकि अब यह डिफ़ॉल्ट विधि कार्यान्वयन प्रदान कर सकता है।) इसलिए जावा 8 से पहले, गैर-static नेस्टेड इंटरफ़ेस में कोई अर्थ नहीं था।

इसके अलावा, एक कार्यान्वयन दृष्टिकोण से, इन अंतर्निहित संदर्भों को भीतरी कक्षा में एक अतिरिक्त फ़ील्ड के रूप में लागू किया जाता है, और इन्हें आंतरिक वर्ग के निर्माता (इन क्षेत्रों को शुरू करने के लिए) के लिए अतिरिक्त तर्कों की भी आवश्यकता होती है। इंटरफेस में फ़ील्ड या कंस्ट्रक्टर नहीं हैं, इसलिए इसे लागू करने का कोई तरीका नहीं है।

(नोट: मैं आम तौर पर कार्यान्वयन के मामले में भाषा डिजाइन निर्णयों को समझने की कोशिश नहीं करता हूं, क्योंकि एक भाषा की सुविधा में कई अलग-अलग सही कार्यान्वयन हो सकते हैं। लेकिन मुझे लगता है कि यह एक ऐसा मामला है जहां कार्यान्वयन को समझने में मदद मिलती है विनिर्देश को समझें, इसलिए पिछले पैराग्राफ।)

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