मैं कम स्तर पर समझता हूं कि स्थिर (संकलित समय) और गतिशील (रनटाइम) बाइंडिंग हैं।कैसे समझें कि एक व्यवहार जावा में स्थिर या गतिशील बाध्यकारी का उपयोग करेगा या नहीं?
मैं कुछ हद तक समझता हूं कि यह जानना महत्वपूर्ण क्यों है (उदाहरण के लिए, जेनेरिकों का संकल्प स्थिर रूप से हल किया गया है यह समझाने में मदद करता है कि आप क्या कर सकते हैं और नहीं कर सकते हैं)।
जो मुझे समझ में नहीं आता है, क्यों विकल्प एक या दूसरे तरीके से किए गए थे - उदाहरण के लिए, जावा अधिभारित विधियों के लिए स्थिर बाध्यकारी का उपयोग करता है, और ओवरराइड किए गए लोगों के लिए गतिशील बाध्यकारी का उपयोग करता है। ऐसा क्यों है? क्या यह एक डिज़ाइन पसंद है, क्या यह ऐसा कुछ है जो जावा के गहरे कामकाज को समझने वाले लोगों के लिए स्पष्ट और अपरिहार्य है, या क्या इसे सीखने की आवश्यकता है (समझने के बजाय)?
ठीक है, लेकिन यह क्यों है कि जेवीएम पता कर सकता है, लेकिन संकलक नहीं? – JDelage
@JDelage: क्योंकि इसे रनटाइम तक नहीं जाना जा सकता है। मान लीजिए इस तरह, किसी विशेष वर्ग का तत्कालता उपयोगकर्ता द्वारा प्रदान किए गए तर्क पर निर्भर है।अब मुझे बताएं कि कंपाइलर कैसे पता चलेगा कि उपयोगकर्ता कौन सा तर्क पारित करेगा, और जाहिर है कि किस वर्ग को तुरंत चालू किया जाए। या फिर भी आसान, इस सवाल का जवाब दें कि कैसे संकलक को पता चलेगा कि प्रवाह 'if' ब्लॉक या' else' ब्लॉक में पारित किया जाएगा या नहीं? या आपको क्यों लगता है कि हमने चेक और रनटाइम अपवाद हैं? इसी प्रकार, यह संकलन समय पर ज्ञात नहीं होगा। इस प्रकार, हम इसे देर से बाध्यकारी कहते हैं। –
@JDelage: अधिक आम तौर पर, [रोकथाम समस्या] (http://en.wikipedia.org/wiki/Halting_problem) हमें बताती है कि कोड का विश्लेषण करके बस कौन सा कोड करने जा रहा है यह अनुमान लगाने का कोई सामान्य तरीका नहीं है (और इसे नहीं चला रहा है)। सभी कंपाइलर कोड का विश्लेषण कर सकते हैं; JVM इसे चलाने के लिए ज़िम्मेदार है। इस प्रकार, संकलक यह नहीं जानता कि यह कौन सा कोड पथ 'list.getAList() 'के माध्यम से ले जाएगा, और सामान्य रूप से, यह तब तक नहीं चल सकता जब तक यह चल रहा न हो। एक बार कोड चलने के बाद, जेवीएम कदम उठा सकता है और गतिशील बाध्यकारी प्रदर्शन कर सकता है। –