सामान्य तौर पर, का staticअर्थ है " प्रकार के साथ जुड़ा हुआ है, बजाय एक उदाहरण के ।"
इसका मतलब है कि आप कभी भी प्रकार के उदाहरणों को बनाए बिना एक स्थिर चर का संदर्भ दे सकते हैं, और चर का संदर्भ देने वाला कोई भी कोड सटीक समान डेटा का संदर्भ दे रहा है। एक उदाहरण चर के साथ इसकी तुलना करें: उस स्थिति में, कक्षा के प्रति चर का एक स्वतंत्र संस्करण है। उदाहरण के लिए:
Test x = new Test();
Test y = new Test();
x.instanceVariable = 10;
y.instanceVariable = 20;
System.out.println(x.instanceVariable);
प्रिंट 10: y.instanceVariableऔर x.instanceVariableअलग हैं, क्योंकि xऔरy अलग ऑब्जेक्ट्स को संदर्भित करते हैं।
आप स्थैतिक सदस्यों को संदर्भों के माध्यम से संदर्भित कर सकते हैं, हालांकि ऐसा करना एक बुरा विचार है। अगर हमने किया:
Test x = new Test();
Test y = new Test();
x.staticVariable = 10;
y.staticVariable = 20;
System.out.println(x.staticVariable);
तब वह 20 का प्रिंट आउट लेगा - केवल एक ही चर है, प्रति उदाहरण एक नहीं। इसे इस प्रकार लिखना स्पष्ट होगा:
Test x = new Test();
Test y = new Test();
Test.staticVariable = 10;
Test.staticVariable = 20;
System.out.println(Test.staticVariable);
यह व्यवहार को और अधिक स्पष्ट करता है। आधुनिक आईडीई आमतौर पर दूसरी लिस्टिंग को तीसरे में बदलने का सुझाव देगा।
निम्न की तरह मूल्य को इनिशियलाइज़ करने के लिए इनलाइन डिक्लेरेशन होने का कोई कारण नहीं है, क्योंकि प्रत्येक उदाहरण का अपना होगा NUMBER लेकिन हमेशा एक ही मूल्य के साथ (यह अपरिवर्तनीय है और शाब्दिक रूप से प्रारंभिक है)। final staticसभी उदाहरणों के लिए केवल एक चर होने की तुलना में यह समान है ।
private final int NUMBER = 10;
इसलिए यदि यह नहीं बदल सकता है, तो प्रति उदाहरण एक प्रति होने का कोई मतलब नहीं है।
लेकिन, यह समझ में आता है कि क्या इस तरह से एक निर्माणकर्ता में इनिशियलाइज़ किया गया है:
// No initialization when is declared
private final int number;
public MyClass(int n) {
// The variable can be assigned in the constructor, but then
// not modified later.
number = n;
}
अब, प्रत्येक उदाहरण के लिए MyClass, हमारे पास एक अलग लेकिन अपरिवर्तनीय मूल्य हो सकता है number।