दिलचस्प पोस्ट
प्रतिबिंब का उपयोग कर तर्क नाम कैसे प्राप्त करें मुझे क्या करना चाहिए यदि दो लाइब्रेरी एक समान नाम के साथ एक फ़ंक्शन प्रदान करते हैं जो एक संघर्ष पैदा करता है? मैं पीडीएफ दस्तावेज़ को PHP में एक पूर्वावलोकन छवि में कैसे रूपांतरित कर सकता हूं? Google मानचित्र पर एक रेखा / पथ आरेखण करना ES6 वस्तुओं में तरीकों: तीर कार्यों का उपयोग करना क्या अजगर फ़ाइल एक्सटेंशन, .pyc .pyd .pyo स्टैंड के लिए क्या है? मैं एपीआई के माध्यम से गूगल ड्राइव पर फाइल कैसे बना / बना / डालने करूँ? माता-पिता की ऊँचाई को निर्दिष्ट किए बिना माता-पिता के div के 100% बच्चों को कैसे लागू करें? HTTP में "406 स्वीकार्य उत्तर नहीं" क्या है? जब कोई उपयोगकर्ता एक वेब पेज छोड़ता है, तो यह पता लगाने का सर्वोत्तम तरीका है? पीएचपी में फ्लोट की तुलना करें एक ArrayList का उपयोग कर एक ListView जनसंख्या? मैं एक निजी विधि को लागू करने के लिए प्रतिबिंब का उपयोग कैसे करूं? SQL सर्वर: MAX (DATE) के साथ केवल पंक्तियां चुनें मैक ओएस एक्स पर दिए गए टीसीपी पोर्ट पर कौन सुन रहा है?

"गैर-स्थिर विधि का एक स्थैतिक संदर्भ से संदर्भ नहीं किया जा सकता है" का पीछे क्या कारण है?

एक बहुत ही सामान्य शुरुआती गलती है जब आप उस क्लास का एक उदाहरण बनाने के बिना एक क्लास प्रॉपर्टी "स्टेटीली" का उपयोग करने का प्रयास करते हैं यह आपको बताए गए त्रुटि संदेश के साथ छोड़ देता है:

आप या तो गैर स्थैतिक विधि को स्थिर बना सकते हैं या उस गुण का उपयोग करने के लिए उस क्लास का एक उदाहरण बना सकते हैं।

क्यूं कर? मैं समाधान के लिए नहीं कह रहा हूं मैं जानना चाहता हूं कि इसके पीछे क्या कारण है। बहुत ही महत्वपूर्ण कारण!

