एक क्लास में 'स्टेटिक' कीवर्ड क्या करता है?


444

विशिष्ट होने के लिए, मैं इस कोड की कोशिश कर रहा था:

package hello;

public class Hello {

    Clock clock = new Clock();

    public static void main(String args[]) {
        clock.sayTime();
    }
}

लेकिन इसने त्रुटि दी

स्थैतिक विधि में गैर-स्थैतिक क्षेत्र तक नहीं पहुंच सकता

इसलिए मैंने इस की घोषणा को बदल दिया clock:

static Clock clock = new Clock();

और इसने काम किया। घोषणा से पहले उस कीवर्ड को डालने का क्या मतलब है? वास्तव में यह क्या करेगा और / या उस वस्तु को क्या किया जा सकता है के संदर्भ में प्रतिबंधित करता है?


एक बार फिर याद रखें कि कक्षा प्रति कक्षा के प्रति स्थिर का एक उदाहरण है।
जवमान

जवाबों:


633

static सदस्य एक विशिष्ट उदाहरण के बजाय वर्ग के हैं।

इसका मतलब है कि किसी staticक्षेत्र का केवल एक उदाहरण मौजूद है [1] भले ही आप कक्षा के एक लाख उदाहरण बनाते हैं या आप कोई भी निर्माण नहीं करते हैं। इसे सभी उदाहरणों द्वारा साझा किया जाएगा।

चूँकि staticविधियाँ भी एक विशिष्ट उदाहरण से संबंधित नहीं होती हैं, वे उदाहरण सदस्यों को संदर्भित नहीं कर सकते हैं। दिए गए उदाहरण में, mainयह नहीं पता कि Helloकक्षा का कौन सा उदाहरण (और इसलिए कक्षा का कौन सा उदाहरण Clock) इसे संदर्भित करना चाहिए। staticसदस्य केवल सदस्यों को संदर्भित कर सकते staticहैं। उदाहरण के सदस्य, बेशक staticसदस्यों का उपयोग कर सकते हैं।

साइड नोट: बेशक, staticसदस्य ऑब्जेक्ट संदर्भ के माध्यम से उदाहरण के सदस्यों तक पहुंच सकते हैं ।

उदाहरण:

