2009-05-27 12 views
9

मैं जावा में प्रोग्राम शुरू कर रहा हूं।"स्थैतिक" क्या है?

public static void main(String[]args) 

एक पुस्तक ने कहा कि मुझे इस मामले में स्थैतिक उपयोग करना चाहिए, लेकिन स्पष्ट रूप से यह नहीं कहता कि मुझे क्यों चाहिए या इसका क्या अर्थ है।

क्या आप इसे स्पष्ट कर सकते हैं?

उत्तर

22

static की अवधारणा को कक्षा या ऑब्जेक्ट (उदाहरण) का हिस्सा है या नहीं।

main तरीका है जिसके static के रूप में घोषित किया जाता है के मामले में, यह कहना है कि main विधि एक वर्ग तरीका है - एक विधि है कि एक वर्ग है, नहीं एक वस्तु का हिस्सा का हिस्सा है। इसका मतलब है कि ClassName.method का जिक्र करते हुए एक और वर्ग किसी अन्य वर्ग की कक्षा विधि को कॉल कर सकता है। उदाहरण के लिए, लागू MyClass की रन विधि द्वारा पूरा किया जाएगा: दूसरी ओर, static आपरिवर्तक के बिना एक विधि या क्षेत्र पर

MyClass.main(new String[]{"parameter1", "parameter2"}); 

मतलब है कि यह एक वस्तु का हिस्सा है (या भी कहा जाता है "उदाहरण") और एक वर्ग का हिस्सा नहीं है।

MyClass c1 = new MyClass(); 
c1.getInfo()  // "getInfo" is an instance method of the object "c1" 
साथ

प्रत्येक उदाहरण के अलग-अलग मान सकता है के रूप में, एक विधि के मूल्यों या क्षेत्र: यह विशिष्ट वस्तु जो करने के लिए विधि या क्षेत्र के अंतर्गत आता है, बल्कि वर्ग के नाम से के नाम से जाना जाता है विभिन्न वस्तुओं में एक ही नाम जरूरी ही होना आवश्यक नहीं है:

MyClass c1 = getAnotherInstance(); 
MyClass c2 = getAnotherInstance(); 

c1.value  // The field "value" for "c1" contains 10. 
c2.value  // The field "value" for "c2" contains 12. 
      // Because "c1" and "c2" are different instances, and 
      // "value" is an instance field, they can contain different 
      // values. 

उदाहरण और वर्ग चर के दो अवधारणाओं का मेल। मान लीजिए कि हम एक नया वर्ग है जो दोनों उदाहरण और वर्ग चर और तरीकों में शामिल है की घोषणा करते हैं:

class AnotherClass { 
    private int instanceVariable; 
    private static int classVariable = 42; 

    public int getInstanceVariable() { 
     return instanceVariable; 
    } 

    public static int getClassVariable() { 
     return classVariable; 
    } 

    public AnotherClass(int i) { 
     instanceVariable = i; 
    } 
} 

ऊपर वर्ग एक उदाहरण चर instanceVariable, और एक वर्ग चर classVariable जो एक static संशोधक के साथ घोषित किया जाता है है। इसी प्रकार, मूल्यों को पुनर्प्राप्त करने के लिए एक उदाहरण और कक्षा विधि है।

उदाहरण के लिए कन्स्ट्रक्टर आवृत्ति चर को तर्क के रूप में असाइन करने के लिए एक मान लेता है। क्लास वेरिएबल को 42 के रूप में प्रारंभ किया गया है और कभी नहीं बदला गया है।

AnotherClass ac1 = new AnotherClass(10); 

ac1.getInstanceVariable();    // Returns "10" 
AnotherClass.getClassVariable();  // Returns "42" 

सूचना अलग अलग तरीकों से वर्ग और उदाहरण तरीकों कहा जाता है:

वास्तव में ऊपर वर्ग का उपयोग करें और देखें कि क्या होता है। जिस तरह से वे कक्षा को AnotherClass नाम से संदर्भित करते हैं, या ac1 नाम से उदाहरण। आगे जाने के लिए और तरीकों के व्यवहार मतभेद देखते हैं:

AnotherClass ac1 = new AnotherClass(10); 
AnotherClass ac2 = new AnotherClass(20); 