private java.util.List<String> someMethod(){ /* Some Code */ return someList; } public static void main(String[] strArgs){ // The following statement causes the error. You know why.. java.util.List<String> someList = someMethod(); } 

वेब के समाधान से एकत्रित समाधान ""गैर-स्थिर विधि का एक स्थैतिक संदर्भ से संदर्भ नहीं किया जा सकता है" का पीछे क्या कारण है?"

आप ऐसा कुछ नहीं कॉल कर सकते हैं जो मौजूद नहीं है। चूंकि आपने कोई वस्तु नहीं बनाई है, इसलिए गैर-स्थिर विधि अभी तक मौजूद नहीं है। एक स्थिर विधि (परिभाषा के द्वारा) हमेशा मौजूद है

जिस पद्धति पर आप कॉल करने का प्रयास कर रहे हैं वह एक उदाहरण-स्तर विधि है; आपके पास एक उदाहरण नहीं है

static विधियां कक्षा से संबंधित हैं, गैर- static विधियां कक्षा के उदाहरण हैं।

ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग का सार तर्कसंगत जानकारी है जिसमें यह डेटा संचालित होता है।

उदाहरण के तरीके तर्क हैं, उदाहरण फ़ील्ड डेटा हैं साथ में, वे एक वस्तु बनाते हैं

 public class Foo { private String foo; public Foo(String foo){ this.foo = foo; } public getFoo(){ return this.foo; } public static void main(String[] args){ System.out.println( getFoo() ); } } 

उपरोक्त कार्यक्रम चलाने का क्या परिणाम हो सकता है?

किसी वस्तु के बिना, कोई उदाहरण डेटा नहीं है, और जब उदाहरण विधियां कक्षा परिभाषा के भाग के रूप में मौजूद होती हैं, तो उनके लिए डेटा प्रदान करने के लिए उन्हें एक वस्तु आवृत्ति की आवश्यकता होती है।

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

मुझे एहसास हुआ, मुझे लगता है कि लोगों को "स्थैतिक" की अवधारणा को बहुत जल्दी शुरू नहीं करना चाहिए।

सैद्धांतिक विधियां संभवतः आदर्श के बजाय अपवाद होना चाहिए। खासकर यदि आप ओओपी सीखना चाहते हैं, तो वैसे भी जल्दी। (नियम को अपवाद के साथ क्यों शुरू करें?) यह जावा के बहुत मुकाबला शैक्षणिक है, कि "पहले" चीज़ जिसे आप सीखना चाहिए वह सार्वजनिक स्थैतिक शून्य मुख्य चीज है (कुछ वास्तविक जावा अनुप्रयोगों का अपना मुख्य तरीका वैसे भी होता है।)

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

इसका अर्थ है कि जब आप एक इंस्टेंस विधि में होते हैं तो निम्नलिखित समतुल्य हैं:

 instanceMethod(); this.instanceMethod(); 

और ये भी बराबर हैं:

 ... = instanceField; ... = this.instanceField; 

कंपाइलर प्रभावी रूप से "यह" सम्मिलित कर रहा है। जब आप एक विशिष्ट उदाहरण प्रदान नहीं करते हैं

संकलक द्वारा "जादू की मदद" का थोड़ा सा नयाकरण कर सकता है: इसका मतलब है कि उदाहरण कॉल और स्थिर कॉल कभी-कभी एक ही वाक्यविन्यास दिखते हैं जबकि वास्तविकता में विभिन्न प्रकार की कॉलिंग और अंतर्निहित तंत्र हैं

उदाहरण पद्धति कॉल को कभी-कभी पॉलिमोर्फिज़्म का समर्थन करने वाले आभासी विधियों के व्यवहार की वजह से विधि अभिविन्यास या प्रेषण के रूप में जाना जाता है; प्रेषण व्यवहार तब भी होता है जब आप उपयोग करने के लिए एक स्पष्ट ऑब्जेक्ट उदाहरण लिखते हैं या कंपाइलर ने "यह।"

स्थैतिक विधि कॉल तंत्र सरल है, जैसे किसी गैर-ओपीपी भाषा में फ़ंक्शन कॉल।

निजी तौर पर, मुझे लगता है कि त्रुटि संदेश गुमराह करने वाला, यह "गैर-स्थिर विधि को एक स्थिर वस्तु उदाहरण निर्दिष्ट किए बिना एक स्थिर संदर्भ से संदर्भित नहीं किया जा सकता"

जवाब अब तक क्यों का वर्णन, लेकिन यहाँ एक और कुछ है जो आप पर विचार करना चाह सकते हैं:

आप विधिवत कॉलर को अपने कन्स्ट्रक्टर को जोड़कर एक तात्कालिक वर्ग से एक विधि कॉल कर सकते हैं,

 Object instance = new Constuctor().methodCall(); 

या

 primitive name = new Constuctor().methodCall(); 

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

कंपाइलर वास्तव में गैर-स्थिर विधियों के लिए एक तर्क जोड़ता है। यह एक this pointer/reference. This is also the reason why a static method can not use this जोड़ता है this pointer/reference. This is also the reason why a static method can not use this , क्योंकि कोई वस्तु नहीं है।

एक स्थिर विधि एक प्रकार की ऑब्जेक्ट से संबंधित है, जबकि गैर स्थैतिक पद्धति उस प्रकार के ऑब्जेक्ट के उदाहरण के लिए एक क्रिया से संबंधित है। आमतौर पर यह एक ऐसा तरीका है जो उदाहरण के संबंध में कुछ करता है।

उदाहरण के लिए:

क्लास कार में वॉश विधि हो सकती है, जो कि एक विशेष कार धोने का संकेत देती है, जबकि एक स्थिर विधि प्रकार कार पर लागू होती है

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

उदाहरण के लिए, रेशर में, एक गैर-स्थिर विधि का निर्माण करना जो वर्ग के किसी भी स्थिर सदस्य को संदर्भित नहीं करता है, चेतावनी संदेश बनाता है "यह विधि स्थिर बना सकती है"

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

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

तो आप एक बहुत ही महत्वपूर्ण कारण के लिए पूछ रहे हैं?

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

मेरी अंग्रेजी के लिए खेद है! मैं लैटिन हूँ!

एक गैर-स्थिर विधि ऑब्जेक्ट पर निर्भर है। ऑब्जेक्ट बनने के बाद यह प्रोग्राम द्वारा मान्यता प्राप्त है।

स्थैतिक तरीकों को किसी वस्तु के निर्माण से पहले भी कहा जा सकता है। तुलनात्मक या संचालन करने के लिए स्थैतिक तरीके बहुत बढ़िया हैं, जो वास्तविक वस्तुओं पर निर्भर नहीं हैं जिन्हें आप कार्य करने की योजना बनाते हैं।