2013-12-12 3 views
6
abstract class A { 
    private int a; 
    public A(int x) { 
     a = x; 
    } 
    public int getA() { 
     return a; 
    } 
} 

class B extends A { 
    public B(int x) { 
     super(x); 
    } 
} 

class TestB { 
    public static void main(String args[]) { 
     B b = new B(5); 
     System.out.println(b.getA()); 
    } 
} 

इस स्थिति में मैं जब कहते हैं कि B b=new B(5); सुपर वर्ग निर्माता कहा जाता है और निजी उदाहरण चर 5. को आरंभ नहीं हो जाता तो जब मैं class B की वस्तु b द्वारा भेजा यह रिटर्न पर कहते हैं कि getA()। उदाहरण के रूप में aclass A निजी है, यह class B द्वारा विरासत में नहीं लिया जाएगा। तो उदाहरण परिवर्तनीय a कहां बनाया गया है (ढेर पर)। अगर यह public होता तो यह ढेर पर class B उदाहरण का हिस्सा होता। class A एक सार तत्व वर्ग है, इसलिए इसे तुरंत नहीं किया जा सकता है।ढेर में बनाए गए एक अमूर्त वर्ग का निजी उदाहरण चर कहां है?

+1

"जैसा कि क्लास ए का आवृत्ति परिवर्तनीय है, यह वर्ग बी द्वारा विरासत में नहीं लिया जाएगा।" - सादा गलत, निश्चित रूप से यह विरासत में मिला है! यह 'getA()' विधि –

उत्तर

6

वहाँ कोई अंतर नहीं है, जहां उदाहरण चर कोई बात नहीं आवंटित किए जाते हैं अगर वे निजी, सार्वजनिक, एक सुपर वर्ग से हैं, एक अमूर्त सुपर क्लास से

आम तौर पर अनुक्रम

  1. की तरह कुछ हो जाएगा B.class वस्तु
  2. Object के ब्लॉक उदाहरण चर
  3. A के ब्लॉक (जीसी के लिए सहायक क्षेत्रों, तुल्यकालन के लिए निगरानी, ​​... सहित) के संदर्भ में मैं nstance चर (केवल a इस मामले में)
  4. B के ब्लॉक उदाहरण चर (इस मामले में कोई भी)

लेकिन एक JVM में से प्रत्येक के कार्यान्वयन के लिए स्वतंत्र है कि यह कैसे आवंटित चयन करने के लिए उनमें से प्रत्येक

और एक्सेस कंट्रोलर और JVM

+0

इसलिए जब कक्षा बी की वस्तु ढेर पर बनाई गई है, तो इसमें ऑब्जेक्ट क्लास, कक्षा ए और कक्षा बी के सभी इंस्टेंस चर होंगे। – Pankaj

+0

@ पंकज येप, लेकिन फिर यह करने का एक आम तरीका है, अलग-अलग ब्लॉक आवंटित करने और उन्हें एक लिंक की गई सूची की तरह जोड़ने के अन्य तरीके हैं, लेकिन दूसरा एक तेज़ –

0

सभी सार यह कहते हैं कि "आप इस वर्ग को अपने आप नहीं बना सकते"। वर्ग के भीतर परिभाषित सब कुछ एक गैर-सारणी वर्ग के समान ही काम करता है।

तो दूसरे शब्दों में उपरोक्त "अमूर्त" कीवर्ड को हटा दें और परिणामस्वरूप संकलित बाइटकोड लगभग समान दिखाई देगा।

यह बदलता है कि आप वर्ग का उपयोग कैसे कर सकते हैं, कक्षा के व्यवहार के व्यवहार से नहीं।

+0

को छोड़कर केवल स्वीकार्य नहीं है क्योंकि हम एक अमूर्त वर्ग के उदाहरण नहीं बना सकते हैं, अमूर्त वर्ग में निजी क्षेत्र को इसकी याददाश्त कहां मिलेगी? क्या सार वर्ग ने ढेर में स्मृति आवंटित की है? – cnova

+1

जब आप एक अमूर्त वर्ग का विस्तार करने वाली एक ठोस वर्ग बनाते हैं तो अमूर्त वर्ग के लिए किसी भी सदस्य को कंक्रीट वर्ग को तत्काल करने के हिस्से के रूप में बनाया/असाइन/आवंटित/आदि बनाया जाता है, ठीक उसी तरह के गैर-अमूर्त वर्ग के समान होता है। –

0

विरासत दोनों का मूल नियम लागू होता है !!!

oracle documentation से

एक उपवर्ग अपनी मूल वर्ग के निजी सदस्यों के वारिस नहीं है। हालांकि, अगर सुपरक्लास के पास अपने निजी क्षेत्रों तक पहुंचने के लिए सार्वजनिक या संरक्षित तरीके हैं, तो इनका उपयोग सबक्लास द्वारा भी किया जा सकता है।

3

कक्षा 'बी' के अंदर ढेर पर परिवर्तनीय 'ए' का उदाहरण बनाया जाएगा। और, यह अभी भी कक्षा 'बी' की वस्तु के अंदर बनाया जाएगा जहां उदाहरण 'ए' सार्वजनिक है।

सबक्लास के में अपने सुपरक्लास के निजी फ़ील्ड होना चाहिए। किसी निजी सदस्य तक पहुंच नहीं होने का मतलब यह नहीं है कि वहां नहीं है।

JLS राज्यों के रूप में।

निजी घोषित कक्षा के सदस्य उस वर्ग के उप-वर्गों द्वारा विरासत में नहीं हैं। घोषित किए गए वर्ग के केवल सदस्यों को कक्षा में घोषित उप-वर्गों द्वारा विरासत में प्राप्त किया जाता है, जिसमें कक्षा घोषित की जाती है।

उप-श्रेणी सुपर क्लास के निजी क्षेत्र नहीं है। उप-वर्गों के उद्देश्यों में उनके सुपरक्लास के निजी क्षेत्र होते हैं। उप-वर्ग में अपने सुपरक्लास के निजी क्षेत्रों की कोई धारणा नहीं है।

+0

+1 है। Unche mits। :-) –

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