दिलचस्प पोस्ट
जावा में फजी स्ट्रिंग सर्च लाइब्रेरी सी # में रीडोनली के रूप में क्षेत्र को चिह्नित करने के क्या लाभ हैं? पापेन () पाइप () + कांटा () की तरह द्विदिश पाइप बना सकते हैं? पसंद और = MYSQL में अंतर? क्या होता है जब आप ब्राउज़र में यूआरएल में टाइप करते हैं एक WPF कंटेनर के बच्चों को किस प्रकार से प्राप्त करें? एंड्रॉइड हैलो, गैलरी ट्यूटोरियल – "आर। स्टोलेबल का समाधान नहीं किया जा सकता" टैबिल डेटा के रूप में प्रिंटिंग सूचियां एसक्यूएल: क्वेरी के द्वारा डिफ़ॉल्ट ऑर्डर क्या है? IOS6 में, ViewController को स्टैक पर धक्का जाने पर कुछ इंटरफ़ेस ओरिएंटेशन को मजबूर करने में परेशानी होती है POST और PUT HTTP अनुरोध के बीच क्या अंतर है? संबंधित वस्तु कब जारी होती है? भार पर लारेवल / एलोक्युकेंट मॉडल में कस्टम विशेषता जोड़ें? आकार एनोटेशन के ऊपर जेफ्रीचर्ट श्रृंखला टूल टिप रैक कार्य के अंदर से रेक कार्यों को कैसे चलाएं?

गैर-स्थिर चर को एक स्थिर संदर्भ से संदर्भित नहीं किया जा सकता

मैंने यह परीक्षण कोड लिखा है:

class MyProgram { int count = 0; public static void main(String[] args) { System.out.println(count); } } 

लेकिन यह निम्न त्रुटि देता है:

 Main.java:6: error: non-static variable count cannot be referenced from a static context System.out.println(count); ^ 

मैं अपने वर्ग चर को पहचानने के लिए अपने तरीके कैसे प्राप्त करूं?

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

आपको एक क्लास और उस क्लास के उदाहरण के बीच का अंतर समझना चाहिए। यदि आप सड़क पर एक कार देखते हैं, तो आप तुरंत जानते हैं कि यह एक कार है, भले ही आप यह नहीं देख सकें कि कौन सा मॉडल या प्रकार। इसका कारण यह है कि आप जो वर्ग "कार" के साथ देखते हैं उससे तुलना करें वर्ग में सभी कारों के समान है। एक टेम्पलेट या एक विचार के रूप में इसे सोचो

उसी समय, आप जो कार देख रहे हैं वह "कार" वर्ग का एक उदाहरण है क्योंकि इसमें सभी गुण हैं जो आप उम्मीद करते हैं: कोई इसे गाड़ी चला रहा है, इसमें एक इंजन है, पहिये

तो क्लास "सभी कारों का एक रंग है" कहता है और उदाहरण बताता है कि "यह विशिष्ट कार लाल है"

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

स्टेटिक फ़ील्ड और तरीके सभी उदाहरणों के साथ साझा किए जाते हैं वे उन मूल्यों के लिए हैं जो कक्षा के लिए विशिष्ट हैं और विशिष्ट उदाहरण नहीं हैं विधियों के लिए, यह आम तौर पर वैश्विक सहायक विधियों (जैसे Integer.parseInt() ) हैं फ़ील्ड के लिए, यह आमतौर पर स्थिरांक है (जैसे कार प्रकार, अर्थात कुछ ऐसा जहां आपके पास एक सीमित सेट है जो अक्सर बदलता नहीं है)

अपनी समस्या को हल करने के लिए, आपको अपने क्लास का एक उदाहरण (वस्तु बनाएं) को इन्स्तांत करना होगा ताकि रनटाइम उदाहरण के लिए मेमोरी आरक्षित कर सके (अन्यथा, अलग-अलग उदाहरण एक दूसरे को अधिलेखित करेंगे जो आपको नहीं चाहिए)।

आपके मामले में, इस कोड को एक प्रारंभिक ब्लॉक के रूप में आज़माएं:

 public static void main (String[] args) { try { MyProgram7 obj = new MyProgram7 (); obj.run (args); } catch (Exception e) { e.printStackTrace (); } } // instance variables here public void run (String[] args) throws Exception { // put your code here } 

