दिलचस्प पोस्ट
पायथन: "..% (var) s .." का प्रयोग कर रहा है% स्थानीय लोगों () एक अच्छा अभ्यास है? एक स्ट्रिंग में वर्ण घटनाओं की गणना करने का आसान तरीका स्पार्क आरडीडी और / या स्पार्क डेटाफ़्रेम में डेटा को फिर से स्थानांतरित / पिवट करना स्ट्रिंग स्ट्रीम, स्ट्रिंग, और चार * रूपांतरण भ्रम PyAudio काम कर रहा है, लेकिन हर बार त्रुटि संदेश बाहर spits पायथन स्ट्रिंग में HTML संस्थाओं को डिकोड करें? जावा में एक HTTP GET कैसे करूँ? वेब ब्राउज़र की कुकी की कुंजी का अधिकतम आकार क्या है? ओरेकल डाटाबेस लिंक – MySQL समतुल्य? JQuery.browser का उपयोग कर सफ़ारी से क्रोम को भेद जावा का उपयोग करके आईपी स्थान अजगर ओपनसीवी रंग ट्रैकिंग PDO परिणाम में सरणी पॉइंटर को रीसेट करना ऐसी फाइल लोड नहीं कर सकता- बंडलर / सेटअप (लोड एर्रर) दो वर्षों में महीने के आखिरी दिन का अनुक्रम जनरेट करें

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

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

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

लेकिन यह त्रुटि दी

स्थैतिक विधि मुख्य में गैर-स्थिर फ़ील्ड तक पहुंच नहीं सकते हैं

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

 static Clock clock = new Clock(); 

और यह काम किया घोषणा से पहले उस कीवर्ड को डालने का क्या अर्थ है? उस ऑब्जेक्ट के साथ क्या किया जा सकता है, यह वास्तव में क्या करेगी और / या प्रतिबंधित करेगा?

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

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

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

चूंकि static विधियां भी एक विशिष्ट उदाहरण से संबंधित नहीं हैं, वे उदाहरण के सदस्यों को नहीं देख सकते (आप किस तरह से जानते हैं कि नमस्ते क्लास किस प्रकार का उल्लेख करना चाहते हैं?)। 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; } 

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

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

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

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

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

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

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


पक्षीय लेख

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

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

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

 // Clearer Thread.sleep(5000); 

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

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

स्थैतिक तरीकों का प्रयोग किसी वस्तु को तत्काल के बिना किया जा सकता है।

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

 Hello.main(new String[]()) 

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

 Hello h = new Hello(); h.main(new String[]()); 

संपादित करें

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

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

 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"; 

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

जावा में स्थिर:

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

स्टेटिक कीवर्ड के साथ उपयोग किया जा सकता है:

तरीका

परिवर्तनशील

एक अन्य कक्षा के भीतर कक्षा में नेस्टेड

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

इसके साथ प्रयोग नहीं किया जा सकता है:

वर्ग (नेस्टेड नहीं)

निर्माता

इंटरफेस

विधि स्थानीय आंतरिक कक्षा (अंतर तो नेस्टेड वर्ग)

आंतरिक कक्षा के तरीकों

आवृत्ति के चर

स्थानीय चर

उदाहरण:

निम्न उदाहरण की कल्पना करें जिसमें एक नाम का चर नामित नाम है जो कन्स्ट्रक्टर में वृद्धि हुई है:

 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(); } } 

आउटपुट:

1 1 1

चूंकि उदाहरण वैरिएबल ऑब्जेक्ट सृजन के समय मेमोरी हो जाता है, प्रत्येक ऑब्जेक्ट में आवृत्ति चर की प्रतिलिपि होगी, अगर यह बढ़ता है, तो वह अन्य ऑब्जेक्ट्स को प्रतिबिंबित नहीं करेगा।

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

 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(); } } 

आउटपुट:

1 2 3

इस मामले में स्थिर चर स्मृति को केवल एक बार मिलेगा, यदि कोई ऑब्जेक्ट स्थिर वैरिएबल के मूल्य में परिवर्तन करता है, तो इसका मूल्य उसके पास रखेगा।

अंतिम के साथ स्थिर:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

कीवर्ड 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(); } } 

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

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

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

यहां मुख्य स्थिर तरीका है और स्थिर विधि के दो मुख्य प्रतिबंध हैं:

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

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

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

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

 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"); } } 

स्टेटिक वैरिएबल्स को केवल स्थिर तरीके से ही पहुंचा जा सकता है, इसलिए जब हम स्थिर चर घोषित करते हैं तो उन गुणा और सेटटर तरीके स्थिर तरीके होंगे

स्थैतिक तरीकों एक वर्ग स्तर है, जो हम कक्षा नाम का उपयोग कर सकते हैं

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

 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; } } 

जब कुछ प्रोजेक्ट चलाते हैं, तो सबसे पहले स्थिर चीजों (चर, विधियों, ब्लॉक ..) को लोड करते हैं।

जब इस प्रोजेक्ट को मुख्य विधि लोड पहले चलाते हैं इसकी static method क्योंकि तो यह वस्तु "a" object देखता है। क्योंकि इसकी गैर स्थिर फिर इस त्रुटि की तरह आओ।