public class Example {
    private static boolean staticField;
    private boolean instanceField;
    public static void main(String[] args) {
        // a static method can access static fields
        staticField = true;

        // a static method can access instance fields through an object reference
        Example instance = new Example();
        instance.instanceField = true;
    }

[१]: रनटाइम विशेषताओं के आधार पर, यह प्रति क्लासडॉलर या एपडोमैन या थ्रेड में से एक हो सकता है, लेकिन यह बिंदु के बगल में है।


5
.NET में, आप [थ्रेडस्टैटिक] विशेषता का उपयोग करके इस व्यवहार को भी संशोधित कर सकते हैं - जो स्टेटिक लोकल से विशेष थ्रेड्स को बनाता है।
theSoftwareJedi

4
मुझे पता है कि यह पुरानी पोस्ट है लेकिन मेरे जैसे शुरुआती लोगों के लिए यह मददगार हो सकती है। stackoverflow.com/questions/7026507/…
user3526905

जब आप एक निजी संस्करण है, तो क्या आप inst.instanceField तक नहीं पहुंच पाएंगे? या यह मान्य है क्योंकि आपने ऑब्जेक्ट को अपने ही वर्ग के अंदर बदल दिया है? मुझे एक दुःस्वप्न जैसा लगता है, लेकिन मैं एक जावा नौसिखिया हूँ।
मैट कॉर्बी

यदि किसी वर्ग के स्थिर सदस्य को 2 अलग-अलग थ्रेड द्वारा संदर्भित किया जाता है, तो उस स्थिर सदस्य के कितने उदाहरण हैं? मुझे ऐसा लगता है कि यह 2 है, लेकिन यदि आप थ्रेड्स में एक ही उदाहरण चाहते हैं तो अस्थिर कीवर्ड का उपयोग करना होगा। क्या वो सही है?
दान

..और क्या वह मूल्य संरक्षित है यदि वर्ग के कोई उदाहरण शेष नहीं हैं?
mckenzm

130

इसका अर्थ है कि हैलो में "घड़ी" का केवल एक उदाहरण है, "हैलो" वर्ग के प्रत्येक अलग-अलग उदाहरण में से एक नहीं है, या अधिक-तो इसका मतलब है कि सभी उदाहरणों के बीच एक आम तौर पर साझा "घड़ी" संदर्भ होगा "हैलो" वर्ग।

इसलिए यदि आपको अपने कोड में कहीं भी "नया हैलो" करना था: A- पहले परिदृश्य में (परिवर्तन से पहले, "स्थिर" का उपयोग किए बिना), यह हर बार एक नई घड़ी बनाता है जिसे "नया हैलो" कहा जाता है लेकिन बी- दूसरे परिदृश्य में (परिवर्तन के बाद, "स्थिर" का उपयोग करके), हर "नया हैलो" उदाहरण अभी भी पहले बनाए गए प्रारंभिक और उसी "घड़ी" संदर्भ का उपयोग और साझा करेगा।

जब तक आपको मुख्य के बाहर कहीं "घड़ी" की आवश्यकता नहीं होती, यह काम करता है:

package hello;
public class Hello
{
    public static void main(String args[])
    {
      Clock clock=new Clock();
      clock.sayTime();    
    }
}

यह इसे करने का सामान्य तरीका है। main()दिनचर्या आत्म निहित होना चाहिए।
जेसन एस

1
दूसरी बार में यह घड़ी की एक नई मिसाल पैदा करेगा जब हर बार मुख्य विधि को सही कहा जाता है?
अपवोट

2
दूसरे उदाहरण में, घड़ी स्थैतिक, यह केवल एक बार बनाएगा। मेरे उदाहरण में, जहां घड़ी मुख्य के भीतर होती है, तो हां, यह इसे हर बार नया बनाता है जिसे मुख्य कहा जाता है। लेकिन आम तौर पर मुख्य को केवल एक बार प्रोग्राम शुरू होने पर बुलाया जाता है, और जब यह बाहर निकलता है, तो सब कुछ फ्री-एड होता है।
पॉल टॉम्बलिन

मुझे नहीं मिल रहा है कि मुख्य विधि में एक नई घड़ी बनाना कैसे संभव है? जैसा कि आप कहते हैं कि इसे हर बार नया बनाया जाएगा जिसे मुख्य कहा जाता है, लेकिन एक ही मुख्य तरीका है। वह मुख्य विधि अलग-अलग घड़ी के उदाहरणों का उल्लेख कैसे कर सकती है? यह समझना थोड़ा मुश्किल है कि मुख्य में घड़ी की नई आवृत्ति बनाना कैसे संभव है और इसका उपयोग विधि टाइमटाइम () है, लेकिन यह संभव नहीं है कि मुख्य से बाहर निकलें और SayTime () का उपयोग करें। जब एक बार मुख्य बुलाया जाता है तो सब कुछ कैसे मुक्त होता है? @PaulTomblin
ShakibaZar

@ user5621266 मैंने केवल mainविधि का उपयोग किया क्योंकि ओपी ने किया था। यदि इसके बजाय यह एक सार्वजनिक तरीका था जिसे कहीं और से कॉल किया गया था, और हैलो क्लास को एक से अधिक बार त्वरित किया गया था, तो यह प्रत्येक हैलो उदाहरण के लिए एक घड़ी का उदाहरण बना सकता है, जब तक कि clockयह स्थिर नहीं था।
पॉल टॉम्बलिन

97

staticकीवर्ड का मतलब है कि कुछ (एक क्षेत्र, विधि या नेस्टेड वर्ग) से संबंधित है प्रकार के बजाय किसी विशेष उदाहरण प्रकार के। इसलिए, उदाहरण के लिए, Math.sin(...)कोई भी Mathवर्ग के किसी भी उदाहरण के बिना कॉल करता है , और वास्तव में आप इसका उदाहरण नहीं बना सकते हैंMath कक्षा ।

अधिक जानकारी के लिए, Oracle के जावा ट्यूटोरियल के संबंधित बिट देखें ।


पक्षीय लेख

जावा दुर्भाग्य से आपको स्थैतिक सदस्यों तक पहुंचने देता है जैसे कि वे उदाहरण के सदस्य हों, जैसे

// Bad code!
Thread.currentThread().sleep(5000);
someOtherThread.sleep(5000);

यह ऐसा लगता है जैसे कि sleepएक उदाहरण विधि है, लेकिन यह वास्तव में एक स्थिर विधि है - यह हमेशा वर्तमान थ्रेड को सोता है। कॉलिंग कोड में इसे स्पष्ट करने के लिए बेहतर अभ्यास है:

// Clearer
Thread.sleep(5000);

1
एक अन्य उदाहरण: System.out.println () एक वर्ग विधि की तरह दिखता है , लेकिन यह वास्तव में एक उदाहरण विधि है। चूंकि सिस्टम क्लास में एक PrintStream उदाहरण है।
जियाउ झांग

@LeslieCheung: नहीं, यह मेरे लिए एक क्लास मेथड की System.outतरह नहीं है , जैसा कि मुझे एक प्रकार का नाम पसंद नहीं है।
जॉन स्कीट

42

staticजावा में कीवर्ड मतलब यह है कि चर या समारोह है कि वर्ग के सभी उदाहरणों के बीच साझा किया जाता है के रूप में यह के अंतर्गत आता है प्रकार , न कि वास्तविक खुद वस्तुओं।

इसलिए यदि आपके पास एक चर है: private static int i = 0;और आप इसे बढ़ाते हैं ( i++) एक उदाहरण में, परिवर्तन सभी उदाहरणों में परिलक्षित होगा। iअब सभी उदाहरणों में 1 होगा।

किसी वस्तु को बिना इंस्टेंट किए स्टैटिक तरीकों का इस्तेमाल किया जा सकता है।


4
"साझा सभी उदाहरणों के बीच" गलत धारणा बनती है, IMO - यह पता चलता है कि आप कर वस्तु का एक उदाहरण है की जरूरत है।
जॉन स्कीट

1
(जबकि वास्तव में किसी भी उदाहरण की आवश्यकता नहीं है , क्योंकि स्थैतिक क्षेत्र आदि प्रकार के हैं ।)
जॉन स्कीट

@ जीन स्कीट स्टेटिक टाइप का है, ऑब्जेक्ट का नहीं? क्या आप और विस्तार बता सकते हैं? डेटाटाइप की तरह: इंट, डबल, ...?
truongnm

@truongnm: उस वर्ग में टाइप करें जो चर / विधि की घोषणा करता है।
जॉन स्कीट

26

स्थिर सदस्यों का मूल उपयोग ...

public class Hello
{
    // value / method
    public static String staticValue;
    public String nonStaticValue;
}

class A
{
    Hello hello = new Hello();
    hello.staticValue = "abc";
    hello.nonStaticValue = "xyz";
}

class B
{
    Hello hello2 = new Hello(); // here staticValue = "abc"
    hello2.staticValue; // will have value of "abc"
    hello2.nonStaticValue; // will have value of null
}

यह है कि आप वर्ग उदाहरणों को अन्य वर्ग को भेजे बिना सभी वर्ग के सदस्यों में साझा किए गए मूल्यों को कैसे कर सकते हैं। और सफ़ेद स्थिर आपको वर्ग उदाहरण बनाने की आवश्यकता नहीं है।

Hello hello = new Hello();
hello.staticValue = "abc";

आप केवल कक्षा नाम से स्थिर मूल्यों या विधियों को कॉल कर सकते हैं:

Hello.staticValue = "abc";

22

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

Hello.main(new String[]()) //main(...) is declared as a static function in the Hello class

इसके बजाय सीधे:

Hello h = new Hello();
h.main(new String[]()); //main(...) is a non-static function linked with the "h" variable

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


स्टेटिक प्रसंग के लिए महान व्याख्या :)
अब्देल-रऊफ

