java - जावा विरासत फ़ील्ड




inheritance (4)

क्योंकि आप 2 चर परिभाषित करते हैं: उप-वर्ग B में से एक, और सुपरक्लास A में A ही नाम वाला A

A a = new B();
a.i; // refers to A.i

यदि आप A को ए B , तो यह Bi तक पहुंच जाएगा:

System.out.println(((B)a).i);

मुझे लगता है कि आपको 1 चर का उपयोग करने की आवश्यकता है:

class A {
    int i;

    public A() {
        i = 10;
    }
}

class B extends A {
    public B() {
        i = 20;
    }
}

public class MainClass {
    public static void main(String[] args) {
        A a = new B();

        System.out.println(a.i); // will print 20
}

इस प्रश्न का उत्तर यहां दिया गया है:

मैं निम्नलिखित आउटपुट को समझने में सक्षम नहीं हूं।

मुझे नहीं पता कि आउटपुट 10 क्यों है, मुझे लगता है कि लाइन A a = new B() कक्षा बी का एक नया उदाहरण बनाता है, मुझे लगता है कि परिणाम 20 होना चाहिए

class A {
    int i = 10;
}

class B extends A {
    int i = 20;
}

public class MainClass {
    public static void main(String[] args) {
        A a = new B();

        System.out.println(a.i);
    }
}

यह इस तरह क्यों काम करता है .. कृपया समझाओ।


जावा में आप एक आवृत्ति चर को ओवरराइड नहीं कर सकते हैं। आपके द्वारा प्राप्त होने वाले आउटपुट की अपेक्षा की जाती है। जावा में आप केवल इंस्टेंस विधियों को ओवरराइड कर सकते हैं और उदाहरण चर नहीं।

यदि आप आउटपुट के रूप में 20 चाहते हैं तो आप उन इंस्टेंस चर पर गेटर विधियों का उपयोग कर सकते हैं।

 class A {
    int i = 10;

    int getI() {
        return i;
    }
}

class B extends A {
    int i = 20;

    int getI() {
        return i;
    }
}

public class MainClass {
    public static void main(String[] args) {
        A a = new B();

        System.out.println(a.getI());
    }
}

सदस्य चर i class A में पहले से ही परिभाषित किया गया है।

जो भी आप खोज रहे हैं उसे प्राप्त करने के लिए, नीचे दिखाए गए अनुसार class B को बदलें:

class B extends A {
    public B() {
      i = 20;
    }
}

सबसे पहले, छुपा फ़ील्ड देखें (जोर जोड़ा गया)

एक वर्ग के भीतर, सुपरक्लस में एक फ़ील्ड के समान नाम वाला फ़ील्ड सुपरक्लास के क्षेत्र को छुपाता है , भले ही उनके प्रकार अलग हों

दूसरे शब्दों में, यह "विरासत" नहीं है क्योंकि आप वास्तव में B i पीछे A छुपा रहे हैं, और आप A संदर्भ वस्तु का उपयोग कर रहे हैं, इसलिए आप इसके क्षेत्र प्राप्त कर रहे हैं। यदि आपने B b = new B() , तो आप उम्मीद के अनुसार 20 देखेंगे।

यदि आप सच्चे ओवरराइड की अपेक्षा करते हैं, तो विधियों का उपयोग करने का प्रयास करें।

class A {
    public int get() { 
        return 10; 
    }
}

class B extends A {
    @Override 
    public int get() { 
        return 20; 
    }
}

देख

A a = new B();
System.out.print(a.get()); // 20

यदि आप वास्तव में दोनों को एक बार देखना चाहते हैं, तो यह उदाहरण देखें।

class A {
    int i = 10;
}

class B extends A {
    int i = 20;

    @Override 
    public String toString() { 
        return String.format("super: %d; this: %d", super.i, this.i);
    }
}

तथा

A a = new B();
System.out.print(a); // super: 10; this: 20




inheritance