2010-04-15 13 views
80

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

+2

कौन सा स्थिर है? बहुत सारी statics हैं (उदा। एक गैर-संपूर्ण सूची http://mindprod.com/jgloss/static.html)। – kennytm

+0

@ फिलिप स्ट्रॉन्ग: स्थिर एक जावा idiosynchrasy है और जूरी अभी भी यह तय करने के लिए बाहर है कि 'स्थैतिक' ऑब्जेक्ट-ओरिएंटेड भाषा में है या नहीं;) – SyntaxT3rr0r

उत्तर

212

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

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

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

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

तुम बस विधि सीधे वर्ग के खिलाफ फोन है, तो जैसे:

Foo.doStuff(); 
+5

यह समझ में आता है! धन्यवाद। –

+14

यह भी उल्लेख किया जाना चाहिए कि कक्षा के सभी उदाहरणों द्वारा एक स्थिर क्षेत्र साझा किया जाता है, इस प्रकार सभी इसका एक ही मूल्य देखते हैं। –

+8

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

34

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

3

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

6

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

-4

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

आंतरिक

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

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

उदाहरण: स्थिर पूर्णांक एक = 10; (1 कार्यक्रम)

अभी मैं अगर तुम चर के लिए या विधि के लिए यह स्थायी स्मृति सही में स्टोर करेगा स्थिर कीवर्ड का उपयोग बताया।

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

उदाहरण: स्थिर पूर्णांक एक = 20, (2 कार्यक्रम)

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

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

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

+0

-1, प्रश्न शुरुआती शर्तों में कुछ ढूंढ रहा था। स्थायी, अस्थायी और अस्थिरता की यह बात वास्तव में एक शुरुआतकर्ता द्वारा समझा नहीं जा रहा है, और वास्तव में वैसे भी गलत है। – Martin

+0

वे बड़े शब्द मालिक नहीं हैं..वे समझ सकते हैं कि k.the को वास्तविक अंतर पता होना चाहिए कि मैंने उनका उल्लेख क्यों किया है। – sushanth

+3

वे बड़े शब्द नहीं हैं, लेकिन आप जो दावा कर रहे हैं वह जावा में पूरी तरह से झूठा है, और वैसे भी सवाल के लिए अप्रासंगिक है। – Martin

10

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

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

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

आदेश पहले SomeObject का एक उदाहरण बनाने के लिए 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 {}; }

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

यह सिर्फ वर्णन करता है कि वे क्या करते हैं। यह वर्णन नहीं करता है कि कीवर्ड का उपयोग एक बुरा विचार है या नहीं। इसे Is using a lot of static methods a bad thing?

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

//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 
    } 
} 

अन्त में, (जो आमतौर पर बस से पहले एक वर्ग एक आवेदन में पहली बार instantiated है) वहाँ स्थिर initializers जो कि जब वर्ग पहले भरी हुई है चलाए जा रहे हैं कोड के ब्लॉक कर रहे हैं और (जैसे स्थैतिक विधियां) गैर स्थैतिक क्षेत्रों या विधियों तक नहीं पहुंच सकते हैं।

public class SomeObject { 

    private static int x; 

    static { 
     x = 7; 
    } 
} 

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

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