20

जावा में स्थैतिक:

स्टेटिक एक नॉन एक्सेस मोडिफायर है। स्थिर खोजशब्द वर्ग के उदाहरण से वर्ग का है। एक वर्ग के लिए एक चर या विधि संलग्न करने के लिए इस्तेमाल किया जा सकता है।

स्थैतिक खोजशब्द का उपयोग किया जा सकता है:

तरीका

परिवर्तनशील

कक्षा दूसरे वर्ग के भीतर निहित है

प्रारंभिक ब्लॉक

के साथ इस्तेमाल नहीं किया जा सकता है:

क्लास (नॅस्टेड)

निर्माता

इंटरफेस

विधि स्थानीय इनर क्लास (अंतर तब नेस्टेड क्लास)

इनर क्लास के तरीके

आवृत्ति के चर

स्थानीय चर

उदाहरण:

निम्नलिखित उदाहरण की कल्पना करें, जिसमें एक उदाहरण चर नाम दिया गया है, जो निर्माणकर्ता में बढ़ा हुआ है:

package pkg;

class StaticExample {
    int count = 0;// will get memory when instance is created

    StaticExample() {
        count++;
        System.out.println(count);
    }

    public static void main(String args[]) {

        StaticExample c1 = new StaticExample();
        StaticExample c2 = new StaticExample();
        StaticExample c3 = new StaticExample();

    }
}

