दिलचस्प पोस्ट
सी / सी ++ में सामान्य वितरण के बाद यादृच्छिक संख्या उत्पन्न करें अजगर में एक सूची को बदलने के लिए कुशल तरीके से डायनामिक पसंद फ़ील्ड बनाना सी ++ 11 में लैम्ब्डा अभिव्यक्ति क्या है? तिथि सीमाओं के बीच तिथि उत्पन्न करें सूची समझ जनरेटर अभिव्यक्ति के अजीब timeit परिणाम बनाम? Clock_t प्रिंट करने के लिए printf का उपयोग करने का सही तरीका क्या है? डुप्लिकेट डिक्ट इन पायथन में सूची निकालें वीएस 2010 परियोजना के बाहरी उपयोग के लिए IIS एक्सप्रेस को कॉन्फ़िगर करें I एक अद्वितीय मशीन आईडी उत्पन्न फ़ाइल लॉक की जांच कैसे करें? क्या jQuery UI Datepicker शनिवार और रविवार (और छुट्टियों) को अक्षम करने के लिए बनाया जा सकता है? C # generic new () templated प्रकार के तर्कों को पारित करना पाठ / इनपुट बॉक्स के आस-पास सीमा (बाह्यरेखा) कैसे निकालें? (क्रोम) एजेक्स पोस्ट एएसपी। नेट एमवीसी में एंटीफ़ोर्जरीटोकन शामिल हैं

Laymans शर्तों में, 'स्थिर' जावा में क्या मतलब है?

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

वेब के समाधान से एकत्रित समाधान "Laymans शर्तों में, 'स्थिर' जावा में क्या मतलब है?"

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

public class Foo { public static void doStuff(){ // does stuff } } 

इसलिए, फ़ू का एक उदाहरण बनाने के बजाय और फिर इस तरह से doStuff बुला doStuff हैं:

 Foo f = new Foo(); f.doStuff(); 

आप सीधे विधि के खिलाफ कक्षा को कॉल करते हैं, जैसे:

 Foo.doStuff(); 

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

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

जावा एक ऑब्जेक्ट ओरिएंटेड भाषा है और डिफ़ॉल्ट रूप से आपके द्वारा लिखे जाने वाले अधिकांश कोड को ऑब्जेक्ट का उपयोग करने के लिए आवृत्त होना आवश्यक है।

 public class SomeObject { public int someField; public void someMethod() { }; public Class SomeInnerClass { }; } 

SomeField, someMethod, या SomeInnerClass का उपयोग करने के लिए मुझे पहले कुछ ऑब्जेक्ट का एक उदाहरण बनाना होगा

 public class SomeOtherObject { public void doSomeStuff() { SomeObject anInstance = new SomeObject(); anInstance.someField = 7; anInstance.someMethod(); //Non-static inner classes are usually not created outside of the //class instance so you don't normally see this syntax SomeInnerClass blah = anInstance.new SomeInnerClass(); } } 

अगर मैं उन चीजों को स्थिर घोषित करता हूं तो उन्हें एक संक्षिप्त उदाहरण की आवश्यकता नहीं होती है

 public class SomeObjectWithStaticStuff { public static int someField; public static void someMethod() { }; public static Class SomeInnerClass { }; } public class SomeOtherObject { public void doSomeStuff() { SomeObjectWithStaticStuff.someField = 7; SomeObjectWithStaticStuff.someMethod(); SomeObjectWithStaticStuff.SomeInnerClass blah = new SomeObjectWithStaticStuff.SomeInnerClass(); //Or you can also do this if your imports are correct SomeInnerClass blah2 = new SomeInnerClass(); } } 

कुछ स्थिर घोषित करने के कई प्रभाव हैं

सबसे पहले, आपके पूरे आवेदन में स्थिर फ़ील्ड के केवल एक ही मान हो सकता है

 public class SomeOtherObject { public void doSomeStuff() { //Two objects, two different values SomeObject instanceOne = new SomeObject(); SomeObject instanceTwo = new SomeObject(); instanceOne.someField = 7; instanceTwo.someField = 10; //Static object, only ever one value SomeObjectWithStaticStuff.someField = 7; SomeObjectWithStaticStuff.someField = 10; //Redefines the above set } } 

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

 public class SomeObjectWithStaticStuff { private int nonStaticField; private void nonStaticMethod() { }; public static void someStaticMethod() { nonStaticField = 7; //Not allowed this.nonStaticField = 7; //Not allowed, can never use *this* in static nonStaticMethod(); //Not allowed super.someSuperMethod(); //Not allowed, can never use *super* in static } public static class SomeStaticInnerClass { public void doStuff() { someStaticField = 7; //Not allowed nonStaticMethod(); //Not allowed someStaticMethod(); //This is ok } } } 

स्थैतिक कीवर्ड भी आंतरिक इंटरफेस, एनोटेशन, और एनोम पर लागू किया जा सकता है।

सार्वजनिक कक्षा SomeObject {सार्वजनिक स्थिर इंटरफेस SomeInterface {}; सार्वजनिक स्थैतिक @ इंन्टरफेस कुछअनोटेशन {}; सार्वजनिक स्थैतिक Enum SomeEnum {}; }

इन सभी मामलों में कीवर्ड बेमानी है और इसका कोई प्रभाव नहीं है। इंटरफेस, एनोटेशन, और एनमिक्स डिफ़ॉल्ट रूप से स्थिर हैं क्योंकि इन्हें इनर क्लास के साथ कोई संबंध नहीं है।

यह सिर्फ वर्णन करता है कि वे क्या कीवर्ड करते हैं यह वर्णन नहीं करता है कि कीवर्ड का उपयोग बुरा विचार है या नहीं। कि अन्य सवालों में और अधिक विस्तार से कवर किया जा सकता है जैसे कि कई स्थैतिक तरीकों का प्रयोग बुरी चीज है?

कीवर्ड स्थिर के कुछ कम सामान्य उपयोग भी हैं स्थिर आयात होते हैं जो आपको स्थिर प्रकार (इंटरफेस, एनोटेशन, और स्थिर रूप से स्थिर रूप से चिह्नित नहीं किए गए समेत) का उपयोग करने की अनुमति देते हैं।