ac1.getInstanceVariable();    // Returns "10" 
AnotherClass.getClassVariable();  // Returns "42" 
ac2.getInstanceVariable();    // Returns "20" 
AnotherClass.getClassVariable();  // Returns "42" 

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

दूसरी तरफ एक वर्ग चर उस पूरे वर्ग के लिए अद्वितीय है।

public int getClassVariableFromInstance() { 
    return classVariable; 
} 

फिर, चलाने के निम्नलिखित:

AnotherClass ac1 = new AnotherClass(10); 
AnotherClass ac2 = new AnotherClass(20); 

ac1.getInstanceVariable();    // Returns "10" 
ac1.getClassVariableFromInstance(); // Returns "42" 
ac2.getInstanceVariable();    // Returns "20" 
ac2.getClassVariableFromInstance(); // Returns "42" 

हालांकि getClassVariableFromInstance एक उदाहरण विधि है, के रूप में किया जा रहा द्वारा देखा जा सकता और भी बेहतर भर में इस बिंदु पाने के लिए, के AnotherClass करने के लिए एक नई विधि जोड़ें उदाहरण ac1 और ac2 के संदर्भ में आह्वान किया गया, वे दोनों एक ही मूल्य, 42 लौटते हैं। ऐसा इसलिए है क्योंकि दोनों उदाहरण विधियों में, वे क्लास विधि classVariable का उल्लेख करते हैं जो कक्षा के लिए अद्वितीय है, उदाहरण के लिए नहीं - कक्षा AnotherClass कक्षा के लिए classVariable की केवल एक ही प्रति है।

मुझे आशा है कि कुछ लोग यह बताते हैं कि static संशोधक के लिए क्या उपयोग किया जाता है।

The Java Tutorials सूर्य से Understanding Instance and Class Members नामक एक अनुभाग है, जो दो प्रकार के चर और विधियों में भी जाता है।

+0

बहुत अच्छी व्याख्या। – Zaki

+0

धन्यवाद एसओओ इसके लिए बहुत कुछ, इसने मेरे दिमाग में स्थिर कीवर्ड चमक दिया;) – Dayan

10

कृपया Wikipedia

उदाहरण के लिए एक अच्छा विवरण देखने के, ध्यान दें कि किस गणित कक्षा में, आप

Math.Abs(x); 

तरह बातें कह सकते हैं कहने के लिए

Math m = new Math(); 

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

Employee e = new Employee(); 
e.Terminate(); 
2

एक स्थिर विधि वर्ग के लिए एक पूरी, नहीं किसी विशेष सदस्य लागू होने से एक है। .goExtinct() पूरी तरह से बतख जनसंख्या का एक तरीका होगा, कोई विशेष बतख नहीं। मुख्य सार्वजनिक और स्थैतिक है क्योंकि हमेशा उपलब्ध होना है, और यह किसी भी विशेष वर्ग का हिस्सा नहीं है।

0

किसी ऑब्जेक्ट उन्मुख प्रोग्रामिंग भाषा जैसे जावा या सी ++ में आप कक्षाएं बनाते हैं जो बहुत ही बुनियादी स्तर पर एक इमारत के ब्लूप्रिंट की तरह हैं। आप एक ब्लूप्रिंट देख सकते हैं और यह निर्धारित कर सकते हैं कि विभिन्न घटक कैसे जुड़े हुए हैं लेकिन आप वास्तव में इसमें नहीं रह सकते हैं। कक्षाओं और वस्तु के साथ यह वही है। कक्षाएं ब्लूप्रिंट हैं और आप एक वर्ग का उदाहरण बनाते हैं जिसे ऑब्जेक्ट कहा जाता है। उसी ब्लूप्रिंट के लिए आपके पास कई भवन हो सकते हैं, वैसे ही एक वर्ग के लिए आप कई ऑब्जेक्ट्स प्राप्त कर सकते हैं। एक वस्तु एक वर्ग का एक उदाहरण है। किसी वर्ग में प्रत्येक विधि को किसी ऑब्जेक्ट या किसी क्लास के उदाहरण पर कॉल किया जा सकता है, जबकि स्थैतिक तरीकों को कॉल करने के लिए आपको वास्तव में किसी उदाहरण की आवश्यकता नहीं होती है, तो आप वास्तव में कक्षा के उदाहरण के बिना ClassName.method() को कॉल कर सकते हैं।

1