आउटपुट:

१ १ १

चूँकि ऑब्जेक्ट वेरिएबल को ऑब्जेक्ट क्रिएशन के समय मेमोरी मिलती है, इसलिए प्रत्येक ऑब्जेक्ट में इंस्टेंस वेरिएबल की कॉपी होगी, अगर यह इंक्रीमेंट किया गया है, तो यह अन्य ऑब्जेक्ट्स को प्रतिबिंबित नहीं करेगा।

अब यदि हम उदाहरण चर संख्या को स्थैतिक में बदलते हैं तो प्रोग्राम अलग आउटपुट का उत्पादन करेगा:

package pkg;

class StaticExample {
    static int count = 0;// will get memory when instance is created

    StaticExample() {
        count++;
        System.out.println(count);
    }

    public static void main(String args[]) {

        StaticExample c1 = new StaticExample();
        StaticExample c2 = new StaticExample();
        StaticExample c3 = new StaticExample();

    }
}

आउटपुट:

१ २ ३

इस स्थिति में स्थिर चर को केवल एक बार मेमोरी मिलेगी, यदि कोई भी वस्तु स्थैतिक चर के मूल्य को बदल देती है, तो वह अपने मूल्य को बनाए रखेगा।

फाइनल के साथ स्टेटिक:

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

यहां छवि विवरण दर्ज करें

चित्र संसाधन: अंतिम स्थैतिक


15

मौजूदा उत्तरों में जोड़ने के लिए, मुझे चित्र के साथ प्रयास करने दें:

2% की ब्याज दर सभी बचत खातों पर लागू होती है। इसलिए यह स्थिर है

एक संतुलन व्यक्तिगत होना चाहिए , इसलिए यह स्थिर नहीं है

यहां छवि विवरण दर्ज करें


13

इस चर्चा ने अब तक वर्ग अधिभोग पर ध्यान नहीं दिया है। कड़ाई से बोलते हुए, जावा स्थिर फ़ील्ड किसी दिए गए क्लास लोडर के लिए एक वर्ग के सभी उदाहरणों के बीच साझा किए जाते हैं


1
यह मर्खड के जवाब पर टिप्पणियों में एपोकैलिस्प द्वारा उल्लेख किया गया था।
ज़च लैंगले

1
अच्छी बात। बहुत से लोग यह नहीं जानते हैं, लेकिन एक बार जब आप क्लास लोडर के साथ गड़बड़ करना शुरू कर देते हैं, तो यह बहुत महत्वपूर्ण हो जाता है।
sleske

2
यह सब सच है लेकिन यह सवाल का जवाब नहीं देता है। इसे एक टिप्पणी के रूप में पोस्ट किया जाना चाहिए था।
लोरेन का मार्कीस

7

एक क्षेत्र को कक्षा या कक्षा के एक उदाहरण के लिए सौंपा जा सकता है। डिफ़ॉल्ट रूप से फ़ील्ड उदाहरण चर हैं। staticक्षेत्र का उपयोग करके एक वर्ग चर बन जाता है, इस प्रकार एक और केवल एक होता है clock। यदि आप एक जगह बदलाव करते हैं, तो यह हर जगह दिखाई देता है। उदाहरण चर एक दूसरे से स्वतंत्र रूप से बदले जाते हैं।


6

