के बाद से आप पहले से ही मामले 1, 3 समझते हैं, और 4, के मामले से निपटने जाने 2.
(कृपया ध्यान दें - मैं कर रहा हूँ कोई JVM या compilers की अंदरूनी कामकाज पर एक विशेषज्ञ का मतलब द्वारा, लेकिन यह कैसे है मैं इसे समझता हूं। अगर कोई इसे पढ़ता है तो वह एक जेवीएम विशेषज्ञ है, तो आपको किसी भी विसंगति के इस जवाब को संपादित करने में संकोच न करें।)
एक उप-वर्ग में एक विधि जिसमें एक ही नाम है लेकिन एक अलग हस्ताक्षर विधि अधिभार के रूप में जाना जाता है । विधि अधिभार स्थिर स्थिर बाध्यकारी का उपयोग करता है, जिसका मूल रूप से मतलब है कि उचित विधि को संकलित समय पर "चुने गए" (यानी बाध्य) होने के लिए मजबूर किया जाएगा। कंपाइलर के पास आपके ऑब्जेक्ट्स के रनटाइम प्रकार (उर्फ वास्तविक प्रकार) के बारे में कोई जानकारी नहीं है।तो जब आप लिखते हैं:
// Reference Type // Actual Type
Sub sub = new Sub(); // Sub Sub
Top top = sub; // Top Sub
कंपाइलर केवल "जानता है" शीर्ष शीर्ष प्रकार (उर्फ संदर्भ प्रकार) है। तो जब आप बाद में लिखें:
System.out.println(top.f(str)); // Prints "subobj"
संकलक शीर्ष वर्ग के च विधि की चर्चा करते हुए के रूप में "देखता है" कॉल 'top.f'। यह "जानता है" कि str स्ट्रिंग प्रकार है जो ऑब्जेक्ट को बढ़ाता है। तो 1 से) कॉल 'top.f' शीर्ष श्रेणी की एफ विधि को संदर्भित करता है, 2) कक्षा शीर्ष में कोई एफ विधि नहीं है जो स्ट्रिंग पैरामीटर लेता है, और 3) चूंकि स्ट्र ऑब्जेक्ट का उप-वर्ग है, शीर्ष श्रेणी की f विधि संकलन समय पर एकमात्र वैध विकल्प है। तो संकलक स्पष्ट रूप से अपने मूल प्रकार, ऑब्जेक्ट को str को अपमानित करता है, इसलिए इसे शीर्ष की विधि में पारित किया जा सकता है। (यह गतिशील बाध्यकारी के विपरीत है, जहां कोड की उपरोक्त रेखा का प्रकार संकल्प को संकलक के बजाए जेवीएम द्वारा हल करने के लिए रनटाइम तक स्थगित कर दिया जाएगा।)
फिर रनटाइम पर, कोड की उपरोक्त पंक्ति में , शीर्ष पर जेवीएम द्वारा वास्तविक प्रकार, उप। हालांकि, ऑब्जेक्ट टाइप करने के लिए कंपाइलर द्वारा तर्क स्ट्र को उकसाया गया है। तो अब JVM को कक्षा उप में एक f विधि को कॉल करना है जो ऑब्जेक्ट प्रकार का पैरामीटर लेता है।
इसलिए, कोड की उपरोक्त पंक्ति "उप" के बजाय "subobj" प्रिंट करती है।
एक और बहुत समान उदाहरण के लिए, कृपया देखें: Java dynamic binding and method overriding
अद्यतन: मिले JVM की अंदरूनी कामकाज पर इस विस्तृत लेख:
http://www.artima.com/underthehood/invocationP.html
मैं इसे और अधिक स्पष्ट करने के लिए अपने कोड टिप्पणी की क्या हो रहा है:
class Top {
public String f(Object o) {return "Top";}
}
class Sub extends Top {
public String f(String s) {return "Sub";} // Overloading = No dynamic binding
public String f(Object o) {return "SubObj";} // Overriding = Dynamic binding
}
public class Test {
public static void main(String[] args) {
// Reference Type Actual Type
Sub sub = new Sub(); // Sub Sub
Top top = sub; // Top Sub
String str = "Something"; // String String
Object obj = str; // Object String
// At Compile-Time: At Run-Time:
// Dynamic Binding
System.out.println(top.f(obj)); // Top.f (Object) --> Sub.f (Object)
// Dynamic Binding
System.out.println(top.f(str)); // Top.f (Object) --> Sub.f (Object)
// Static Binding
System.out.println(sub.f(obj)); // Sub.f (Object) Sub.f (Object)
// Static Binding
System.out.println(sub.f(str)); // Sub.f (String) Sub.f (String)
}
}
अब मुझे पता चला कि पहली पंक्ति कैसे काम करती है, लेकिन दूसरी पंक्ति कैसे Subobbj को प्रिंट करती है, भले ही इसमें कॉल कॉल top.f (str) जहां str स्ट्रिंग का एक प्रकार है? – user482594
मैंने एक उत्तर पोस्ट किया, क्या आपने इसे देखा। यह आपके संदेहों को हल करना चाहिए। उत्तीर्ण तर्क के लिए "टाइप चेक" के बिंदु से सोचने के लिए सारांशित करें। अगर आपको यह उपयोगी लगता है तो कृपया उत्तर स्वीकार करें .. –