2010-09-28 10 views
6
class A { public static void main(String[] args) 
{ A a = new A(); 
    B b = new B(); 
    A ab = new B(); 
    System.out.format("%d %d %d %d %d %d", a.x, b.x, ab.x, a.y, b.y, ab.y); } 
    int x = 2; 
    int y = 3; 
    A(int x) { this.x = x; } 
    A() { this(7); } } 

class B extends A { 
    int y = 4; 
    B() { super(6); 
    } 

हे सब, मैं बस अपने पाठ्यक्रम से कुछ उदाहरण देख रहा था और मुझे इस समस्या से गुज़रने लगा।
मुझे लगता है कि कि इस कोड बाहर "7 6 6 3 4 3"जावा में वास्तविक बनाम स्पष्ट कक्षाएं

प्रिंट चाहिए लेकिन क्यों ab.y 3 के बराबर है? कक्षा बी के ऑब्जेक्ट एबी का "वास्तविक" प्रकार नहीं है? जो मुझे विश्वास दिलाएगा कि अब 4 हो?

उत्तर

8

क्योंकि आप सीधे फ़ील्ड तक पहुंच रहे हैं, न कि गेटर विधियों के माध्यम से।

आप फ़ील्ड ओवरराइड नहीं कर सकते हैं, केवल विधियां।

कक्षा B में y है जो मूल वर्ग A में से एक के अतिरिक्त है। दोनों फ़ील्ड एक दूसरे के साथ हस्तक्षेप नहीं करते हैं, जिसे उठाया जाता है संकलन समय (संकलक को ज्ञात प्रकार के अनुसार) पर निर्धारित किया जाता है।

यदि आप कहते हैं

A ab = new B(); 

तो

ab.y 

क्षेत्र y वर्ग A में घोषित को देखने के लिए संकलित किया जाएगा। यह वास्तविक समय की कक्षा में रनटाइम पर प्रेषित नहीं किया जाता है। यह एक स्थिर विधि के साथ ही होगा।

आप

B ab = new B(); 

करते हैं तो आप वर्ग B में क्षेत्र मिलता है।

+0

ठीक है कि इसे बहुत साफ करता है, धन्यवाद! –

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