1. स्थैतिक विधियाँ

स्थैतिक चर के अलावा, कक्षाओं में स्थिर विधियाँ भी हो सकती हैं।

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

किसी वर्ग पर एक साधारण (गैर-स्थैतिक) विधि को कॉल करने के लिए, आपको पहले कक्षा का एक ऑब्जेक्ट बनाना होगा और फिर ऑब्जेक्ट पर विधि को कॉल करना होगा। आप किसी वस्तु के बजाय कक्षा पर सामान्य विधि नहीं बुला सकते हैं।

उदाहरण:

आप कक्षा पर एक गैर स्थैतिक विधि नहीं बुला सकते हैं!
public class DataInfo
{
   public int getValue()
   {
      return 100;
   }
}

public class Solution
{
   public static void main(String[] args)
   {
      System.out.println(DataInfo.getValue()); // This will generate an error!
   }
}

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

मेथड को स्टेटिक घोषित करने के लिए, आपको मेथड हेडर से पहले स्टैटिक कीवर्ड लिखना होगा। इस निर्माण की सामान्य उपस्थिति इस प्रकार है:

static Type name(parameters)
{
   method code
}

उदाहरण:

कोड टिप्पणी
public class Solution
{
   public static void main(String args[])
   {
      test();
   }

   public static void test()
   {
      int d = 2/0;
   }
}


जावा मशीन mainइस तरह की कमांड के साथ विधि को कॉल करती है: Solution.main();



स्टैटिक test()मेथड को स्टैटिक main()मेथड में कहा जाता है।

किसी अन्य वर्ग से एक स्थिर विधि को कॉल करने के लिए, आपको स्थैतिक विधि के नाम से पहले वर्ग का नाम निर्दिष्ट करना होगा। इस निर्माण की सामान्य उपस्थिति इस प्रकार है:

Type name = ClassName.methodName(arguments)

उदाहरण:

कोड स्थैतिक विधि
int x = Math.min(a, b);
int min(int a, int b)
Thread.sleep(200);
void sleep(long ms)
Path path = Path.of("c:\\readme.txt");
Path of(String str)


2. स्टेटिक बनाम साधारण (गैर-स्थैतिक) तरीके

स्थैतिक तरीकों और सामान्य लोगों के बीच क्या अंतर है?

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

दो प्रकार के तरीकों के बीच अंतर निम्न तालिका में व्यक्त किए गए हैं:

क्षमता / संपत्ति साधारण विधि स्थैतिक विधि
कक्षा के एक उदाहरण के लिए बाध्य हाँ नहीं
वर्ग के सामान्य तरीके कह सकते हैं हाँ नहीं
कक्षा के स्थिर तरीकों को कॉल कर सकते हैं हाँ हाँ
कक्षा के सामान्य चरों तक पहुँच सकते हैं हाँ नहीं
वर्ग के स्थिर चर तक पहुँच सकते हैं हाँ हाँ
किसी वस्तु पर बुलाया जा सकता है हाँ हाँ
क्लास में बुलाया जा सकता है नहीं हाँ

यदि वे इतने गंभीर रूप से सीमित हैं तो ऐसे तरीकों की आवश्यकता क्यों है? इसका उत्तर यह है कि इस दृष्टिकोण के अपने लाभ भी हैं।

सबसे पहले, आपको स्थैतिक विधियों और चरों तक पहुँचने के लिए किसी वस्तु संदर्भ को पारित करने की आवश्यकता नहीं है।

दूसरा, कभी-कभी आपको एक चर का केवल एक उदाहरण होने की आवश्यकता होती है। उदाहरण के लिए, System.out( सिस्टम क्लास का स्थिर आउट वेरिएबल )।

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

कक्षा के एक उदाहरण के लिए बाध्य

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

स्टेटिक विधियों में यह अंतर्निहित पैरामीटर नहीं है, इसलिए आप thisस्थिर विधियों के अंदर कीवर्ड का उपयोग नहीं कर सकते हैं, और आप स्थिर विधि के अंदर गैर-स्थैतिक विधियों को कॉल नहीं कर सकते हैं। किसी वर्ग के उदाहरण का संदर्भ प्राप्त करने के लिए बस कहीं नहीं है।