 //SomeStaticThing.java public class SomeStaticThing { public static int StaticCounterOne = 0; } //SomeOtherStaticThing.java public class SomeOtherStaticThing { public static int StaticCounterTwo = 0; } //SomeOtherClass.java import static some.package.SomeStaticThing.*; import some.package.SomeOtherStaticThing.*; public class SomeOtherClass { public void doStuff() { StaticCounterOne++; //Ok StaticCounterTwo++; //Not ok SomeOtherStaticThing.StaticCounterTwo++; //Ok } } 

अंत में, स्थिर प्रारंभिक हैं, जो कि कोड के ब्लॉक होते हैं, जब वर्ग पहली बार लोड होता है (जो आमतौर पर केवल एक बार आवेदन में पहली बार के लिए प्रारंभ होता है) और (जैसे स्थैतिक तरीकों) गैर-स्थिर फ़ील्ड या तरीकों

 public class SomeObject { private static int x; static { x = 7; } } 

यदि यह आवश्यक हो, तो इससे अधिक विस्तार में जाने पर माफ़ी मांगी गई, मुझे एक और प्रश्न से यहां इस उत्तर को स्थानांतरित करने के लिए कहा गया था जहां विस्तार थोड़ा अधिक उपयुक्त था।

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

@ मिंकएमएम ने क्या बताया है इसके अलावा, एक स्थिर सदस्य क्लास स्तर पर है। इसलिए, उस सदस्य को उस वर्ग (जब कक्षा लोड की जाती है) के लिए एक बार जेएमवी द्वारा स्मृति में लोड किया जाता है। अर्थात्, उन वर्गों के उदाहरण के लिए लोड किए गए एक स्थैतिक सदस्य के उदाहरण नहीं हैं जो इसे संबंधित हैं।

उपरोक्त अंक सही हैं और मैं स्टेटिक कीवर्ड के बारे में कुछ और महत्वपूर्ण बिंदुओं को जोड़ना चाहता हूं।

आंतरिक रूप से हो रहा है जब आप स्थिर कीवर्ड का उपयोग कर रहे हैं तो वह स्थायी स्मृति में संग्रहित होगी (जो कि मेप मेमोरी में है ), हमें पता है कि दो प्रकार की मेमोरी वे स्टैक मेमोरी (अस्थायी स्मृति) और हेप मेमोरी (स्थायी मेमोरी) हैं, इसलिए यदि आप स्थिर कुंजी शब्द का उपयोग नहीं कर रहे हैं तो वह अस्थायी स्मृति में संग्रहीत होगी जो स्टैक मेमोरी में है (या आप उसे अस्थिर स्मृति के रूप में कॉल कर सकते हैं)।

तो आपको संदेह मिलेगा कि इस अधिकार का क्या उपयोग है ???

उदाहरण : स्थिर इंट ए = 10; (1 प्रोग्राम)

बस अब मैंने बताया कि अगर आप चर के लिए स्थिर कीवर्ड का इस्तेमाल करते हैं या विधि के लिए यह स्थायी स्मृति में संग्रहीत होगा

इसलिए मैंने दूसरे प्रोग्राम में स्थिर वैल्यू के साथ अन्य वैल्यू के साथ एक वैरिएबल घोषित किया।

उदाहरण : स्थिर इंट ए = 20; (2 प्रोग्राम)

वेरिएबल 'ए' को प्रोग्राम 1 द्वारा हीप मेमोरी में संग्रहीत किया जाता है। उसी स्थिर वैरिएबल 'ए' को प्रोग्राम 2 में मिला है, उस समय यह एक बार फिर 'ए' वैरिएबल नहीं बनाया गया है, जो कि इसके बजाय इसे वैल्यू बदलता है एक से 10 से 20 तक

सामान्य तौर पर यह स्टैक मेमोरी (अस्थायी स्मृति) में फिर से चर 'ए' बना देगा यदि आप 'ए' को स्थिर वैरिएबल घोषित नहीं करते हैं।

कुल मिलाकर मैं कह सकता हूं कि, यदि हम स्थिर कीवर्ड का उपयोग करते हैं
1. हम स्मृति को बचा सकते हैं
2. हम डुप्लिकेट से बच सकते हैं
3. वर्ग नाम की मदद से स्थिर वैरिएबल का उपयोग करने के लिए ऑब्जेक्ट बनाने की कोई ज़रूरत नहीं है, आप इसे एक्सेस कर सकते हैं।