2011-05-26 13 views
8

कोड नीचे "1" प्रिंट क्यों करता है?जावा कॉन्वारेन्ट रिटर्न टाइप

class A { 
    int x = 1; 
} 

class B extends A { 
    int x = 2; 
} 

class Base { 

    A getObject() { 
     System.out.println("Base"); 
     return new B(); 
    } 
} 

public class CovariantReturn extends Base { 

B getObject() { 
    System.out.println("CovariantReturn"); 
    return new B(); 
} 
/** 
* @param args 
*/ 
public static void main(String[] args) { 
    Base test = new CovariantReturn(); 
    System.out.println(test.getObject() instanceof B); 
    System.out.println(test.getObject().x); 
} 
} 

उत्तर

13

क्योंकि आप उन क्षेत्रों का जिक्र कर रहे हैं, जो पॉलिमॉर्फिज्म से प्रभावित नहीं हैं। यदि आपने इसके बजाय getX() का उपयोग किया है, तो यह 2 लौटा होगा।

आप जो पूछ रहे हैं वह है x वर्ग A में परिभाषित फ़ील्ड का मान (क्योंकि Base.getObject()A देता है)। भले ही CovariantReturnB वापस करने के लिए विधि को ओवरराइड करता है, आप CovariantReturn के रूप में अपनी ऑब्जेक्ट का जिक्र नहीं कर रहे हैं।

पॉलिमॉर्फिज्म द्वारा फ़ील्ड प्रभावित नहीं होते हैं, इस पर कुछ विस्तार करने के लिए - संकलन समय पर फ़ील्ड एक्सेस महसूस किया जाता है, इसलिए जो कुछ भी कंपाइलर देखता है, वैसे ही इसका उपयोग किया जाता है। आपके मामले में विधि A लौटने के लिए परिभाषित करती है और इसलिए A.x एक्सेस किया जाता है। दूसरी ओर विधियों को रनटाइम प्रकार के आधार पर बुलाया जाता है। तो अगर आप A लौटने के लिए परिभाषित करते हैं, लेकिन B का उदाहरण लौटाते हैं, तो आपके द्वारा आमंत्रित विधि B पर लागू की जाएगी।

+0

लेकिन मैं नई बी लौट रहा हूँ() – kris979

+0

लेकिन विधि 'वापस जाने के लिए A' परिभाषित करता है। और इसलिए 'एएक्स' का उपयोग किया जाता है। – Bozho

+1

@kris आप 'ए' के ​​संदर्भ में विधि को कॉल कर रहे हैं जिसमें इसके प्रकार 'ए' –

0

@ kris979 हालांकि आप बी वापस कर रहे हैं, मुझे लगता है कि अंतर क्या है कि वापसी का प्रकार ए है इसलिए ए -1 में एक्स का मान मुद्रित किया गया है।

0

बोझो ने बताया - उदाहरण परिवर्तनीय पॉलिमॉर्फिज्म से कभी प्रभावित नहीं होते हैं। मुझे आपको एक त्वरित छोटा उदाहरण दें।

class Base { 
    int i = 1; 
    void method() { 
     System.out.println("in base"); 
    } 
} 

class Sub extends Base { 
    int i = 2; 

    void method() { 
     System.out.println("in sub"); 
    } 
} 

public class Test { 
    public static void main(String[] args) { 
     Base obj = new Sub(); 
     obj.method(); 
     System.out.println(obj.i); 
    } 
} 

इस कोड को प्रिंट होगा - उप में और 1

+0

अच्छा। सरल और साफ जवाब – STEEL

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