वर्ग के सामान्य तरीके कह सकते हैं

एक सामान्य विधि में हमेशा अंतर्निहित thisपैरामीटर होता है, इसलिए आपके पास हमेशा उस वस्तु का संदर्भ होता है जिस पर विधि कहलाती है। thisजब भी आप किसी सामान्य विधि को किसी अन्य सामान्य विधि के अंदर कॉल करते हैं, तो उस कॉल को करने के लिए अंतर्निहित पैरामीटर का उपयोग किया जाता है। उदाहरण

कोड यह काम किस प्रकार करता है
int min(int a, int b)
{
   return a < b ? a : b;
}

int min(int a, int b, int c)
{
   int t = min(a, b);
   return min(t, c);
}
int min(int a, int b)
{
   return a < b ? a : b;
}

int min(int a, int b, int c)
{
   int t = this.min(a, b);
   return this.min(t, c);
}

यही कारण है कि आप स्थिर विधि से सामान्य विधि नहीं कह सकते हैं। thisस्टैटिक मेथड के अंदर बस कोई इंप्लिसिट वेरिएबल नाम नहीं है ।

या दूसरी स्थिति की कल्पना करें: हमारे कार्यक्रम में अभी तक हमारी कक्षा की एक भी वस्तु नहीं बनाई गई है। क्या हम अपनी कक्षा की स्थिर विधि कह सकते हैं? हाँ। और क्या यह स्थैतिक विधि सामान्य (गैर स्थैतिक) विधि कह सकती है?

अच्छा, हम इसे किस वस्तु पर कहेंगे? आखिरकार, हमारी कक्षा का एक भी उदाहरण अभी तक मौजूद नहीं है!

कक्षा के स्थिर तरीकों को कॉल कर सकते हैं

प्रोग्राम में कहीं से भी स्टेटिक मेथड्स को कॉल किया जा सकता है। इसका मतलब यह है कि उन्हें स्थैतिक तरीकों और साधारण दोनों तरीकों से बुलाया जा सकता है। यहां कोई प्रतिबंध नहीं हैं।

कक्षा के सामान्य चरों तक पहुँच सकते हैं

thisआप किसी वर्ग के सामान्य चर को सामान्य विधि से एक्सेस कर सकते हैं, क्योंकि यह आसानी से निहित पैरामीटर के माध्यम से वर्ग के उदाहरण का संदर्भ प्राप्त कर सकता है।

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

नतीजतन, स्थैतिक विधियां कक्षा के सामान्य चर तक नहीं पहुंच सकती हैं।

मान लीजिए कि एक स्थिर विधि एक सामान्य विधि कहती है। उस सामान्य विधि को किस वस्तु पर बुलाया जाना चाहिए?

स्थैतिक तरीके

किसी को नहीं मालूम! यही कारण है कि आप किसी ऑब्जेक्ट के संदर्भ में पास किए बिना किसी स्थिर विधि से सामान्य विधि को कॉल नहीं कर सकते हैं !

वर्ग के स्थिर चर तक पहुँच सकते हैं

स्टैटिक वेरिएबल्स को कॉल करने की स्थिति स्टैटिक मेथड्स को कॉल करने जैसी ही है। स्टैटिक वेरिएबल्स को प्रोग्राम में कहीं से भी एक्सेस किया जा सकता है। इसका मतलब है कि आप उन्हें स्थिर और सामान्य तरीकों से एक्सेस कर सकते हैं।

किसी वस्तु पर बुलाया जा सकता है

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

कोड संकलक इसे कैसे देखता है
Thread th = Thread.current();
th.sleep(1000);
Thread th = Thread.current();
Thread.sleep(1000);
Integer i = 1;
int x = i.parseInt("12");
Integer i = 1;
int x = Integer.parseInt("12");
"".valueOf(12);
String.valueOf(12);

क्लास में बुलाया जा सकता है

आप कक्षा में केवल एक स्थिर विधि को कॉल कर सकते हैं। सामान्य विधि को कॉल करने के लिए, आपको कक्षा के उदाहरण के संदर्भ की आवश्यकता होती है। इसलिए, आप इस निर्माण का उपयोग करके एक सामान्य विधि नहीं कह सकते हैं:ClassName.methodName(arguments)