polymorphism - Why is this Java method polymorphing by declared type and not runtime type? -


यह कोड:

  सार्वजनिक वर्ग PMTest {निजी स्थिर वर्ग रनर {} निजी स्थिर वर्ग सर्वर रनर {} प्राइवेट स्टैटिक क्लास टास्क {सार्वजनिक शून्य प्रतिनिधि (रनर धावक) {System.out.println ("टास्क:" + runner.getClass ()) को बढ़ाता है। GetName () + "/" + this.getClass ()। GetName ()); }} निजी स्टैटिक क्लास एक्शन में कार्य {सार्वजनिक शून्य प्रतिनिधि (सर्वर सर्वर) का विस्तार किया गया है {System.out.println ("क्रिया:" + server.getClass ()। GetName () + "/" + this.getClass ()। GetName ( )); }} निजी स्थिर शून्य foo (कार्य कार्य, धावक धावक) {task.delegate (धावक); } निजी स्थिर शून्य बार (कार्य कार्य, धावक धावक) {task.delegate (धावक); } निजी स्थिर शून्य बज़ (एक्शन टास्क, सर्वर धावक) {task.delegate (धावक); } सार्वजनिक स्थिर शून्य मुख्य (स्ट्रिंग [] args) {try {server server = new server ()} कार्रवाई कार्रवाई = नई कार्रवाई (); action.delegate (सर्वर); फू (एक्शन, सर्वर); बार (क्रिया, सर्वर); बाज़ (क्रिया, सर्वर); } कैच (थ्रोएबल टी) {टी .प्रिस्टस्टैकट्रेस (); }}}   

इस आउटपुट का उत्पादन करता है:

  $ java पीएमटीस्ट एक्शन: पीएमटीस्ट $ सर्वर / पीएमटीस्ट $ एक्शन टास्क: पीएमटीस्ट $ सर्वर / पीएमटीस्ट $ एक्शन टास्क : पीएमटीस्ट $ सर्वर / पीएमटीस्ट $ एक्शन एक्शन: पीएमटीस्ट $ सर्वर / पीएमटीस्ट $ एक्शन   

मैं बहुत स्पष्ट रूप से देख सकता हूँ कि कार्य की विधि क्रिया की विधि से चुने जा रही है I मुझे समझ में नहीं आता कि क्यों, ऑब्जेक्ट्स हमेशा यह जानते हैं कि वे क्या हैं और मैंने सोचा कि जावा की देर से बाध्यकारी विधि चयन विधि हस्ताक्षर में अंतर को अलग करने में सक्षम होगा। बार () को कॉल विशेष रूप से भ्रामक है, क्योंकि कार्य को उस बिंदु पर क्रिया घोषित किया जाता है।

यदि यह एक फर्क पड़ता है, यह जावा 6 है:

  $ जावा-वर्जन जावा संस्करण "1.6.0_14" जावा (टीएम) एसई रनटाइम एन्वायरमेंट (1.6.0_14-बी -08 का निर्माण) BEA JRockit (R) ) (R27.6.5-32_o-121899-1.6.0_14-20091001-2113-लिनक्स- ia32 का निर्माण, संकलित मोड)   

मैं इसे काम करने के लिए अपना कोड बदल सकता हूं, लेकिन मैं ' घ समझना चाहती है कि यह काम क्यों नहीं करता। मदद के लिए धन्यवाद!

इस तरह से जावा में प्रेषण कैसे काम करता है।

डिस्पैच पहले पर स्थिर पैरामीटर प्रकार पर आधारित, और एक बार एक स्थिर हस्ताक्षर चुना गया है, फिर विधि युक्त ऑब्जेक्ट के रनटाइम प्रकार का पता लगाया जाता है जो ओवरराइडिंग का उपयोग किया जाता है।

उदाहरण के लिए,

  शून्य foo (ऑब्जेक्ट ओ) {if (उदाहरण के लिए उदाहरण) {foo ((संख्या) ओ); } और अगर (ओ उदाहरण स्ट्रिंग) {एफू (स्ट्रिंग) ओ); }} Void foo (स्ट्रिंग्स) {...} void foo (संख्या n) {...} {foo ((ऑब्जेक्ट) "foo"); } // कॉल foo (ऑब्जेक्ट) जो कॉल करता है foo (स्ट्रिंग)। {एफू ("फू"); } // पहले फ्यू (ऑब्जेक्ट) कॉल करने के बिना कॉल फू (स्ट्रिंग)    

Comments