2010-08-05 20 views
7

मैं कई बार इस समस्या में भाग रहा हूं और मुझे यह जानने के लिए कभी परेशान नहीं हुआ कि यह क्यों हो रहा है और सीखें कि "स्थिर" वास्तव में क्या है। मैंने बस उस परिवर्तन को लागू किया जो ग्रहण ने सुझाव दिया और आगे बढ़े।जावा में "वैश्विक" चर घोषित करते समय "स्थैतिक" का क्या अर्थ है?

public class Member { 

// Global Variables 
int iNumVertices; 
int iNumEdges; 

public static void main(String[] args) { 

    // do stuff 

    iNumVertices = 0; // Cannot make a static reference to the non-static field iNumVertices 

    // do more stuff 

} // main end 
} 

तो ग्रहण मुझसे कहता है static int iNumVertices; करने के लिए और मुझे यकीन है कि क्यों नहीं कर रहा हूँ। तो वास्तव में "स्थैतिक" क्या है, इसका उपयोग कैसे किया जाता है, "स्थैतिक" का उपयोग करने का उद्देश्य क्या है, और यह मुझे यह समस्या क्यों दे रहा है?

+4

वे वैश्विक चर नहीं हैं। वे भी सार्वजनिक नहीं हैं। भले ही वे सार्वजनिक थे, वे वैश्विक चर नहीं होंगे। भले ही वे सार्वजनिक और स्थैतिक थे, वे वैश्विक चर नहीं होंगे। जावा में वैश्विक की अवधारणा नहीं है। ** सब कुछ ** या तो स्थानीय रूप से या कक्षा या इंटरफेस में घोषित किया जाता है। –

+0

@ मार्क ... मुझे खेद है? मुझे इन तथ्यों से अवगत नहीं था। स्पष्टीकरण के लिए धन्यवाद। तो आप उन्हें वर्गीकृत कैसे करेंगे? – Hristo

+0

@Hristo: मुझे लगता है कि "सदस्य चर" सही शब्द है। – torak

उत्तर

9

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

यहाँ एक संशोधित संस्करण है:

public class Member { 
    // Fields 
    private int iNumVertices; 
    private int iNumEdges; 

    public Member(){ 
     // init the class 
    } 

    public static void main(String[] args) { 
     Member member = new Member(); 
     member.iNumVertices = 0; 
     // do more stuff 
    } 
} 

खुद ढूँढना वैश्विक स्टैटिक्स बनाने आप के लिए एक संकेत है कि आप कैसे आप कुछ डिज़ाइन कर रहे हैं के बारे में ध्यान से सोचना चाहिए। यह हमेशा गलत नहीं है, लेकिन आपको यह बताना चाहिए कि आप क्या कर रहे हैं।

+0

ओह ... मैं देखता हूं। यह काफी काम की बात है। आपने 2 वैश्विक चर निजी बनाने का फैसला क्यों किया? क्या ऐसा इसलिए है क्योंकि वे सदस्य वर्ग से संबंधित हैं और केवल सदस्य वस्तुओं द्वारा ही पहुंचा जाना चाहिए? – Hristo

+3

यह सब कुछ निजी बनाने के लिए सबसे अच्छा अभ्यास है जिसे बाहर से एक्सेस करने की आवश्यकता नहीं है, यहां तक ​​कि केवल एक वर्ग के साथ एक छोटी परीक्षा परियोजना में भी। – f1sh

+2

@Hristo यह मेरा विश्वास है कि सामान्य रूप से, प्रत्येक आवृत्ति परिवर्तनीय (फ़ील्ड, गुण, और कुछ अन्य नाम भी कहा जाता है) निजी होना चाहिए। आप जितनी संभव हो सके अपनी कक्षा के आंतरिक कार्यों के बारे में खुलासा करना चाहते हैं। इससे आपको अपनी कक्षा को अधिक अनुमानित बनाने में मदद मिलती है क्योंकि आपके पास किसी और को आपकी कक्षा की स्थिति को संशोधित नहीं किया जाएगा। जब आप अपने कोड में एक बग फिक्स कर रहे हों तो सड़क के नीचे 6 महीने, यदि आप उन्हें निजी रखते हैं तो आपको अपने चर बदलने के बारे में 5 अन्य फाइलों की चिंता करने की आवश्यकता नहीं होगी। –

2

स्टेटिक चर वर्ग वर्ग चर हैं। उस चर की एक प्रतिलिपि कक्षा के सभी उदाहरणों के लिए उपलब्ध होगी और वे उस चर को साझा करेंगे। कक्षा के विशिष्ट उदाहरण को संदर्भित किए बिना स्टेटिक सदस्यों का भी उपयोग किया जा सकता है।

अधिक यहाँ:

http://download.oracle.com/javase/tutorial/java/javaOO/classvars.html

1

स्थैतिक चर एक गैर स्थैतिक चर आप का उपयोग करने की कोशिश कर रहे हैं अगर एक स्थिर संदर्भ के रूप में आप वर्ग क्रम में instantiated जा पहुँचा जा करने के लिए की जरूरत नहीं है, इसलिए कुछ ऐसी चीज तक पहुंचने का प्रयास कर रहा है जिसे प्रारंभ/तत्काल नहीं किया गया है।

0

कक्षा के सभी उदाहरणों के लिए स्थैतिक चर आम हैं।

