स्टेटिक तरीकों और इंस्टेंस विधियों के बीच अंतर


88

मैं अपनी पाठ्यपुस्तक में मुझे दिए गए पाठ को पढ़ रहा था और मुझे यकीन नहीं है कि मैं समझ रहा हूं कि यह क्या कह रहा है। यह मूल रूप से मुझे बता रहा है कि स्थिर तरीकों या वर्ग विधियों में "संशोधक" कीवर्ड स्थिर है। लेकिन मैं वास्तव में नहीं जानता कि इसका क्या मतलब है?

क्या कोई मुझे वास्तव में सरल शब्दों में समझा सकता है कि स्टेटिक या क्लास मेथड क्या हैं?

इसके अलावा, क्या मुझे इस बात पर एक सरल स्पष्टीकरण मिल सकता है कि इंस्टेंस के तरीके क्या हैं?

यह वही है जो वे मुझे पाठ्यपुस्तक में देते हैं:

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

जिस तरीके से किसी अन्य विधि की परिभाषा के भीतर एक स्थिर विधि को लागू किया जाता है, वह इस बात के अनुसार भिन्न होता है कि दोनों विधियाँ एक ही वर्ग की हैं या नहीं। ऊपर के उदाहरण में, मेनक्लास वर्ग के फैक्टरियल और मुख्य दोनों तरीके हैं। नतीजतन, मुख्य की परिभाषा में फैक्टरियल का आह्वान केवल विधि नाम, "फैक्टोरियल" का संदर्भ देता है।

जवाबों:


161

जावा में मूल प्रतिमान यह है कि आप कक्षाएं लिखते हैं, और यह कि उन कक्षाओं को त्वरित रूप से लिखा जाता है। तात्कालिक वस्तुएँ (एक वर्ग का उदाहरण) में उनके साथ जुड़े सदस्य (चर चर) होते हैं जो उनके व्यवहार को प्रभावित करते हैं; जब इसका उदाहरण निष्पादित होता है तो यह इन चरों को संदर्भित करेगा।

हालाँकि, किसी विशेष प्रकार की सभी वस्तुओं में ऐसा व्यवहार हो सकता है जो सदस्य चर पर निर्भर न हो; इन विधियों को सबसे अच्छा स्थैतिक बनाया जाता है। स्थिर होने से, विधि को चलाने के लिए कक्षा का कोई उदाहरण आवश्यक नहीं है।

आप एक स्थैतिक विधि को निष्पादित करने के लिए ऐसा कर सकते हैं:

MyClass.staticMethod();//Simply refers to the class's static code

लेकिन एक गैर-स्थैतिक विधि को निष्पादित करने के लिए, आपको यह करना होगा:

MyClass obj = new MyClass();//Create an instance
obj.nonstaticMethod();//Refer to the instance's class's code

एक गहरे स्तर पर, जब कंपाइलर एक कक्षा को एक साथ रखता है, तो इसमें कई तरीके होते हैं। जब उन तरीकों को निष्पादित किया जाता है तो यह पॉइंटर्स का अनुसरण करता है और कोड को सबसे अंत में निष्पादित करता है। यदि किसी वर्ग को त्वरित किया जाता है, तो बनाई गई ऑब्जेक्ट में "वर्चुअल मेथड टेबल" के लिए एक पॉइंटर होता है, जो कि वंशानुक्रम पदानुक्रम में उस विशेष वर्ग के लिए बुलाए जाने वाले तरीकों को इंगित करता है। हालाँकि, यदि यह विधि स्थिर है, तो "वर्चुअल मेथड टेबल" की आवश्यकता नहीं है: उस पद्धति की सभी कॉल सटीक समान कोड को निष्पादित करने के लिए स्मृति में ठीक उसी स्थान पर जाती हैं। उस कारण से, उच्च-प्रदर्शन प्रणालियों में एक स्थिर विधि का उपयोग करना बेहतर होता है यदि आप उदाहरण चर पर निर्भर नहीं हैं।