आमतौर पर, आप एक वस्तु, एक वर्ग का एक उदाहरण है, ताकि उस पर तरीकों कॉल करने के लिए में होना चाहिए, कम से कम दो कारणों के लिए:

  1. यह वस्तु जो वर्ग पर निर्भर करता है लागू करता विधि कहा जा रहा है उदाहरण के लिए यदि आपके पास उप-वर्ग का उदाहरण है, तो उपclass में विधि को इसके बजाय कॉल किया जाएगा, भले ही विधि कॉल करने वाला कोड समान है।
  2. ऑब्जेक्ट्स में आमतौर पर आंतरिक स्थिति (फ़ील्ड) होती है, जो विधियों का उल्लेख कर सकते हैं। यदि कोई वस्तु उदाहरण नहीं है तो यह काम नहीं करता है।

आप क्लास 'निर्माता को फोन करके वस्तु उदाहरण बना:

MyObject a = new MyObject(); 

स्टेटिक तरीकों तरीकों कि उदाहरणों वस्तु से जुड़ी नहीं हैं। उन्हें कक्षा का नाम देकर बुलाया जा सकता है। इस के परिणामस्वरूप वे

  1. गतिशील उपवर्गों के लिए भेजा नहीं किया जा सकता है (जो कारण है कि आप एक warning when you try to call it on object instances मिलता है, वह यह है कि सिर्फ भ्रामक वाक्य रचना)
  2. वे cannot refer to instance state (गैर स्थिर क्षेत्रों और अन्य गैर स्थिर विधि) ।

कई लोग स्थैतिक तरीकों को खराब डिजाइन पैटर्न मानते हैं, और उन्हें उपयोग करने की सलाह नहीं देते हैं (public static void main को छोड़कर) वैकल्पिक के लिए सिंगलटन इंस्टेंस पैटर्न देखें।

1

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

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

यदि आप देखना चाहते हैं कि जावा प्रोग्राम के निष्पादन के दौरान कौन से वर्ग लोड किए जा रहे हैं तो आप -verbose: class कमांड लाइन विकल्प का उपयोग कर सकते हैं।

0

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

Static field: 

एक क्षेत्र है कि स्थिर कीवर्ड के साथ घोषित की इस तरह,: स्थिर सदस्यों के दो प्रकार के स्थिर क्षेत्रों और स्थिर तरीके हैं

private static int ballCount: 

स्थिर कीवर्ड की स्थिति के साथ परस्पर विनिमय है दृश्यता कीवर्ड की स्थिति (निजी और सार्वजनिक, साथ ही संरक्षित)। नतीजतन, निम्नलिखित बयान, काम करता है भी:

static private int ballCount; 

एक सम्मेलन के रूप में, सबसे प्रोग्रामर पहले दृश्यता कीवर्ड डाल देते हैं।

कक्षा के सभी उदाहरणों में एक स्थिर क्षेत्र का मूल्य समान है। दूसरे शब्दों में, यदि किसी वर्ग में कंपनी नाम का एक स्थिर क्षेत्र है, तो कक्षा से बनाए गए सभी ऑब्जेक्ट्स के पास कंपनी नाम के लिए समान मूल्य होगा।

स्थिर फ़ील्ड बनाए जाते हैं और कक्षा को पहली बार लोड होने पर प्रारंभ किया जाता है। ऐसा तब होता है जब कक्षा के एक स्थिर सदस्य को संदर्भित किया जाता है या जब कक्षा का एक उदाहरण बनाया जाता है, जो भी पहले आता है।

Static method: 

स्थिर कीवर्ड के साथ घोषित एक विधि। स्थैतिक क्षेत्रों की तरह, स्थैतिक विधियां कक्षा से ही जुड़ी होती हैं, न कि कक्षा से बनाए गए किसी भी विशेष वस्तु के साथ। नतीजतन, कक्षा से परिभाषित स्थिर तरीकों का उपयोग करने से पहले, आपको कक्षा से ऑब्जेक्ट बनाने की आवश्यकता नहीं है।

सबसे प्रसिद्ध स्थैतिक विधि मुख्य है, जिसे जावा रनटाइम द्वारा एप्लिकेशन शुरू करने के लिए कहा जाता है। मुख्य विधि स्थैतिक होना चाहिए, जिसका अर्थ है कि अनुप्रयोग डिफ़ॉल्ट रूप से स्थिर संदर्भ में चलते हैं।

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

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