2010-12-06 9 views
7

मैं कम स्तर पर समझता हूं कि स्थिर (संकलित समय) और गतिशील (रनटाइम) बाइंडिंग हैं।कैसे समझें कि एक व्यवहार जावा में स्थिर या गतिशील बाध्यकारी का उपयोग करेगा या नहीं?

मैं कुछ हद तक समझता हूं कि यह जानना महत्वपूर्ण क्यों है (उदाहरण के लिए, जेनेरिकों का संकल्प स्थिर रूप से हल किया गया है यह समझाने में मदद करता है कि आप क्या कर सकते हैं और नहीं कर सकते हैं)।

जो मुझे समझ में नहीं आता है, क्यों विकल्प एक या दूसरे तरीके से किए गए थे - उदाहरण के लिए, जावा अधिभारित विधियों के लिए स्थिर बाध्यकारी का उपयोग करता है, और ओवरराइड किए गए लोगों के लिए गतिशील बाध्यकारी का उपयोग करता है। ऐसा क्यों है? क्या यह एक डिज़ाइन पसंद है, क्या यह ऐसा कुछ है जो जावा के गहरे कामकाज को समझने वाले लोगों के लिए स्पष्ट और अपरिहार्य है, या क्या इसे सीखने की आवश्यकता है (समझने के बजाय)?

उत्तर

3

सवाल यह है कि कंपाइलर को ओवरराइडिंग के मामले में संकलन समय के दौरान किस विधि को कॉल करने के बारे में पता चल सकता है। आप इस बात को समझ जाना चाहिए,

List list = list.getAList(); 
list.add(whatever); 

अब, मान लीजिए getAList() विधि के कई List कार्यान्वयन कुछ मानदंडों के आधार पर के किसी भी लौट सकते हैं। इस प्रकार, एक कंपाइलर कैसे पता लगा सकता है कि क्या कार्यान्वयन वापस किया जाता है? और कॉल करने के लिए add() विधि। जैसा कि आप देख सकते हैं, यह केवल रनटाइम पर ही तय किया जा सकता है। जबकि, मामले को अधिभारित करने में और संकलन समय पर सब कुछ स्पष्ट है। मुझे आशा है कि अब आप इस बात को समझ लेंगे।

[संपादित]

चर्चा वास्तविक जवाब देने के लिए टिप्पणी में चल रहा लाना।

इसे रनटाइम तक नहीं जाना जा सकता है। इसे इस तरह समझें, किसी विशेष वर्ग का त्वरण उपयोगकर्ता द्वारा प्रदान किए गए तर्क पर निर्भर है। अब मुझे बताएं कि कंपाइलर कैसे पता चलेगा कि उपयोगकर्ता कौन सा तर्क पारित करेगा, और जाहिर है कि किस वर्ग को तुरंत चालू किया जाए। या अभी भी आसान है, इस सवाल का जवाब दें कि कैसे संकलक को पता चलेगा कि प्रवाह if ब्लॉक या else ब्लॉक पर भेजा जाएगा या नहीं? या आपको क्यों लगता है कि हमने चेक और रनटाइम अपवाद हैं? divide-by-zero का मामला लें; उदाहरण के लिए n/m, जहां m कुछ गणना के परिणामस्वरूप 0 बन जाता है। इस मामले में, यह स्पष्ट है कि संकलक यह कहने में सक्षम नहीं होगा कि ArithmeticException होगा क्योंकि m तुरंत ज्ञात नहीं है। चूंकि ये सभी जानकारी संकलन समय पर उपलब्ध नहीं हैं, इस प्रकार कंपाइलर, इसी तरह, यह नहीं जानता कि कौन सी विधि ओवरराइड करेगा।

+0

ठीक है, लेकिन यह क्यों है कि जेवीएम पता कर सकता है, लेकिन संकलक नहीं? – JDelage

+0

@JDelage: क्योंकि इसे रनटाइम तक नहीं जाना जा सकता है। मान लीजिए इस तरह, किसी विशेष वर्ग का तत्कालता उपयोगकर्ता द्वारा प्रदान किए गए तर्क पर निर्भर है।अब मुझे बताएं कि कंपाइलर कैसे पता चलेगा कि उपयोगकर्ता कौन सा तर्क पारित करेगा, और जाहिर है कि किस वर्ग को तुरंत चालू किया जाए। या फिर भी आसान, इस सवाल का जवाब दें कि कैसे संकलक को पता चलेगा कि प्रवाह 'if' ब्लॉक या' else' ब्लॉक में पारित किया जाएगा या नहीं? या आपको क्यों लगता है कि हमने चेक और रनटाइम अपवाद हैं? इसी प्रकार, यह संकलन समय पर ज्ञात नहीं होगा। इस प्रकार, हम इसे देर से बाध्यकारी कहते हैं। –

+0

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

1

गतिशील बाध्यकारी तब होती है जब आप विधियों को ओवरराइड करते हैं क्योंकि इसे रनटाइम पर निर्णय लेने की आवश्यकता होगी कि ऑब्जेक्ट के रनटाइम प्रकार के आधार पर निष्पादित करने के लिए विधि (कोड)। एक अधिभारित विधि के साथ आपको रनटाइम पर निर्णय लेने की आवश्यकता नहीं है, आप संकलन समय पर पता लगा सकते हैं, जिसे विधि कहा जाएगा। इसके परिणामस्वरूप तेजी से निष्पादन होगा।

+0

जो मुझे समझ में नहीं आता है, अगर मैं किसी ऑब्जेक्ट का विस्तार करता हूं और इसकी विधियों को ओवरराइड करता हूं, तो संकलक को यह क्यों पता नहीं चल सकता है (वस्तु का सटीक प्रकार और इसलिए इसकी विधियों की परिभाषा)? – JDelage

0

मेरे हिसाब से मैं लगता है कि यह obious कारण पर है ... ओवरलोडिंग जो कुछ complilor complile समय और अधिभावी दौरान समझ में लेट बाइंडिंग या क्रम है .... समझौता OOP अवधारणा आप मदद कर सकते हैं ..