2012-07-26 21 views
26
class Sub { 
    static int y; 
    public static void foo() { 
     this.y = 10; 
    } 
} 

मैं समझता हूँ कि this वस्तु विधि लागू प्रतिनिधित्व करता है और है कि स्थिर तरीकों किसी भी वस्तु के लिए बाध्य नहीं कर रहे हैं में उपयोग नहीं कर सकते क्यों 'इस' कीवर्ड। लेकिन उपर्युक्त मामले में, परिवर्तनीय वाई भी स्थिर है।हम एक स्थिर विधि

यदि हम कक्षा वस्तु पर स्थैतिक विधि का आह्वान कर सकते हैं, तो हम कक्षा के स्थैतिक चर सेट करने के लिए स्थिर विधियों को क्यों अनुमति नहीं दे सकते।

इस अतिरिक्त बाधा का उद्देश्य क्या है?

+0

मुझे एहसास है कि यह एक प्राचीन प्रश्न है लेकिन मैं इसे एक सुंदर वैध बिंदु के रूप में +1 करना चाहता हूं। यद्यपि खेतों के लिए उत्तर सरल है (क्वालीफायर आउट छोड़ें), स्थैतिक आंतरिक वर्गों के लिए यह प्रासंगिक हो जाता है, और यह भी प्रासंगिक होता है जब आप चाहते हैं कि कक्षा के रनटाइम इंस्टेंस का संदर्भ हो। उदाहरण के लिए मैं सिंगलटन क्लास प्राप्त करने के लिए 'MyClass.class' टाइप कर सकता हूं, लेकिन केवल 'वर्ग' स्वयं ही अमान्य है और ऐसा कोई काम नहीं है। इससे कक्षा के नाम को संभावित रूप से यूनिट के माध्यम से दोहराया जा सकता है जो बहुत शुष्क नहीं है। –

उत्तर

71

क्योंकि this ऑब्जेक्ट उदाहरण को संदर्भित करता है। स्थिर विधि के कॉल में कोई ऑब्जेक्ट उदाहरण नहीं है। लेकिन निश्चित रूप से आप अपने स्थिर क्षेत्र तक पहुंच सकते हैं (केवल स्थिर वाले!)। बस

class Sub { 
    static int y; 
    public static void foo() { 
     y = 10; 
    } 
} 

का उपयोग क्या आप वाकई स्थिर क्षेत्र y मिल बनाना चाहते हैं और न ही नाम के साथ कुछ स्थानीय चर, निर्दिष्ट करने के लिए वर्ग के नाम का उपयोग करें:

class Sub { 
    static int y; 
    public static void foo(int y) { 
     Sub.y = y; 
    } 
} 
+0

डाउनवॉटर ने सोचा होगा कि यह वास्तव में सवाल का जवाब नहीं देता है, क्योंकि आपने मूल रूप से ओपी पहले ही ज्ञात किया है और केवल एक ही प्रदान किया है वर्बोज़ वर्कअराउंड। यदि कक्षा को 'ThisClassHasAQuiteLongName' नाम दिया गया है, तो क्या क्लास को स्थिर तरीकों से' this' के रूप में संदर्भित करने के लिए यह अच्छा नहीं होगा? – xehpuk

+0

हालांकि यह वास्तव में सच नहीं है, मैंने एक स्पष्टीकरण प्रदान किया है कि क्यों 'इस' का उपयोग स्थिर तरीकों से नहीं किया जा सकता है (क्योंकि कक्षा का नाम देने के लिए कक्षा का कोई उदाहरण नहीं है) और खेतों तक पहुंचने के दो तरीके दिखाए गए हैं। वर्ग नाम के प्रतिस्थापन के रूप में एक स्थिर संदर्भ में 'this' का उपयोग करने में सक्षम होने के कारण मिस्लीडिंग और असंगत (कम से कम इमो) होगा। यद्यपि आपकी प्रतिक्रिया के लिए धन्यवाद, यह भी डाउनवॉट्स का कारण हो सकता है। – brimborium

+1

प्रश्न, जैसा कि मैंने इसे समझा और जिसे मैं भी जानना चाहता हूं, यही कारण है कि जावा वर्ग के अर्थ के लिए एक स्थिर संदर्भ में 'this' के अर्थ को अधिभारित नहीं करता है, इसलिए' Sub.y' की बजाय कोई इसे टाइप कर सकता है .y'। यह एक स्पष्ट डिजाइन पसंद की तरह प्रतीत होता है, क्योंकि यह कक्षा के नाम का स्पष्ट रूप से उल्लेख करने की आवश्यकता को समाप्त करता है, जो बदल सकता है। आम तौर पर, जब कोई पूछता है कि "x को क्यों परिभाषित किया गया है लेकिन एक अलग संदर्भ में ज़ेड भी नहीं है" यह संतोषजनक नहीं है, और वास्तव में थोड़े विषाक्त और उत्तर देने के लिए संवेदनात्मक है "क्योंकि यह वाई होना परिभाषित है।" यह मुझे सोचने के लिए गूंगा महसूस करता है, जैसा कि मैं अभी भी हूं। प्रतिक्रिया के लिए –

