मैं हमेशा के बीच उलझन में हूँ staticऔर finalकीवर्ड में जावा ।
वे कैसे अलग हैं ?
मैं हमेशा के बीच उलझन में हूँ staticऔर finalकीवर्ड में जावा ।
वे कैसे अलग हैं ?
जवाबों:
आइए पहले स्थिर चर और स्थिर तरीकों को देखें।
Class.variableClass.methodName() thisया superकीवर्ड को संदर्भित नहीं कर सकती है।जावा में "स्टैटिक नेस्टेड क्लासेस" भी हैं। एक स्थिर नेस्टेड क्लास सिर्फ एक है जो बाहरी वर्ग की आवृत्ति का संदर्भ नहीं देता है।
स्टेटिक नेस्टेड क्लासेस में इंस्टेंस मेथड्स और स्टैटिक मेथड्स हो सकते हैं।
जावा में शीर्ष स्तर के स्थिर वर्ग जैसी कोई चीज नहीं है।
मुख्य विधि है
staticक्योंकि यह किसी भी तात्कालिकता होने से पहले आवेदन के लिए सुलभ होना चाहिए।
final किसी इकाई को परिभाषित करने के लिए कई अलग-अलग संदर्भों में कीवर्ड का उपयोग किया जाता है जिसे बाद में बदला नहीं जा सकता।एक finalवर्ग को उपवर्गित नहीं किया जा सकता है। यह सुरक्षा और दक्षता के कारणों के लिए किया जाता है। तदनुसार, कई जावा मानक पुस्तकालय कक्षाएं हैं final, उदाहरण के लिए java.lang.Systemऔर java.lang.String। एक finalकक्षा में सभी तरीके निहित हैं final।
एक finalविधि उपवर्गों द्वारा ओवरराइड नहीं की जा सकती। इसका उपयोग एक उप-वर्ग में अप्रत्याशित व्यवहार को रोकने के लिए किया जाता है ताकि एक विधि में परिवर्तन हो जो फ़ंक्शन या कक्षा की स्थिरता के लिए महत्वपूर्ण हो।
एक finalवेरिएबल को केवल एक बार इनिशियलाइज़र या असाइनमेंट स्टेटमेंट के माध्यम से शुरू किया जा सकता है। घोषणा के बिंदु पर इसे आरंभ करने की आवश्यकता नहीं है: इसे एक blank finalचर कहा जाता है । एक वर्ग का रिक्त अंतिम उदाहरण चर निश्चित रूप से उस वर्ग के प्रत्येक निर्माता के अंत में सौंपा जाना चाहिए जिसमें यह घोषित किया गया है; इसी तरह, एक खाली अंतिम स्थिर चर को निश्चित रूप से उस वर्ग के स्थिर इनिशियलाइज़र में असाइन किया जाना चाहिए जिसमें यह घोषित किया गया है; अन्यथा, दोनों मामलों में एक संकलन-समय त्रुटि होती है।
जब एक अनाम आंतरिक वर्ग को एक विधि के शरीर के भीतर परिभाषित किया जाता है, तो finalउस विधि के दायरे में घोषित सभी चर भीतर के वर्ग से सुलभ होते हैं। एक बार इसे असाइन करने के बाद, अंतिम चर का मान नहीं बदल सकता है।
Class.methodName()
स्थैतिक का अर्थ है कि यह एक उदाहरण नहीं वर्ग के अंतर्गत आता है, इसका मतलब यह है कि किसी विशेष वर्ग के सभी उदाहरणों के बीच साझा किए गए उस चर / विधि की केवल एक प्रति है ।
public class MyClass {
public static int myVariable = 0;
}
//Now in some other code creating two instances of MyClass
//and altering the variable will affect all instances
MyClass instance1 = new MyClass();
MyClass instance2 = new MyClass();
MyClass.myVariable = 5; //This change is reflected in both instances
फाइनल पूरी तरह से असंबंधित है, यह एक बार केवल आरंभीकरण को परिभाषित करने का एक तरीका है। आप या तो चर को परिभाषित कर सकते हैं या कंस्ट्रक्टर के भीतर, कहीं और नहीं।
नोट अंतिम विधियों और अंतिम कक्षाओं पर एक नोट, यह स्पष्ट रूप से कहा गया है कि विधि या वर्ग को क्रमशः ओवरराइड या विस्तारित नहीं किया जा सकता है।
अतिरिक्त पढ़ना तो स्थैतिक के विषय पर, हम अन्य उपयोगों के बारे में बात कर रहे थे, यह कभी-कभी स्थैतिक ब्लॉकों में उपयोग किया जाता है। स्थैतिक चर का उपयोग करते समय, कक्षा का उपयोग करने से पहले इन चर को स्थापित करना कभी-कभी आवश्यक होता है, लेकिन दुर्भाग्य से आपको एक निर्माता नहीं मिलता है। यह वह जगह है जहाँ स्थैतिक कीवर्ड आता है।
public class MyClass {
public static List<String> cars = new ArrayList<String>();
static {
cars.add("Ferrari");
cars.add("Scoda");
}
}
public class TestClass {
public static void main(String args[]) {
System.out.println(MyClass.cars.get(0)); //This will print Ferrari
}
}
आपको यह उदाहरण इनिशियलाइज़र ब्लॉक के साथ भ्रमित नहीं करना चाहिए, जिसे प्रति इंस्ट्रक्टर कंस्ट्रक्टर से पहले कहा जाता है ।
final is entirely unrelated, it is a way of defining a once only initialization. You can either initialize when defining the variable or within the constructor, nowhere else.
दो वास्तव में समान नहीं हैं। staticफ़ील्ड ऐसे क्षेत्र हैं जो किसी वर्ग के किसी विशेष उदाहरण से संबंधित नहीं होते हैं ।
class C {
public static int n = 42;
}
यहाँ, staticक्षेत्र nकिसी विशेष उदाहरण के साथ नहीं जुड़ा है, Cलेकिन सामान्य रूप से पूरे वर्ग के साथ (जो कि C.nइसे एक्सेस करने के लिए इस्तेमाल किया जा सकता है)। क्या आप अभी भी Cएक्सेस करने के लिए इंस्टेंस का उपयोग कर सकते हैं n? हां - लेकिन इसे विशेष रूप से अच्छा अभ्यास नहीं माना जाता है।
final दूसरी ओर यह इंगित करता है कि एक विशेष चर को प्रारंभ होने के बाद बदल नहीं सकता है।
class C {
public final int n = 42;
}
यहां, nइसे फिर से असाइन नहीं किया जा सकता क्योंकि यह है final। एक अन्य अंतर यह है कि किसी भी चर को घोषित किया जा सकता है final, जबकि प्रत्येक चर को स्थिर नहीं घोषित किया जा सकता है।
इसके अलावा, कक्षाएं घोषित की जा सकती हैं finalजो इंगित करती हैं कि उन्हें बढ़ाया नहीं जा सकता है:
final class C {}
class B extends C {} // error!
इसी तरह, तरीकों को अंतिम रूप से यह घोषित करने के लिए घोषित किया जा सकता है कि वे एक विस्तारित वर्ग द्वारा अधिभूत नहीं हो सकते हैं :
class C {
public final void foo() {}
}
class B extends C {
public void foo() {} // error!
}
publicफ़ाइल को परिभाषित करने वाला संभावित वर्ग) या staticआंतरिक कक्षाएं staticचर को परिभाषित कर सकती हैं । अन्य आंतरिक वर्ग बाहरी वर्ग के उदाहरण हैं और इनमें स्थिर चर नहीं हो सकते।
अंतिम -
1) जब हम किसी वैरिएबल पर " फाइनल " कीवर्ड लागू करते हैं , तो उस वैरिएबल का मान स्थिर रहता है। (या) एक बार जब हम किसी चर को अंतिम घोषित कर देते हैं । उस चर का मूल्य नहीं बदला जा सकता है।
2) यह उपयोगी है जब एक कार्यक्रम के जीवन काल के दौरान एक चर मूल्य नहीं बदलता है
स्थिर -
1) जब हम " स्थिर " कीवर्ड को एक चर पर लागू करते हैं , तो इसका मतलब है कि यह कक्षा से संबंधित है।
2) जब हम किसी विधि पर " स्थैतिक " कीवर्ड लागू करते हैं , तो इसका मतलब है कि विधि को कक्षा के किसी भी उदाहरण को बनाए बिना पहुँचा जा सकता है
static कक्षा के सभी उदाहरणों द्वारा साझा की गई मेमोरी में चर की केवल एक प्रति है।
finalकीवर्ड सिर्फ मूल्य नहीं बदला जा सकता है। बिना final, कोई भी वस्तु चर के मूल्य को बदल सकती है।
स्टेटिक और फाइनल में कुछ बड़े अंतर हैं:
स्थैतिक चर या वर्ग हमेशा (बहुत अधिक) कहीं से भी उपलब्ध होंगे। फाइनल सिर्फ एक कीवर्ड है जिसका मतलब है कि एक वैरिएबल को नहीं बदला जा सकता है। तो अगर था:
public class Test{
public final int first = 10;
public static int second = 20;
public Test(){
second = second + 1
first = first + 1;
}
}
यह कार्यक्रम तब तक चलेगा जब तक कि यह "पहले" पूर्णांक को बदलने की कोशिश नहीं करता है, जो एक त्रुटि का कारण होगा। इस वर्ग के बाहर, आप केवल "पहले" चर तक पहुंच सकते हैं यदि आपने कक्षा को तत्काल तैयार किया था। यह "सेकंड" के विपरीत है, जो हर समय उपलब्ध है।
एक वक्ता की तरह एक वस्तु के बारे में सोचो। यदि स्पीकर एक वर्ग है, तो इसके अलग-अलग चर होंगे जैसे वॉल्यूम, ट्रेबल, बास, रंग आदि। आप स्पीकर क्लास को परिभाषित करते समय इन सभी क्षेत्रों को परिभाषित करते हैं। उदाहरण के लिए, आपने एक स्थिर संशोधक के साथ रंग क्षेत्र की घोषणा की, इसका मतलब है कि आप संकलक को बता रहे हैं कि इस चर की एक प्रति वास्तव में अस्तित्व में है, इस बात पर ध्यान दिए बिना कि कक्षा का कितनी बार त्वरित मूल्यांकन किया गया है।
घोषणा
static final String color = "Black";
यह सुनिश्चित कर लेगा कि जब भी इस वर्ग को त्वरित किया जाएगा, तब तक रंग क्षेत्र का मूल्य "काला" होगा जब तक कि इसे बदला नहीं जाता है।
public class Speaker {
static String color = "Black";
}
public class Sample {
public static void main(String args[]) {
System.out.println(Speaker.color); //will provide output as "Black"
Speaker.color = "white";
System.out.println(Speaker.color); //will provide output as "White"
}}
नोट: अब एक बार जब आप स्पीकर का रंग बदल देते हैं, तो अंतिम रूप से यह कोड अभ्यस्त नहीं होता है, क्योंकि अंतिम कीवर्ड यह सुनिश्चित करता है कि फ़ील्ड का मान कभी नहीं बदलता है।
public class Speaker {
static final String color = "Black";
}
public class Sample {
public static void main(String args[]) {
System.out.println(Speaker.color); //should provide output as "Black"
Speaker.color = "white"; //Error because the value of color is fixed.
System.out.println(Speaker.color); //Code won't execute.
}}
आप इस कोड को सीधे अपने एमुलेटर में कॉपी / पेस्ट कर सकते हैं और कोशिश कर सकते हैं।
आसान अंतर,
फाइनल : का मतलब है कि वेरिएबल का मूल्य फाइनल है और यह कहीं भी नहीं बदलेगा। यदि आप कहते हैं कि अंतिम x = 5 का अर्थ है कि x को नहीं बदला जा सकता है तो इसका मूल्य सभी के लिए अंतिम है।
स्थिर: का अर्थ है कि इसकी एक ही वस्तु है। मान लीजिए कि आपके पास x = 5 है, स्मृति में x = 5 है और एक कक्षा के अंदर मौजूद है। यदि आप कक्षा का एक ऑब्जेक्ट या उदाहरण बनाते हैं जिसका मतलब है कि एक विशिष्ट बॉक्स जो उस वर्ग और उसके चर और विधियों का प्रतिनिधित्व करता है। और यदि आप उस वर्ग का कोई अन्य ऑब्जेक्ट या उदाहरण बनाते हैं तो इसका मतलब है कि उसी वर्ग के दो बॉक्स हैं जो मेमोरी में उनके अंदर अलग-अलग x हैं। और यदि आप दोनों x को अलग-अलग स्थिति में कहते हैं और उनके मूल्य को बदलते हैं तो उनका मूल्य अलग होगा। बॉक्स 1 में x है जो x = 5 है और बॉक्स 2 में x = 6. है, लेकिन यदि आप x को स्थिर बनाते हैं तो इसका मतलब है कि इसे फिर से नहीं बनाया जा सकता है। आप कक्षा की वस्तु बना सकते हैं, लेकिन उस वस्तु में अलग x नहीं होगा। यदि x स्थिर है तो बॉक्स 1 और बॉक्स 2 दोनों में समान x होगा जिसका मान 5 है। हाँ, मैं स्थैतिक के मूल्य को बदल सकता हूँ जहाँ कोई भी अंतिम नहीं है। इसलिए अगर मैं कहता हूं कि बॉक्स 1 में x है और मैं इसके मान को x = 5 में बदलता हूं और उसके बाद मैं एक और बॉक्स बनाता हूं, जो बॉक्स 2 है और मैं बॉक्स 2 का मान बदलकर x = 6 कर देता हूं। तब जैसे X स्थिर है, दोनों बॉक्स में समान X है। और दोनों बॉक्स 6 के रूप में बॉक्स का मूल्य देंगे क्योंकि बॉक्स 2 5 से 6 के मूल्य को ओवरराइट करता है।
अंतिम और स्थिर दोनों बिल्कुल अलग हैं। फाइनल जो फाइनल है उसे बदला नहीं जा सकता। स्थिर जो एक के रूप में रहेगा लेकिन बदला जा सकता है।
"यह एक उदाहरण है। याद रखें कि स्थैतिक चर को हमेशा उनके वर्ग नाम से पुकारा जाता है। क्योंकि वे उस वर्ग की सभी वस्तुओं के लिए केवल एक होते हैं। इसलिए कक्षा A में x = 5 है, मैं इसे Ax = 6 से कॉल और बदल सकता हूं। "
स्टेटिक एक ऐसी चीज है जिसे क्लास में कोई भी ऑब्जेक्ट कॉल कर सकता है, जो स्वाभाविक रूप से ऑब्जेक्ट प्रकार के अंतर्गत आता है।
एक चर पूरे वर्ग के लिए अंतिम हो सकता है, और इसका मतलब है कि इसे अब और नहीं बदला जा सकता है। इसे केवल एक बार सेट किया जा सकता है, और इसे फिर से सेट करने की कोशिश करने के परिणामस्वरूप एक त्रुटि होगी। यह कई कारणों से उपयोगी है, शायद आप एक निरंतर घोषित करना चाहते हैं, जिसे बदला नहीं जा सकता है।
कुछ उदाहरण कोड:
class someClass
{
public static int count=0;
public final String mName;
someClass(String name)
{
mname=name;
count=count+1;
}
public static void main(String args[])
{
someClass obj1=new someClass("obj1");
System.out.println("count="+count+" name="+obj1.mName);
someClass obj2=new someClass("obj2");
System.out.println("count="+count+" name="+obj2.mName);
}
}
विकिपीडिया में जावा कीवर्ड की पूरी सूची है ।
मैं यहां पूरा जवाब देने की कोशिश नहीं करूंगा। मेरी सिफारिश यह समझने में होगी कि उनमें से प्रत्येक क्या करता है और फिर यह देखने के लिए क्लीयर होना चाहिए कि उनके प्रभाव पूरी तरह से अलग हैं और कभी-कभी उनका उपयोग एक साथ क्यों किया जाता है।
staticएक वर्ग (विशेषताओं और विधियों) के सदस्यों के लिए है और इसे उदाहरण (गैर स्थिर) सदस्यों के विपरीत समझा जाना चाहिए। मैं जावा ट्यूटोरियल में "अंडरस्टैंडिंग इंस्टेंस एंड क्लास मेंबर्स" पढ़ने की सलाह दूंगा। मुझे staticब्लॉकों में भी इस्तेमाल किया जा सकता है लेकिन मैं इसके बारे में चिंता नहीं करूंगा।
finalयदि चर, विधियों, कक्षाओं या कुछ अन्य मामलों पर लागू होता है, तो इसके अनुसार अलग-अलग अर्थ हैं। यहां मुझे विकिपीडिया स्पष्टीकरण बेहतर लगता है।
स्टेटिक वैरिएबल वैल्यूज को एप्लिकेशन के माध्यम से वैरिएबल ट्रैवर्स की एक प्रति प्राप्त की जा सकती है, जबकि फाइनल वेरिएबल वैल्यू को एक बार इनिशियलाइज़ किया जा सकता है और पूरे एप्लीकेशन में नहीं बदला जा सकता है।