कीवर्ड staticका उपयोग किसी फ़ील्ड या विधि को वर्ग से संबंधित करने के लिए किया जाता है न कि उदाहरण के लिए। अपने कोड का उपयोग करना, यदि ऑब्जेक्ट Clockस्थिर है, तो Helloकक्षा के सभी उदाहरण इस Clockडेटा सदस्य (फ़ील्ड) को सामान्य रूप से साझा करेंगे। यदि आप इसे गैर-स्थिर बनाते हैं, तो प्रत्येक व्यक्तिगत उदाहरण में Helloएक विशिष्ट Clockफ़ील्ड हो सकती है।

समस्या यह है कि आपने अपनी कक्षा में एक मुख्य विधि जोड़ी है Helloताकि आप कोड चला सकें। यहां समस्या यह है कि मुख्य विधि स्थिर है और इस तरह, यह गैर-स्थिर क्षेत्रों या इसके अंदर के तरीकों को संदर्भित नहीं कर सकता है। आप इसे दो तरीकों से हल कर सकते हैं:

  1. Helloकक्षा के सभी क्षेत्रों और विधियों को स्थिर बनाएं ताकि उन्हें मुख्य के अंदर भेजा जा सके विधि के । यह वास्तव में करने के लिए एक अच्छी बात नहीं है (या गलत कारण टी एक क्षेत्र और / या एक विधि स्थैतिक बनाते हैं)
  2. Helloमुख्य विधि के अंदर अपनी कक्षा का एक उदाहरण बनाएं और सभी फ़ील्ड्स तक पहुँचें और उन तरीकों को अपनाएँ जो वे पहली जगह पर किए गए थे।

आपके लिए, इसका अर्थ है कि आपके कोड में निम्नलिखित परिवर्तन:

package hello;

public class Hello {

    private Clock clock = new Clock();

    public Clock getClock() {
        return clock;
    }

    public static void main(String args[]) {
        Hello hello = new Hello();
        hello.getClock().sayTime();
    }
}

6

जावा में, staticकीवर्ड को निम्नलिखित संकेत देने के रूप में माना जा सकता है:

"किसी विशेष उदाहरण के संबंध या संबंध के बिना"

यदि आप staticइस तरह से सोचते हैं , तो विभिन्न संदर्भों में इसके उपयोग को समझना आसान हो जाता है जिसमें इसका सामना किया गया है:

  • एक staticफ़ील्ड एक ऐसा क्षेत्र है जो किसी विशेष उदाहरण के बजाय कक्षा से संबंधित है

  • एक staticविधि एक ऐसी विधि है जिसमें कोई धारणा नहीं है this; यह वर्ग पर परिभाषित किया गया है और उस वर्ग के किसी विशेष उदाहरण के बारे में नहीं जानता है जब तक कि एक संदर्भ इसे पारित नहीं किया जाता है

  • एक staticसदस्य वर्ग किसी भी धारणा के बिना एक नेस्टेड वर्ग है या उसके संलग्न वर्ग के उदाहरण का ज्ञान (जब तक कि एक संलग्न वर्ग के उदाहरण के लिए इसे पारित नहीं किया जाता है)


5

स्टेटिक घड़ी सदस्य को एक उदाहरण सदस्य के बजाय एक वर्ग सदस्य बनाता है। स्थैतिक कीवर्ड के बिना आपको हैलो क्लास (जिसमें एक घड़ी सदस्य चर है) का एक उदाहरण बनाने की आवश्यकता होगी - जैसे

Hello hello = new Hello();
hello.clock.sayTime();

5

स्थिर विधियाँ उस श्रेणी के किसी भी उदाहरण के चर का उपयोग नहीं करती हैं जिन्हें वे परिभाषित करते हैं। इस पृष्ठ पर अंतर का बहुत अच्छा विवरण पाया जा सकता है


5

मैंने "हेल्पर" कक्षाओं में स्थिर तरीकों (केवल, यदि संभव हो) के लिए एक पसंद विकसित किया है।

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

शायद अन्य फायदे हैं।


4
//Here is an example 

public class StaticClass 
{
    static int version;
    public void printVersion() {
         System.out.println(version);
    }
}