नोट: जैसा कि पहले कहा गया था कि ये वर्ग चर हैं यानी सभी उदाहरणों से साझा किया गया है।

इन्हें कक्षा स्तर चर के रूप में भी कहा जा सकता है। आम तौर पर आप कॉन्स्टेंट को परिभाषित करते हैं (आपको स्थिरांक को परिभाषित करने के लिए अंतिम कीवर्ड की भी आवश्यकता होगी) और वैश्विक चर स्थिर के रूप में।

अधिक जानकारी के लिए देखें: http://download.oracle.com/javase/tutorial/java/javaOO/classvars.html

http://www.roseindia.net/java/beginners/staticvariable.shtml

0

हर वर्ग चर (एक चर विधि निकायों वर्ग शरीर के भीतर और बाहर की घोषणा की) एक स्थिर विधि में इस्तेमाल भी स्थिर घोषित किया जाना चाहिए।

उस श्रेणी के उदाहरण के बिना उस श्रेणी के बाहर स्टेटिक क्लास चर और विधियों तक पहुंचा जा सकता है।

public class Member { 

    // Global Variables 
    int iNumVertices; 
    int iNumEdges; 

    public static void main(String[] args) { 

     // do stuff 

     iNumVertices = 0; // Cannot make a static reference to the non-static field iNumVertices 

    } 
} 

विधि main एक स्थिर वर्ग के साथ जुड़े विधि है:

1

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

+0

इसलिए यदि मैं एक चर को प्रत्येक ऑब्जेक्ट के लिए विशिष्ट बनाना चाहता हूं ... यदि मैं चाहता हूं कि प्रत्येक सदस्य किसी अन्य सदस्य से स्वतंत्र हो (उदाहरण के लिए यदि वे अलग-अलग आयु हैं) तो मुझे स्थिर अधिकार का उपयोग नहीं करना चाहिए? – Hristo

+1

@ हिस्टो सही। शब्द "उदाहरण" वर्ग के अद्वितीय, व्यक्तिगत अहसास को संदर्भित करता है। कक्षा बताती है कि प्रत्येक उदाहरण को कैसे संरचित किया जाना चाहिए। स्टेटिक्स ने कहा कि वास्तव में व्यक्तिगत उदाहरणों का हिस्सा नहीं हैं। वे एक उदाहरण के लिए अद्वितीय नहीं हो सकते हैं - एक स्थिर की केवल एक प्रति है, प्रत्येक उदाहरण के साथ जुड़े नहीं। स्पष्टीकरण के लिए –

+0

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

4

स्थिर चर वे हैं जो कक्षा के सभी वस्तुओं में साझा किए जाते हैं। यहां सदस्य के प्रत्येक ऑब्जेक्ट के लिए आपके उदाहरण में, आप ऑब्जेक्ट प्राप्त करेंगे जिनके पास iNumVertices मान हैं। जब आप एक चर के साथ स्थिर का उपयोग करते हैं, तो सदस्य के प्रत्येक ऑब्जेक्ट में केवल एक ही चर साझा किया जाता है। स्थिर विधियां एक ही तरीके से काम करती हैं - वे सभी वस्तुओं में साझा की जाती हैं।

स्थिर सभी वस्तुओं के लिए चर/विधियां आम हैं, किसी को इन चर/विधियों तक पहुंचने के लिए कक्षा का ऑब्जेक्ट नहीं करना चाहिए।

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

या तो बनाने iNumVertices स्थिर, या सदस्य

Member m = new Member(); 
m.iNumVertices = 0; 
+0

तो यदि मैं एक चर को प्रत्येक ऑब्जेक्ट के लिए विशिष्ट बनाना चाहता हूं ... यदि मैं चाहता हूं कि प्रत्येक सदस्य किसी अन्य सदस्य से स्वतंत्र हो (उदाहरण के लिए यदि वे अलग-अलग आयु हैं), तो मुझे स्थिर अधिकार का उपयोग नहीं करना चाहिए? – Hristo

+0

बिल्कुल! यह सदस्य चर के सटीक उद्देश्य है। हालांकि, आपको इसे एक चर - सार्वजनिक, निजी इत्यादि के दायरे से भ्रमित नहीं करना चाहिए। – Ara

+0

प्रतीक्षा करें ... मैंने सोचा था कि उस समय सीमा को संदर्भित किया गया है जिसमें एक चर रहता है। क्या आप कह रहे हैं कि सार्वजनिक, निजी, आदि ... भी दायरे को परिभाषित करते हैं? – Hristo

4
learn what "static" actually means 

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

public class Car{ 

    private int speed; 

    public Car(int speed){ 
     this.speed = speed; 
    } 

} 

तो आप इस बनाते समय नया उदाहरण कर सकते हैं::

Car car = new Car(100); 

और हर बार जब आप कार उदाहरण बनाने यह गति 100 होगा, इस प्रकार स्थिर घोषणा से परहेज

यहाँ कोड उदाहरण है private static int speed = 100;

+0

आह यह दिलचस्प है ... अन्य उत्तरों से थोड़ा अलग समाधान। दिमाग प्रदर्शित करने के लिए कुछ कोड पोस्टिंग? – Hristo

+0

@Hristo मैंने कुछ कोड –

+0

कोड के लिए धन्यवाद जोड़ा। – Hristo

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