एक कोड है जो जूनियर जावा डेवलपर्स के लिए एक कार्य के रूप में दिया जाता है। मैं पांच वर्षों के दौरान जावा का उपयोग करें और कोड के इस टुकड़े पूरी तरह से मुझे भ्रमित:जावा: ऑब्जेक्ट का प्रारंभिक अनुक्रम
public class Main {
String variable;
public static void main(String[] args) {
System.out.println("Hello World!");
B b = new B();
}
public Main(){
printVariable();
}
protected void printVariable(){
variable = "variable is initialized in Main Class";
}
}
public class B extends Main {
String variable = null;
public B(){
System.out.println("variable value = " + variable);
}
protected void printVariable(){
variable = "variable is initialized in B Class";
}
}
उत्पादन होगा:
Hello World!
variable value = null
लेकिन अगर हम String variable = null;
String variable;
को बदलने हम होगा:
Hello World!
variable value = variable is initialized in B Class
दूसरा आउटपुट मेरे लिए अधिक स्पष्ट है। तो, जहाँ तक मैं इस तरह जावा में inizialisation के अनुक्रम पता है:
- हम वर्ग पदानुक्रम की जड़ तक जाना (जावा के लिए यह हमेशा वर्ग वस्तु है), जब हम इस रूट माता पिता वर्ग के लिए आते हैं :
- सभी स्थिर डेटा फ़ील्ड प्रारंभ किए गए हैं;
- सभी स्थिर फ़ील्ड प्रारंभकर्ता और स्थैतिक प्रारंभिक ब्लॉक निष्पादित किए जाते हैं;
- सभी गैर-स्थैतिक डेटा फ़ील्ड प्रारंभ किए गए हैं;
- सभी गैर स्थैतिक क्षेत्र प्रारंभकर्ता और गैर स्थैतिक प्रारंभिक ब्लॉक निष्पादित किए जाते हैं;
- डिफ़ॉल्ट कन्स्ट्रक्टर निष्पादित किया गया है;
- फिर हम अंतर्निहित बाल वर्ग की प्रक्रिया को दोहराते हैं।
इसके अलावा पोस्ट जो एक सुपर क्लास के संदर्भ में this
कीवर्ड के व्यवहार का वर्णन करता है - Calling base class overridden function from base class method
ऊपर दिए गए नियमों के आधार पर, मैं इस तरह अनुक्रम के लिए मान लेते हैं:
- हम कक्षा
B
का एक नया उदाहरण बनाने जा रहे हैं; - हम भाग वर्ग
Main
पर जाते हैं; - शून्य के साथ
main.variable
आरंभ करें; - फिर हम वर्ग
Main
के डिफ़ॉल्ट कन्स्ट्रक्टर पर जाते हैं; - कन्स्ट्रक्टर कॉल कक्षा
Main
में कॉल करता है; (ऐसा क्यों हैmain.printvariable
फोन नहीं करता है हमthis
कुंजी शब्द यहाँ नहीं है?।) - क्षेत्र
b.variable
"चर बी क्लास में आरंभ नहीं हो जाता" - अब हम वर्ग
B
वापस आने; - हमें शून्य मान के साथ क्षेत्र
b.variable
प्रारंभ करना चाहिए, क्या मैं सही हूँ? - वर्ग
B
के डिफ़ॉल्ट निर्माता
कृपया मार डाला, किसी को कैसे इस विरासत inizialisation अनुक्रम काम करता है की एक पूरी और पूर्ण विवरण दे सकते हैं।और String variable = null;
से String variable;
क्यों बदल रहा है एक और आउटपुट की ओर जाता है।
printVariable (किराए पर नहीं है तो क्या होगा सकते हैं) एक बहुत भ्रामक विधि का नाम है - (setVariable की तरह अधिक होना चाहिए) – Jimmt
आप 5 साल के लिए जावा लिख रहे हैं और आपको नहीं पता कि डीबगर का उपयोग कैसे करें? (आपके कोड के माध्यम से कदम आपको दिखाएगा कि क्या हो रहा है और किस क्रम में)। –
@BrianRoach निश्चित रूप से मैं डीबगर का उपयोग कर सकता हूं और मैंने javap -v -c bclass भी कोशिश की। लेकिन हर बार जब मैं जावा डेवलपर या साक्षात्कार के सवालों के लिए ऐसे कार्यों को देखता हूं, तो मैं आउटपुट की भविष्यवाणी करने और इसे समझने की कोशिश करता हूं, यह ऐसा क्यों काम करता है और यदि मैं कोड को थोड़ा संशोधित करता हूं तो क्या होता है। के माध्यम से कदम नियम और निष्पादन प्रक्रिया के कारण की व्याख्या नहीं करता है। – INlHELL