कई प्रोग्रामर त्रुटि संदेश का सामना करते हैं 'गैर स्थैतिक विधि को स्थिर संदर्भ से संदर्भित नहीं किया जा सकता ' जब वे कोडिंग कर रहे होते हैं। यह त्रुटि संदेश विशिष्ट नहीं है और किसी भी IDE में हो सकता है यदि त्रुटि के लिए शर्तें सही हैं।
शुरुआती लोगों के लिए यह एक बहुत ही सामान्य गलती है जहां प्रोग्रामर कक्षा का उदाहरण बनाए बिना 'स्थैतिक रूप से' कक्षा का उपयोग करने का प्रयास करता है। ऐसी कई शर्तें हैं जिन्हें पूरा किया जाना चाहिए जब आप एक स्थिर वर्ग का उपयोग कर रहे हों। इस लेख में, हम कई अलग-अलग मामलों को देखेंगे और आपको एक स्थिर वर्ग का उपयोग करने के तरीके के बारे में मार्गदर्शन करेंगे।
स्थिर विधि क्या है?
किसी भी विधि में 'स्थैतिक' शब्द जोड़ने से वह विधि स्थिर विधि कहलाती है। एक स्थिर विधि किसी वस्तु से संबंधित होने के बजाय कक्षा से संबंधित होती है (जो कि आदर्श है)। एक वर्ग का उदाहरण बनाने की शर्त के बिना एक स्थिर विधि को आसानी से लागू किया जा सकता है।
स्टेटिक विधियों के कई अलग-अलग उपयोग हैं, उदाहरण के लिए, इसका उपयोग करके, आप एक स्थिर डेटा सदस्य और उसके मूल्य को बदल सकते हैं। हालाँकि, स्थिर विधि का उपयोग करते समय अभी भी कुछ सीमाएँ हैं। उदाहरण के लिए, यदि आप अपनी कक्षा के गैर-स्थिर क्षेत्रों तक पहुँच प्राप्त करना चाहते हैं, तो आपको एक गैर-स्थैतिक विधि का उपयोग करना चाहिए। तो संक्षेप में, स्थैतिक विधियों का बहुत ही कम उपयोग किया जाता है लेकिन उनके अपने फायदे हैं।
यहां एक संक्षिप्त उदाहरण दिया गया है कि कैसे सभी वस्तुओं की संपत्ति को बदलने के लिए एक स्थिर विधि बनाई जा सकती है।
class Students{ int roll_no; String name; static String college = "InformationTech"; static void change(){ college = “Management"; } Students (int number, String name_self){ roll_no = number; name = name_self; } void display (){System.out.println(rollno+" "+name+" "+college);} public static void main(String args[]){ Students.change(); Students stu_1 = new Students (100,"Mexican"); Students stu_2 = new Students (202,"American"); Students stu_3 = new Students (309,"British"); stu_1.display(); stu_2.display(); stu_3.display(); } }
कार्यक्रम का आउटपुट होगा:
100 Mexican Management 202 American Management 309 British Management
कक्षा और कक्षा के उदाहरण में क्या अंतर है?
सोचें कि आप सड़क पर चल रहे हैं और आपको एक कार दिखाई दे रही है। अब आप तुरंत जान गए हैं कि यह एक कार है, भले ही आप नहीं जानते कि इसका मॉडल या प्रकार क्या है। ऐसा इसलिए है क्योंकि आप जानते हैं कि यह उन 'कारों' की श्रेणी से संबंधित है जिनके बारे में आप पहले से जानते हैं। यहाँ कक्षा को एक टेम्पलेट या एक विचार के रूप में सोचें।
अब जैसे-जैसे आप करीब जाते हैं, आप कार का मॉडल और मेक देखते हैं। यहां आप 'कार' वर्ग के 'उदाहरण' को पहचान रहे हैं। यहां सभी गुण विस्तार से मौजूद होंगे; पहिए, अश्वशक्ति, रिम आदि।
गुणों का एक उदाहरण यह हो सकता है कि 'कार' वर्ग कहता है कि सभी कारों में पहिए होने चाहिए। जिस कार को आप देख रहे हैं (कार क्लास का एक उदाहरण) में अलॉय रिम हैं।
ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग में, आप स्वयं कक्षा को परिभाषित करते हैं और कक्षा के अंदर, आप 'रंग' प्रकार के क्षेत्र को परिभाषित करते हैं। जब भी कक्षा को इंस्टेंट किया जाता है, तो मेमोरी बैकएंड पर रंग के लिए स्वचालित रूप से आरक्षित हो जाती है और बाद में, आप इसे एक विशिष्ट मान दे सकते हैं (उदाहरण के लिए लाल)। चूँकि इस तरह की विशेषताएँ विशिष्ट होती हैं, इसलिए वे स्थिर नहीं होती हैं।
इसके विपरीत, स्थिर विधियों और क्षेत्रों को सभी उदाहरणों के साथ साझा किया जाता है। ये मूल्य या वस्तुओं के लिए बने होते हैं जो वर्ग के लिए विशिष्ट होते हैं न कि उदाहरण के लिए। विधियों के लिए, वैश्विक तरीके हो सकते हैं (उदाहरण के लिए, stringtoInt कनवर्टर) और फ़ील्ड के लिए, वे आमतौर पर आपके कोड के अनुसार स्थिरांक होते हैं (उदाहरण के लिए, कार का प्रकार स्थिर हो सकता है यदि आप केवल सामान्य कारों का निर्माण कर रहे हैं)।
अब, हम उन सभी अलग-अलग मामलों को देखेंगे जहां आपकी कोडिंग गलत हो सकती है और उन्हें ठीक करने के उपाय देखेंगे।
समस्या 1:आप किसी ऐसी चीज़ को कॉल कर रहे हैं जो मौजूद नहीं है
हमारे सामने कुछ ऐसे मामले आए जहां उपयोगकर्ता एक दूसरे के साथ स्थिर और गैर-स्थिर दोनों तरीकों का उपयोग कर रहे थे। जब हम ऐसा करते हैं, तो आपको सावधान रहना चाहिए कि कौन सी विधि कॉल कर रही है (स्थैतिक या नहीं के संदर्भ में)। निम्नलिखित कोड पर एक नज़र डालें:
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(); }
यहां, स्थिर विधि someMethod को कॉल कर रही है। ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग में, हम डेटा को उस डेटा के साथ एनकैप्सुलेट करते हैं, जिस पर हम काम करना चाहते हैं। यहां, ऑब्जेक्ट के बिना, कोई इंस्टेंस डेटा नहीं होता है और जबकि इंस्टेंस मेथड्स क्लास डेफिनिशन के हिस्से के रूप में मौजूद होते हैं, उन्हें डेटा प्रदान करने के लिए हमेशा एक ऑब्जेक्ट इंस्टेंस होना चाहिए।
तो संक्षेप में, आप कुछ ऐसा नहीं कह सकते जो अस्तित्व में नहीं है। चूंकि आपने कोई ऑब्जेक्ट नहीं बनाया होगा, गैर-स्थैतिक विधि अभी तक मौजूद नहीं है। हालांकि, दूसरी ओर, एक स्थिर विधि हमेशा मौजूद रहेगी (परिभाषा के कारण)।
समस्या 2:विधियों को स्थिर नहीं बनाया जाता है
यदि आप विधियों का एक उदाहरण बनाए बिना अपनी स्टेटिक मुख्य विधि से विधियों का आह्वान कर रहे हैं, तो आपको एक त्रुटि संदेश मिलेगा। यहाँ, वही सिद्धांत लागू होता है; आप किसी ऐसी चीज़ तक नहीं पहुँच सकते जो मौजूद नहीं है।
public class BookStoreApp2 { //constants for options Scanner input = new Scanner (System.in); public static void main(String[] args) { BookStoreItem[] item;//declaring array item = new BookStoreItem[10];//initializing array int itemType = -1; printMenu(); getUserChoice(); for (int i = 0; i < item.length; i++){ }//end of switch statement }//end of for loop for (int i = 0; i < item.length; i++) { }//end of for }//end of main method
यहां इस कोड में, आपको दोनों विधियों को परिवर्तित करने की आवश्यकता है printMenu() और getUserChoice() स्थिर तरीकों में।
इसलिए यदि आप इस तरह की स्थिति से बचना चाहते हैं, तो आप कन्स्ट्रक्टर . का उपयोग कर सकते हैं बजाय। उदाहरण के लिए, आप अपनी मुख्य () विधि की सामग्री ले सकते हैं और उन्हें एक कंस्ट्रक्टर के अंदर रख सकते हैं।
public BookStoreApp2() { // Put contents of main method here} After doing this, do the following inside your main() method: public void main( String[] args ) { new BookStoreApp2(); }
यदि ये युक्तियाँ आपके काम नहीं करती हैं या आपका कोड अलग है, तो आपको स्टेटिक कक्षाओं और विधियों के मूल सिद्धांतों को ध्यान में रखना चाहिए और यह सुनिश्चित करने के लिए अपने कोड की दोबारा जांच करनी चाहिए कि मूल सिद्धांत का उल्लंघन तो नहीं हो रहा है।