2009-08-28 5 views
12

"एक निजी विधि ओवरराइड" मैं इस कोडभ्रामक

public class Override { 
    private void f() { 
     System.out.println("private f()"); 
    } 
    public static void main(String[] args) { 
     Override po = new Derived(); 
     po.f(); 
    } 
} 

class Derived extends Override { 
    public void f() { 
     System.out.println("public f()"); 
    } 
} 

/* 
* Output: private f() 
*/// :~ 

1) पर दो सवाल है कैसे समारोह च है अवहेलना पो के संदर्भ पर दिखाई देता है;

2) उत्पादन "निजी च()"

+0

लेकिन उपclass के किसी ऑब्जेक्ट के साथ एक संदर्भ एक सुपर क्लास की निजी विधि कैसे कॉल कर सकता है ??? क्या यह एक बग है ??? –

+0

नहीं, यह एक बग नहीं है, यह वही है जैसा इसे काम करना चाहिए। – Jesper

+0

लेकिन यह विरासत के नियमों का उल्लंघन नहीं कर रहा है और देर से बाध्यकारी –

उत्तर

24
  1. main विधि, वर्ग Override के अंदर है तो बिल्कुल यह वर्ग Override की निजी सदस्यों देख सकते हैं क्यों है।

  2. आप नहीं अधिभावी विधि f वर्ग Derived में हैं, वहाँ कोई बहुरूपता है। परिवर्तनीय po का प्रकार Override है, इसलिए यह कक्षा से f विधि ले जाएगा।

ध्यान दें कि वर्ग Override में विधि f बिल्कुल वर्ग Derived में दिखाई नहीं देता है। कक्षा f कक्षा Derived में एक अलग विधि है, जिसमें superclass में विधि f विधि से कोई लेना देना नहीं है।

+0

है लेकिन जब बाध्यकारी रनटाइम पर किया जाता है तो पीओ में व्युत्पन्न वर्ग का ऑब्जेक्ट होगा ताकि वह सुपर क्लास की निजी विधि कैसे कॉल कर सके। –

+3

कहीं भी आपके कोड में सुपरक्लास की निजी विधि पर कॉल नहीं है। जब आप po.f() को कॉल करते हैं, तो ओवरराइड का एफ कहा जाता है क्योंकि संकलन-समय का पीओ ओवरराइड होता है। चूंकि कोई ओवरराइडिंग नहीं है, वहां कोई गतिशील बाध्यकारी नहीं है (कोई बहुलक नहीं है) - जावा रनटाइम पर प्रकार को नहीं देखता है। – Jesper

2
Override po = new Derived(); 
po.f(); 

आप अवहेलना की अपनी विधि वस्तु ली गई है, भले ही क्योंकि गुंजाइश नियमों के अनुसार, वर्ग की निजी सदस्यों पहले माना जाता है, और इसकी अवहेलना यह निजी च संदर्भित कर रहा है के दायरे में लिखा के रूप में एक्सेस कर रहे हैं, और चूंकि इसका निजी व्युत्पन्न वर्ग में अतिरंजित नहीं है, इसलिए वे विधि हस्ताक्षर समान होने पर ही ओवरराइड करेंगे।

Derived po = new Derived(); 
po.f(); 

thsi सही कोड जो कॉल व्युत्पन्न का होगा च है

+0

प्रश्न जावा के बारे में है, सी # नहीं। जावा में 'आभासी' मौजूद नहीं है। – Jesper

+0

टिप्पणी के लिए धन्यवाद, मैंने answwer भी तय किया। –

0

विधि का ओवरराइड तीन conditions.child वर्ग चाहिए अपने सुपर class.But रूप में एक ही नाम और मापदंडों और दिए गए मान है दोनों का अगर पैरामीटर और मान अलग-अलग हो रहे हैं, इसलिए ओवरराइड मौजूद नहीं है दो विधि अलग तरीका है, भले ही ठीक इस तरह:!!

public class Parent { 
      public int addV(int a,int b){ 
     int s; 
     s = a + b; 
     return s; 
    } 
} 

class Child extends Parent{ 
    public void addV(){ 
     //do...something 
    } 
} 

ग्रहण त्रुटि बात नहीं करेंगे! क्योंकि क्लास चाइल्ड में विधि addV कक्षा अभिभावक में विधि addV के साथ अलग है। आपके उदाहरण के रूप में!

+0

केवल विधि का नाम और तर्कों की सूची बिल्कुल वही होना चाहिए। बच्चे का वापसी मूल्य माता-पिता के वापसी मूल्य का उप-वर्ग हो सकता है। और आपके द्वारा छोड़े गए दो और नियम हैं। बच्चे में विधि कम से कम माता-पिता के रूप में सुलभ होनी चाहिए। और सबक्लास नए चेक अपवाद या व्यापक को फेंक नहीं सकता है। – pkkoniec