द्वारा विरासत में प्राप्त विधियों के लिए स्थिरता नहीं रखता है मेरे पास निम्नलिखित कोड हैं।जावा बाइटकोड ऑपरेशन 'invokevirtual' ऑब्जेक्ट
public class Parent {
@Override
public int hashCode() {
return 0;
}
}
public class Child extends Parent {
public void test() {
this.toString();
this.hashCode();
}
}
आप ऊपर कोड में देख के रूप में, बाल toString() वस्तु और hashCode() जनक से से विरासत। चाइल्ड # टेस्ट का बाइटकोड ऑपरेशन निम्नानुसार है।
ALOAD 0: this
INVOKEVIRTUAL Object.toString() : String
ALOAD 0: this
INVOKEVIRTUAL Child.hashCode() : int
RETURN
मैं अगर invokevirtual कॉल Object.toString लगता है(), यह स्थिरता के लिए Parent.hashCode() फोन करना चाहिए। या, Child.hashCode() कहा जाता है, तो Child.toString() को कॉल किया जाना चाहिए।
हालांकि, invokevirtual यदि और केवल यदि लक्ष्य विधि वस्तु द्वारा विरासत में मिली है इसकी निरंतरता नहीं रखता।
केवल उस मामले, वस्तु में invokevirtual कॉल विधि। अन्य मामलों के लिए, वर्तमान कक्षा में invokevirtual कॉल विधि।
मुझे पता है कि ऐसा क्यों होता चाहते हैं।
यह देखते हुए कि वास्तविक विधि मार डाला * हमेशा * निष्पादन समय पर वास्तविक प्रकार के आधार पर किया जाएगा, क्यों इस बात करता है? वे समकक्ष हैं, निश्चित रूप से? –
शायद संकलक ऑब्जेक्ट से विशेष-आवरण विरासत है, क्योंकि यह एक आम मामला है। –
और यह आपके तर्क को कैसे प्रभावित करता है? – CuriousMind