नई main() पद्धति में उस वर्ग का एक उदाहरण पैदा होता है (अजीब लगता है लेकिन जब से main() उदाहरण के बजाय वर्ग के साथ बनाया जाता है, तो यह ऐसा कर सकता है) और फिर एक उदाहरण विधि ( run() ) को कॉल करता है।

स्टेटिक फ़ील्ड और विधियां कक्षा से जुड़ी हुई हैं और इसके उदाहरण नहीं हैं। यदि आपके पास कक्षा A , एक 'सामान्य' विधि b , और एक स्थिर विधि c , और आप अपनी कक्षा A एक उदाहरण बनाते हैं, Ac() और ab() को कॉल मान्य हैं। विधि c() को पता नहीं है कि कौन सा उदाहरण कनेक्ट है, इसलिए यह गैर-स्थिर क्षेत्रों का उपयोग नहीं कर सकता है।

आपके लिए समाधान यह है कि आप या तो अपने खेतों स्थिर या आपके तरीकों को गैर-स्थिर बनाते हैं आप मुख्य इस तरह दिख सकते हैं:

 class Programm { public static void main(String[] args){ Programm programm = new Programm(); programm.start(); } public void start(){ // can now access non-static fields } } 

static कीवर्ड एक वर्ग के भीतर एक विधि या चर के जीवनचक्र को संशोधित करता है। एक static विधि या चर एक वर्ग लोड होने पर बनाए जाते हैं। एक विधि या चर जो static रूप में घोषित नहीं किया गया है, तभी बनाया जाता है जब क्लास को एक ऑब्जेक्ट के रूप में new ऑपरेटर का उपयोग करके इंस्टाल्ट किया जाता है।

एक वर्ग के जीवन चक्र, व्यापक रूप से, यह है:

  1. क्लास के लिए स्रोत कोड एक टेम्पलेट या पैटर्न या स्टाम्प बनाने के लिए लिखा जाता है, जिसे तब इस्तेमाल किया जा सकता है
  2. एक वास्तविक वस्तु के रूप में कक्षा का एक उदाहरण बनाने के लिए कक्षा का उपयोग करके new ऑपरेटर के साथ एक वस्तु बनाते हैं और फिर ऑब्जेक्ट के साथ किया जाता है
  3. कचरा संग्रह के दौरान स्मृति जैसे संसाधनों को पुन: प्राप्त करने वाले वस्तु को नष्ट कर दें।

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

नतीजा यह है कि जब आप अपने जावा एप्लिकेशन को कमांड लाइन से शुरू करते हैं जैसे कि java helloworld , तो कई तरह की कार्रवाई होती है। सबसे पहले एक जावा आभासी मशीन शुरू की और आरंभ किया गया है। आगे बढ़े हुए जावा कोड युक्त helloworld.class फ़ाइल को जावा वर्चुअल मशीन में लोड किया जाता है। फिर जावा आभासी मशीन एक विधि के लिए helloworld वर्ग में दिखती है जिसे main(String [] args) कहा जाता है main(String [] args) । यह विधि static होना चाहिए ताकि यह अस्तित्व में है, हालांकि कक्षा वास्तव में एक वस्तु के रूप में शुरू नहीं हुई है। जावा आभासी मशीन क्लास से ऑब्जेक्ट बनाकर क्लास का एक उदाहरण नहीं बनाती है। यह सिर्फ क्लास लोड करता है और main() विधि पर निष्पादन को प्रारंभ करता है।

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

हालांकि, उन वैरिएबल और क्लासेस की विधियां जो main() विधि के बाहर हैं, जो static मॉडिफ़र नहीं हैं, जब तक कि main() विधि main() विधि के भीतर एक वस्तु के रूप में क्लास का एक इंस्टेंस नहीं बनाया गया है। ऑब्जेक्ट बनाने के बाद आप फिर ऑब्जेक्ट के वेरिएबल्स और तरीके का उपयोग कर सकते हैं। क्लास के वेरिएबल्स और विधियों का उपयोग करने का प्रयास जो कक्षा के किसी ऑब्जेक्ट के माध्यम से बिना बिना static मॉडिफ़र के पास है, समय को संकलित करने पर जावा कंपाइलर द्वारा पकड़ा जाता है और एक त्रुटि के रूप में चिह्नित किया गया है।

 import java.io.*; class helloworld { int myInt; // this is a class variable that is unique to each object static int myInt2; // this is a class variable shared by all objects of this class static void main (String [] args) { // this is the main entry point for this Java application System.out.println ("Hello, World\n"); myInt2 = 14; // able to access the static int helloworld myWorld = new helloworld(); myWorld.myInt = 32; // able to access non-static through an object } } 

चलिए पहले अपने कार्यक्रम का विश्लेषण करें .. अपने कार्यक्रम में, आपकी पहली विधि main() , और इसे ध्यान में रखें कि यह स्थिर विधि है … फिर आप उस विधि के लिए स्थानीय चर की घोषणा करते हैं (तुलना करें, कम, उच्च, आदि) ।)। इस वैरिएबल का दायरा केवल घोषित विधि है, भले ही यह एक स्थैतिक या गैर स्थैतिक विधि होने के बावजूद हो। तो आप उस चर के बाहर उन चर का उपयोग नहीं कर सकते। यह मूल त्रुटि आपने बनाई है I

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

और आपके लिए सलाह है: आप चर और स्थैतिक कार्यात्मकताओं के दायरे के विचार को गलत समझा। उस बारे में स्पष्ट विचार प्राप्त करें

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

उन्हें अपने स्थैतिक तरीकों से एक्सेस करने में सक्षम होने के लिए उन्हें स्थैतिक सदस्य चर की जरूरत है, जैसे:

 public class MyProgram7 { static Scanner scan = new Scanner(System.in); static int compareCount = 0; static int low = 0; static int high = 0; static int mid = 0; static int key = 0; static Scanner temp; static int[]list; static String menu, outputString; static int option = 1; static boolean found = false; public static void main (String[]args) throws IOException { ... 

अब आप विधि के साथ उदाहरण जोड़ सकते हैं / उपयोग कर सकते हैं

 public class Myprogram7 { Scanner scan; int compareCount = 0; int low = 0; int high = 0; int mid = 0; int key = 0; Scanner temp; int[]list; String menu, outputString; int option = 1; boolean found = false; private void readLine() { } private void findkey() { } private void printCount() { } public static void main(String[] args){ Myprogram7 myprg=new Myprogram7(); myprg.readLine(); myprg.findkey(); myprg.printCount(); } } 

मैं आपको स्थिर चीजों को समझाने की कोशिश करूंगा पहले सभी स्थैतिक चर वर्ग के किसी विशेष उदाहरण से संबंधित नहीं हैं। वे कक्षा के नाम से पहचाने जाते हैं। स्थैतिक तरीकों फिर से किसी विशेष उदाहरण के लिए फिर से संबंधित नहीं है। वे केवल स्थैतिक चर तक पहुंच सकते हैं कल्पना करें कि आप MyClass.myMethod () कहते हैं और myMethod एक स्थिर तरीका है। यदि आप विधि के अंदर गैर-स्थिर चर का उपयोग करते हैं, तो पृथ्वी पर नरक कैसे पता चलेगा कि कौन सी चर का उपयोग करना है? यही कारण है कि आप स्थिर तरीकों से केवल स्थैतिक चर का उपयोग कर सकते हैं। मैं फिर से दोहराता हूं कि वे किसी विशेष उदाहरण से संबंधित नहीं हैं

  • पहली बात यह है कि कक्षा के एक उदाहरण और वर्ग के बीच में अंतर जानने के लिए। एक क्लास मॉडल कुछ गुण, और उन गुणों के संदर्भ में पूरे का व्यवहार एक उदाहरण उन गुणों के लिए विशिष्ट मान को परिभाषित करेगा

  • स्थिर कीवर्ड से जुड़ी कोई भी चीज़ कक्षा के एक उदाहरण के संदर्भ में बजाय कक्षा के संदर्भ में उपलब्ध है

  • उपरोक्त के लिए एक परिणाम के रूप में

    1. एक विधि के भीतर चर स्थिर नहीं हो सकते
    2. स्थैतिक फ़ील्ड और विधियों को क्लास-नाम जैसे MyProgram7.main (…) का उपयोग करके लागू किया जाना चाहिए।
  • एक स्थिर क्षेत्र / विधि का जीवनकाल आपके आवेदन के जीवनकाल के बराबर है

उदाहरण कहें, कार की संपत्ति का रंग है, और व्यवहार 'गति' दर्शाता है कार का एक उदाहरण 25kmph पर गति में एक लाल वोक्सवैगन बीटल होगा

अब कार की एक स्थिर संपत्ति सड़क पर पहियों (4) की संख्या होगी, और ये सभी कारों पर लागू होगी

HTH

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

| * | स्टेटिक: स्टैटिक आइटम को क्लास नाम के साथ बुलाया जा सकता है
यदि आप कोड में देख रहे हैं, तो कुछ फ़ंक्शन को सीधे क्लास के नाम से बुलाया जाता है जैसे कि

 NamCls.NamFnc(); System.out.println(); 

इसका कारण यह है कि उनके पास महत्वपूर्ण शब्द स्थिर का उपयोग करके नामफेंक और प्रिंटलाइन को घोषित किया जाएगा।

| * | गैर स्थैतिक: गैर स्थैतिक वस्तुओं को क्लास वेरिएबल के साथ बुलाया जा सकता है
यदि यह स्थिर नहीं है, तो आपको कक्षा के एक चर की आवश्यकता है,
क्लास चर के बाद डॉट रखें और
फिर फ़ंक्शन कॉल करें।

 NamCls NamObjVar = new NamCls(); NamObjVar.NamFnc(); 


नीचे कोड आपको बड़े करीने से बताता है

| * | कक्षा में स्थिर और गैर स्थिर कार्य:

 public class NamCls { public static void main(String[] args) { PlsPrnFnc("Tst Txt"); NamCls NamObjVar = new NamCls(); NamObjVar.PrnFnc("Tst Txt"); } static void PlsPrnFnc(String SrgPsgVal) { System.out.println(SrgPsgVal); } void PrnFnc(String SrgPsgVal) { System.out.println(SrgPsgVal); } } 


| * | एक कक्षा में स्थिर और गैर स्थैतिक कक्षा:

 public class NamCls { public static void main(String[] args) { NamTicCls NamTicVaj = new NamTicCls(); NamTicVaj.PrnFnc("Tst Txt"); NamCls NamObjVar = new NamCls(); NamNicCls NamNicVar = NamObjVar.new NamNicCls(); NamNicVar.PrnFnc("Tst Txt"); } static class NamTicCls { void PrnFnc(String SrgPsgVal) { System.out.println(SrgPsgVal); } } class NamNicCls { void PrnFnc(String SrgPsgVal) { System.out.println(SrgPsgVal); } } } 

क्लास लोडर कक्षा फ़ाइलों को लोड करने के लिए ज़िम्मेदार है। चलो देखते हैं कि जब हम अपनी कक्षाएं लिखते हैं तो क्या होता है।

उदाहरण 1:

 class StaticTest { static int a; int b; int c; } 

अब हम देख सकते हैं कि क्लास "स्टेटिक टेस्ट" में 3 फ़ील्ड हैं.लेकिन वास्तव में बी, सी सदस्य चर का अस्तित्व नहीं है। लेकिन क्यों ??? ओके लेस्ट्स देखें। यहाँ बी, सी उदाहरण आवृत्ति है। उदाहरण के तौर पर, वेरिएबल ऑब्जेक्ट सृजन के समय मेमोरी हो जाता है। तो यहां बी, सी अभी तक कोई मेमोरी नहीं मिल रही है यही कारण है कि बी, सी का कोई अस्तित्व नहीं है। तो एक का केवल अस्तित्व है। क्लासलोडर के लिए इसके बारे में केवल एक सूचना है क्लासलोडर अभी तक बी, सी को नहीं पहचानता है क्योंकि यह वस्तु अभी तक शुरु नहीं है

एक और उदाहरण देखें: उदाहरण 2:

 class StaticTest { public void display() { System.out.println("Static Test"); } public static void main(String []cmd) { display(); } } 

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

अब क्लास लोडर के लिए यह दिखता है:

 class StaticTest { public static void main(String []cmd) { display(); } } 

उदाहरण 2 सीई में त्रुटि इसलिए है क्योंकि हम एक स्थैतिक संदर्भ से गैर स्थिर विधि कहते हैं। इसलिए क्लास लोडर को समय के संकलन में विधि प्रदर्शन () को पहचानना संभव नहीं है। तो संकलन समय त्रुटि उत्पन्न होती है।