2010-03-21 11 views

उत्तर

12

हां, आभासी विधियों को संकलक और रनटाइम द्वारा अलग तरीके से इलाज किया जाता है। JVM विशेष रूप से आभासी विधि प्रेषण के लिए एक virtual method table का इस्तेमाल करता है:

वस्तु का प्रेषण तालिका वस्तु की गतिशील बाध्य तरीकों के पते शामिल होंगे। विधि कॉल ऑब्जेक्ट की प्रेषण तालिका से विधि का पता लाने के द्वारा किया जाता है। प्रेषण तालिका एक ही कक्षा से संबंधित सभी ऑब्जेक्ट्स के लिए समान है, और इसलिए आमतौर पर उनके बीच साझा की जाती है। वस्तुओं से संबंधित टाइप-संगत वर्गों (एक वंशानुगत पदानुक्रम में उदाहरण के भाई बहन के लिए) एक ही लेआउट के साथ प्रेषण टेबल होगा: किसी दिए गए विधि का पता ही पर दिखाई देगा सभी प्रकार संगत वर्गों के लिए ऑफसेट । इस प्रकार, दिए गए विधि के पते को प्राप्त करने के लिए प्रेषण तालिका ऑफसेट ऑब्जेक्ट की वास्तविक कक्षा से संबंधित विधि प्राप्त करेगा।

35

जावा में सभी विधियां डिफ़ॉल्ट रूप से आभासी हैं। इसका मतलब है कि विरासत में उपयोग किए जाने पर किसी भी विधि को ओवरराइड किया जा सकता है, जब तक कि उस विधि को अंतिम या स्थैतिक घोषित न किया जाए।

+2

गैर स्थैतिक (उदाहरण) विधियां हमेशा आभासी होती हैं। स्टेटिक (कक्षा) विधियां कभी आभासी नहीं होती हैं। आप उस वर्चुअल विधि में सही हैं जिसे अंतिम घोषित किया गया है जिसे व्युत्पन्न वर्ग में ओवरराइड नहीं किया जा सकता है। –

+0

क्या आप रचनाकार को नहीं भूलते हैं। –

+0

@JerryLiu यह निर्भर करता है कि क्या आप निर्माता को एक विधि मानते हैं या नहीं। मेरा मानना ​​है कि समुदाय अभी भी उस विषय पर सहमत नहीं है। –

13

'वर्चुअल' एक सी ++ शब्द है। जावा में कोई वर्चुअल विधियां नहीं हैं। सामान्य विधियां हैं, जो रनटाइम-पॉलिमॉर्फिक हैं, और स्थैतिक या अंतिम विधियां हैं, जो नहीं हैं।

+0

यहां कुछ त्रुटि? जरुर बताएं। – EJP

+12

मैंने डाउनवोट नहीं किया हालांकि मुझे लगता है कि "जावा में सभी विधियां डिफ़ॉल्ट रूप से आभासी हैं" कथन बेहतर है। जबकि जावा में कोई विशिष्ट "आभासी" संशोधक नहीं है, अंतर्निहित अवधारणा अभी भी वही है। दावा करते हुए कि कोई वर्चुअल विधियां आईएमएचओ – ChrisWue

+2

@ChrisWue पर थोड़ा भ्रामक नहीं है लेकिन आपका संस्करण सत्य नहीं है। स्टेटिक विधियां किसी भी अर्थ में वर्चुअल नहीं हैं, या रनटाइम-पॉलिमॉर्फिक या तो। मेरा संस्करण कैप्चर करता है: आपका नहीं है। और ओकहम का रेज़र निर्देश देता है कि आप अवधारणाओं को बिना किसी चीज से गुणा करते हैं। जावा पर चर्चा करते समय 'आभासी' शब्द की कोई आवश्यकता नहीं है, भाषा में कहीं भी ज्यादा है। – EJP

संबंधित मुद्दे