2
वे कोड उदाहरणों के लिए बहुत बहुत धन्यवाद वे परिचित दिखते हैं इसलिए मैं अब समझ गया
हूं

4
@ रोहन को देखने का एक और अच्छा तरीका यह है कि कुछ भी static(वर्ग, विधि या क्षेत्र) वास्तव में किसी भी चीज़ से संबंधित नहीं है, यह सिर्फ संगठनात्मक उद्देश्यों के लिए कक्षा में लटका हुआ है।
gobernador

1
इसके अलावा स्थैतिक क्षेत्रों को डेटा ऑब्जेक्ट्स के रूप में उपयोग किया जाता है (एक जो डेटा को धारण करता है और इसलिए केंट परिवर्तन नहीं करता है लेकिन आप इसके अंदर डेटा को हेरफेर कर सकते हैं।) स्टेटिक तरीकों को केवल स्थिर फ़ील्ड पर कॉल किया जा सकता है और इसलिए निरंतर रहने या न बदलने की समान धारणा को वहन करता है। या तुरंत नहीं !!
user2416728

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

2
ऐ, "बदल नहीं" >> मेरा मतलब है कि त्वरित नहीं किया जा सकता है !!
user2416728

19

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

उदाहरण के लिए:

Person.staticMethod();           //accessing static method.

गैर-स्थैतिक विधि के लिए आपको क्लास को तुरंत करना होगा।

Person person1 = new Person();   //instantiating
person1.nonStaticMethod();       //accessing non-static method.

8

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


8

स्टेटिक तरीकों और इंस्टेंस विधियों के बीच अंतर

  1. उदाहरण विधि वे विधियाँ हैं जिनके लिए अपनी कक्षा की एक वस्तु की आवश्यकता होती है जिसे बनाने से पहले उसे बुलाया जा सकता है। जावा में स्टैटिक विधियाँ वे विधियाँ हैं जिन्हें कक्षा की वस्तु बनाए बिना कहा जा सकता है।

  2. स्थैतिक कीवर्ड के साथ स्टेटिक विधि घोषित की जाती है। इंस्टेंस विधि स्थिर कीवर्ड के साथ नहीं है।

  3. स्टैटिक विधि का अर्थ है जो एक वर्ग के लिए एकल प्रति के रूप में मौजूद होगा। लेकिन उदाहरण विधियाँ कई प्रतियों के रूप में मौजूद हैं जो उस वर्ग के लिए बनाए गए उदाहरणों की संख्या पर निर्भर करती हैं।

  4. क्लास रेफरेंस का उपयोग करके स्टैटिक विधियों को लागू किया जा सकता है। ऑब्जेक्ट रेफरेंस का उपयोग करके इंस्टेंस या गैर स्थिर तरीकों को लागू किया जाता है।

  5. स्टेटिक तरीके सीधे इंस्टेंस विधियों और इंस्टेंस चर का उपयोग नहीं कर सकते हैं। इंस्टेंस विधि स्टैटिक वैरिएबल और स्टैटिक विधियों को सीधे एक्सेस कर सकती है।

संदर्भ: geeksforgeeks


4

उदाहरण के तरीके => एक विशिष्ट वर्ग के विशिष्ट उदाहरण पर लागू किए गए। विधि यह जानना चाहती है कि यह किस वर्ग पर लागू किया गया था। जिस तरह से ऐसा होता है वहां एक अदृश्य पैरामीटर होता है जिसे 'यह' कहा जाता है। 'यह' के अंदर हमारे पास पहले से मानों के साथ सेट किए गए उदाहरण वर्ग के सदस्य हैं। यह ’कोई चर नहीं है। यह एक मूल्य है, आप इसे बदल नहीं सकते हैं और मूल्य कॉल के रिसीवर के संदर्भ में है। Ex: आप अपने टीवी (वास्तविक कार्यक्रम) को ठीक करने के लिए रिपेयरमेन (इंस्टेंस मेथड) कहते हैं। वह टूल ('यह' पैरामीटर) के साथ आता है। वह टीवी को ठीक करने के लिए आवश्यक विशिष्ट उपकरणों के साथ आता है और वह अन्य चीजों को भी ठीक कर सकता है।