2

अपने कोड काम यह इस प्रकार लिख करने के लिए:

class Sub { 
    static int y; 
    public static void foo() { 
     Sub.y = 10; 
    } 
} 

आप स्थिर तरीकों में स्थिर क्षेत्रों सेट कर सकते हैं, लेकिन क्योंकि this की वर्तमान उदाहरण का प्रतिनिधित्व करता है आप स्थिर विधि में this लिए पहुँच नहीं है ऑब्जेक्ट, और एक स्थिर विधि में आपके पास कोई उदाहरण नहीं है।

+0

क्या आप यह बताने की परवाह करेंगे कि मेरे उत्तर की समस्या क्या है, या @ पीटर का जवाब क्या है? – tibtof

+0

आपके उत्तर में कुछ भी गलत नहीं है। इसे फिर से 0 पर रखा गया। (जो आपको क्रैपी वोटिंग-रेप सिस्टम ^^) के कारण कुल मिलाकर +8 प्रतिनिधि के साथ छोड़ देता है। – brimborium

2

इसका मतलब है "यह" ऑब्जेक्ट लेकिन कोई नहीं है। आपके मामले में आप क्लास नाम का उपयोग @tibtof के रूप में कर सकते हैं।

5

this ऑब्जेक्ट Sub ऑब्जेक्ट का इस उदाहरण का जिक्र कर रहा है। चूंकि विधि static है, Sub का उदाहरण नहीं है।

0

कीवर्ड "इस" संदर्भित करता है उस ऑब्जेक्ट पर जिसके साथ आप ऑपरेशन कर रहे हैं। आपके मामले में यह किसी भी गैर स्थैतिक विधियों या कन्स्ट्रक्टर के अंदर (यदि आपके पास एक है और यदि आप इसके अंदर "यह" उपयोग करते हैं), तो "यह" वर्ग उप के उस विशेष उदाहरण को संदर्भित करता है। इसलिए यह केवल तब लागू होता है जब यह लागू होता है वस्तु बनाई गई है। लेकिन किसी वर्ग के स्थिर संदर्भ में कुछ भी, आप इसके लिए ऑब्जेक्ट बनाने के बिना भी उपयोग कर सकते हैं क्योंकि इसे कक्षा लोडिंग के दौरान हल किया जाता है। "यह" केवल तभी हल किया जाता है जब ऑब्जेक्ट बनाया जाता है (आप गतिशील रूप से किस ऑब्जेक्ट के लिए कह सकते हैं)। तो "यह" स्थिर संदर्भ में समझ में आता है। आशा करता हूँ की ये काम करेगा। भगवान भला करे।

4

मुख्य कारण है कि हम उपयोग नहीं कर सकते "इस" स्थिर विधि संदर्भ में: -

इस: - "यह" वर्तमान वर्ग वस्तु का मतलब है, इसलिए इसकी स्पष्ट कर दिया कि "इस" केवल चित्र में एक बार आते हैं हम उस वर्ग का उद्देश्य बनाने का इरादा रखते थे।

स्थैतिक विधि: - स्थैतिक विधि का उपयोग करने के लिए ऑब्जेक्ट बनाने की कोई आवश्यकता नहीं है। का मतलब है "उदाहरण" या ऑब्जेक्ट सृजन जावा नियम के अनुसार "स्थैतिक" के साथ कोई समझ नहीं है।

तो अगर हम दोनों एक साथ (स्थिर और यह) दोनों का उपयोग करते हैं तो विरोधाभास होगा। यही कारण है कि हम स्थिर विधि में "यह" का उपयोग नहीं कर सकते हैं।

0

"यह" कीवर्ड केवल तभी लागू होता है जहां ऑब्जेक्ट का एक उदाहरण बनाया जाता है। और स्थैतिक विधि में कोई उदाहरण नहीं बनाया गया है क्योंकि स्थैतिक विधि वर्ग क्षेत्र से संबंधित है।

0

मैं उन सभी अन्य लोगों से सहमत हूं जिन्होंने मेरे सामने जवाब दिया था। मुझे इसका उत्तर देने के लिए अलग-अलग तरीके से आज़माएं:

मुझे लगता है, उदाहरण विधि/गैर स्थैतिक विधि किसी वर्ग के उदाहरण से संबंधित है (जिसका अर्थ है कि जल्दी या बाद में हमें इसे एक्सेस करने के लिए ऑब्जेक्ट रेफरी चाहिए) ताकि यह कीवर्ड अंदर समझ सके उदाहरण ब्लॉक या विधि। लेकिन किसी वर्ग के किसी भी सदस्य को स्थैतिक कीवर्ड को कक्षा में प्रत्यक्ष संपत्ति के रूप में व्याख्या किया जाता है, जिस पर एक वस्तु मौजूद होती है, उसके बाद इसका उपयोग होता है। तो स्थिर संदर्भ में यह सुनिश्चित नहीं है कि ऑब्जेक्ट कहीं मौजूद है। यही कारण है कि जावा में स्थिर क्षेत्र के अंदर इसका उपयोग करने की अनुमति नहीं है।

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