2013-06-02 6 views
10
public class Bicycle { 

    private int cadence; 
    private int gear; 
    private int speed; 
    private int id; 
    private static int numberOfBicycles = 0; 

    public Bicycle(int startCadence, int startSpeed, int startGear){ 
     gear = startGear; 
     cadence = startCadence; 
     speed = startSpeed; 

     id = ++numberOfBicycles; 
    } 
     // ... 
} 

मैंने अपनी कक्षा में Static variables should be accessed by calling with class name सीखा। यानी ClassName.VariableNameस्टेटिक चर का उपयोग

लेकिन उपरोक्त कोड में, कैसे इस बयान id = ++numberOfBicycles; त्रुटियों के बिना, संकलित किया गया है, भले ही चर numberOfBicyclesstatic

+3

कक्षा के बाहर से के लिए ठीक काम किया, "स्थैतिक चर द्वारा पहुँचा जा चाहिए कक्षा के नाम से बुलाओ। " अंदर से, कक्षा योग्यता संकलक द्वारा अनुमानित है। –

+3

ध्यान दें कि यह पंक्ति 'id = ++ numberOfBicycles;' थ्रेड सुरक्षित नहीं है –

उत्तर

11

स्टेटिक चर के अपने व्यक्तिगत उदाहरणों (वस्तुओं) के बजाए कक्षा के स्वामित्व में हैं। कक्षा के बाहर स्थिर चर का संदर्भ ClassName.myStaticVariable है लेकिन कक्षा के अंदर यह अन्य आवृत्ति चर के समान है।

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

तो आपका कथन id = ++numberOfBicycles; पूरी तरह से मान्य है और त्रुटियों के बिना संकलित करेगा।

5
वर्ग Bicycle क्वालीफायर स्थैतिक चर पर वैकल्पिक है के भीतर से

है, बस this क्वालीफायर की तरह उदाहरण चर पर वैकल्पिक है

3

हो सकता है कि आपके व्याख्याता ने कक्षा के बाहर से कक्षा के बाहर से उन्हें एक्सेस करने के बारे में क्या कहा हो। static चर को इस ClassName.VariableName या object.VariableName जैसी कक्षा के बाहर एक्सेस किया जा सकता है। लेकिन हालांकि पहली विधि प्राथमिक है।

कक्षा के अंदर से आपको this कीवर्ड या classname-qualifier का उपयोग स्थानीय चर के साथ विधियों और रचनाकारों के समान नाम के साथ असंबद्ध करने के लिए कर सकता है।

3

स्टेटिक चर साझा किए गए चर हैं। तो आप क्लासनाम.स्टैटिक वैरिएबल या क्लास इंस्टेंस के ऑब्जेक्ट का उपयोग करके उन्हें एक्सेस कर सकते हैं। स्टेटिक वैरिएबल। किसी भी मामले में आप स्मृति में चर की एक प्रति का जिक्र करेंगे, इससे कोई फर्क नहीं पड़ता कि आप कितनी ऑब्जेक्ट बनाते हैं।

1

अपनी कक्षा को देखते हुए ..

public class Bicycle 
{ 
    private int cadence; 
    private int gear; 
    private int speed; 
    private int id; 
    private static int numberOfBicycles = 0; 

    // .. 
} 

जब मैं प्रकार साइकिल का एक वस्तुओं को बनाने, यह इस तरह होगा:

Bicycle a = new Bicycle (1,2,3); 

Bicycle b = new Bicycle (2,3,4); 

स्मृति में, यह इस तरह है:

[a] --> { id:1, cadence:1, gear:2, speed:3 } 

[b] --> { id:2, cadence:2, gear:3, speed:4 } 

संख्याऑफबाइक स्थिर है, इसलिए यह किसी भी साइकिल वस्तु का हिस्सा नहीं है, यह वर्ग से संबंधित वस्तु से संबंधित है, और इसलिए यह बी स्मृति में इस तरह ई:

[Bicycle] --> { numberOfBicycles:2 } 

और इसलिए स्थिर सदस्य तक पहुँचने के लिए, पहले हम इसके लिए एक स्थिर गेटर को परिभाषित:

public static int getNumberOfBicycles() 
{ 
    return numberOfBicycles; 
} 

तो हम कक्षा से यह कहते हैं:

System.out.println(Bicycle.getNumberOfBicycles()); 
1

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

2
public int getID(){ 
    return numberOfBicycles; 
} 

public static int getNOB(){ 
    return numberOfBicycles; 
} 


साइकिल वर्ग

Bicycle bc = new Bicycle(30, 90, 1); 
    System.out.println(Bicycle.getNOB()); 
    System.out.println(bc.getID()); 

    Bicycle bc2 = new Bicycle(30,90, 1); 
    System.out.println(Bicycle.getNOB()); 
    System.out.println(bc2.getID()); 

    Bicycle bc3 = new Bicycle(30,90, 1); 
    System.out.println(Bicycle.getNOB()); 
    System.out.println(bc3.getID()); 

    Bicycle bc4 = new Bicycle(30,90, 1); 
    System.out.println(Bicycle.getNOB()); 
    System.out.println(bc4.getID()); 


BicycleTest के मुख्य वर्ग में मुझे

+1

आपको दो उत्तरों बनाने की आवश्यकता नहीं है ..... आप इस कोड को शामिल करने के लिए अपना पहला उत्तर संपादित कर सकते हैं – pinkpanther

+0

हाँ अगली बार ऐसा होगा ... जब तक आप इसे पढ़ते और समझते हैं। – Manny265

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