में स्थिर तरीकों => वहाँ के रूप में 'इस' जैसी कोई चीज नहीं है। Ex: वही रिपेयरमैन (स्थैतिक विधि)। जब आप उसे कॉल करते हैं तो आपको निर्दिष्ट करना होता है कि किस मरम्मतकर्मी को कॉल करना है (जैसे इलेक्ट्रीशियन)। और वह आकर आपका टीवी ठीक कर देगा। लेकिन, उसके पास अन्य चीजों को ठीक करने के लिए उपकरण नहीं हैं (कोई 'यह' पैरामीटर नहीं है)।

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


2

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

Myclass.get();

उदाहरण विधि में प्रत्येक वस्तु का अलग-अलग व्यवहार होगा, इसलिए उन्हें वस्तु उदाहरण का उपयोग करके विधि को कॉल करना होगा। उदाहरण के लिए:

Myclass x = new Myclass();
x.get();

1

यदि किसी विधि की स्थिति को परिवर्तित नहीं किया जाना है या इसके किसी भी उदाहरण चर का उपयोग नहीं किया जा रहा है।

आप उदाहरण के बिना विधि कॉल करना चाहते हैं।

यदि यह केवल प्रदान किए गए तर्कों पर काम करता है।

उपयोगिता कार्य स्थैतिक तरीकों का अच्छा उदाहरण हैं। यानी math.pow (), यह फ़ंक्शन विभिन्न मानों के लिए स्थिति को बदलने वाला नहीं है। तो यह स्थिर है।


1

संक्षेप में, स्थैतिक विधियाँ और स्थैतिक चर वर्ग स्तर होते हैं जहाँ उदाहरण विधियाँ और उदाहरण चर उदाहरण या वस्तु स्तर होते हैं।

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

class A {
    int a;
    int b;

    public void setParameters(int a, int b){
        this.a = a;
        this.b = b;
    }
    public int add(){
        return this.a + this.b;
   }

    public static returnSum(int s1, int s2){
        return (s1 + s2);
    }
}

उपरोक्त उदाहरण में, जब आप ऐड कहते हैं ():

A objA = new A();
objA.setParameters(1,2); //since it is instance method, call it using object
objA.add(); // returns 3 

B objB = new B();
objB.setParameters(3,2);
objB.add(); // returns 5

//calling static method
// since it is a class level method, you can call it using class itself
A.returnSum(4,6); //returns 10

class B{
    int s=8;
    int t = 8;
    public addition(int s,int t){
       A.returnSum(s,t);//returns 16
    }
}

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


0

इंस्टेंट विधि बनाम स्टेटिक विधि

  1. इंस्टेंस मेथड इंस्टेंस मेथड्स और इंस्टेंस चर को सीधे एक्सेस कर सकता है।

  2. इंस्टेंस विधि स्टैटिक वैरिएबल और स्टैटिक विधियों को सीधे एक्सेस कर सकती है।

  3. स्थैतिक विधियाँ सीधे स्थिर चर और स्थिर विधियों तक पहुँच सकती हैं।

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


-2

जब किसी फ़ंक्शन के सामने रखा जाता है तो स्थिर संशोधक का अर्थ है कि उस फ़ंक्शन की केवल एक प्रति मौजूद है। यदि स्थिर संशोधक को फ़ंक्शन के सामने नहीं रखा जाता है, तो उस कक्षा के प्रत्येक ऑब्जेक्ट या उदाहरण के साथ उस फ़ंक्शन की एक नई प्रतिलिपि बनाई जाती है। :) वही वैरिएबल के मामले में है।

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