सबसे पहले, एक पहेली: निम्नलिखित कोड क्या प्रिंट करता है?
public class RecursiveStatic {
public static void main(String[] args) {
System.out.println(scale(5));
}
private static final long X = scale(10);
private static long scale(long value) {
return X * value;
}
}
उत्तर:
0
नीचे स्पॉइलर।
आप प्रिंट अगर X
पैमाने (लंबी) और फिर से परिभाषित में X = scale(10) + 3
, प्रिंट हो जाएगा X = 0
तो X = 3
। इसका मतलब यह है कि X
अस्थायी रूप से सेट किया गया है 0
और बाद में सेट किया गया है 3
। यह का उल्लंघन है final
!
स्थिर संशोधक, अंतिम संशोधक के संयोजन में, स्थिरांक को परिभाषित करने के लिए भी उपयोग किया जाता है। अंतिम संशोधक इंगित करता है कि इस क्षेत्र का मान नहीं बदल सकता है ।
स्रोत: https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html [जोर]
मेरा प्रश्न: यह एक बग है? क्या final
बीमार परिभाषित है?
यहाँ वह कोड है जिसमें मुझे दिलचस्पी है,
X
दो अलग-अलग मान असाइन किए गए हैं: 0
और 3
। मेरा मानना है कि यह एक उल्लंघन है final
।
public class RecursiveStatic {
public static void main(String[] args) {
System.out.println(scale(5));
}
private static final long X = scale(10) + 3;
private static long scale(long value) {
System.out.println("X = " + X);
return X * value;
}
}
इस सवाल को जावा स्टैटिक फाइनल फील्ड इनिशियलाइज़ेशन ऑर्डर के संभावित डुप्लिकेट के रूप में चिह्नित किया गया है । मेरा मानना है कि यह प्रश्न एक डुप्लिकेट नहीं है क्योंकि अन्य प्रश्न आरंभीकरण के आदेश को संबोधित करते हैं जबकि मेरा प्रश्न final
टैग के साथ एक चक्रीय आरंभीकरण को संबोधित करता है । अकेले दूसरे प्रश्न से, मैं यह नहीं समझ पाऊँगा कि मेरे प्रश्न का कोड त्रुटि क्यों नहीं करता है।
यह विशेष रूप से उस आउटपुट को देखकर स्पष्ट होता है जो ernesto को प्राप्त होता है: जब a
उसे टैग किया final
जाता है, तो वह निम्न आउटपुट प्राप्त करता है:
a=5
a=5
जो मेरे प्रश्न का मुख्य भाग शामिल नहीं करता है: एक final
चर अपने चर को कैसे बदलता है?
A blank final instance variable must be definitely assigned (§16.9) at the end of every constructor (§8.8) of the class in which it is declared; otherwise a compile-time error occurs.
X
सदस्य को संदर्भित करने का यह तरीका सुपर क्लास कंस्ट्रक्टर के समाप्त होने से पहले एक उपवर्ग के सदस्य को संदर्भित करने जैसा है, यह आपकी समस्या है और इसकी परिभाषा नहीं हैfinal
।