public class MainClass 
{
    public static void main(String args[]) {  
        StaticClass staticVar1 = new StaticClass();
        staticVar1.version = 10;
        staticVar1.printVersion() // Output 10

        StaticClass staticVar2 = new StaticClass();
        staticVar2.printVersion() // Output 10
        staticVar2.version = 20;
        staticVar2.printVersion() // Output 20
        staticVar1.printVersion() // Output 20
    }
}

3

स्थैतिक सदस्यों के लिए "यह" सूचक नहीं होने के बारे में भी सोच सकते हैं। वे सभी उदाहरणों के बीच साझा किए जाते हैं।


3

स्थैतिक अवधारणाओं को समझना

public class StaticPractise1 {
    public static void main(String[] args) {
        StaticPractise2 staticPractise2 = new StaticPractise2();
        staticPractise2.printUddhav(); //true
        StaticPractise2.printUddhav(); /* false, because printUddhav() is although inside StaticPractise2, but it is where exactly depends on PC program counter on runtime. */

        StaticPractise2.printUddhavsStatic1(); //true
        staticPractise2.printUddhavsStatic1(); /*false, because, when staticPractise2 is blueprinted, it tracks everything other than static  things and it organizes in its own heap. So, class static methods, object can't reference */

    }
}

द्रितीय श्रेणी

public class StaticPractise2 {
    public static void printUddhavsStatic1() {
        System.out.println("Uddhav");
    }

    public void printUddhav() {
        System.out.println("Uddhav");
    }
}

2

main() एक स्थिर विधि है जिसमें दो मौलिक प्रतिबंध हैं:

  1. स्थैतिक विधि एक गैर-स्थैतिक डेटा सदस्य का उपयोग नहीं कर सकती है या सीधे गैर-स्थैतिक विधि को कॉल नहीं कर सकती है।
  2. this()और super()स्थिर संदर्भ में उपयोग नहीं किया जा सकता है।

    class A {  
        int a = 40; //non static
        public static void main(String args[]) {  
            System.out.println(a);  
        }  
    }

आउटपुट: संकलन समय त्रुटि


1

स्टेटिक वेरिएबल्स को केवल केवल स्टैटिक विधियों में ही एक्सेस किया जा सकता है, इसलिए जब हम स्टैटिक वैरिएबल की घोषणा करते हैं, तो वे गेटटर और सेटर विधियां स्टैटिक तरीके होंगे।

स्थिर विधियाँ एक वर्ग स्तर है जिसे हम कक्षा के नाम का उपयोग करके देख सकते हैं

निम्नलिखित स्टैटिक वेरिएबल्स गेटर्स एंड सेटर्स के लिए उदाहरण है:

public class Static 
{

    private static String owner;
    private static int rent;
    private String car;
    public String getCar() {
        return car;
    }
    public void setCar(String car) {
        this.car = car;
    }
    public static int getRent() {
        return rent;
    }
    public static void setRent(int rent) {
        Static.rent = rent;
    }
    public static String getOwner() {
        return owner;
    }

    public static void setOwner(String owner) {
        Static.owner = owner;
    }

}

1

इस अवधारणा के लिए 'स्टेटिक' शब्द की पसंद के बारे में एक सवाल यहाँ पूछा गया था । यह इस प्रश्न के लिए कठिन था, लेकिन मुझे नहीं लगता कि व्युत्पत्ति को स्पष्ट रूप से संबोधित किया गया है। इसलिए...


यह C के साथ शुरू होने वाले कीवर्ड पुन: उपयोग के कारण है।

सी में डेटा घोषणाओं पर विचार करें (एक फ़ंक्शन बॉडी के अंदर):

    void f() {
        int foo = 1;
        static int bar = 2;
         :
    }

जब फ़ंक्शन में प्रवेश किया जाता है (और फ़ंक्शन समाप्त होने पर नष्ट हो जाता है) तब स्टैक पर वैरिएबल फ़ू बनाया जाता है। इसके विपरीत, बार हमेशा होता है, इसलिए यह सामान्य अंग्रेजी के अर्थ में 'स्थिर' है - यह कहीं भी नहीं जा रहा है।

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

    class C {
        int foo = 1;
        static int bar = 2;
         :
    }

अंत में, हम तरीकों पर आते हैं।

    class C {
        int foo() { ... }
        static int bar() { ... }
         :
    }

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.