2016-01-12 4 views
8

निम्नलिखित जावा कोड क्यों पैदा करता है:जावा 'यह' वास्तव में विरासत की स्थिति में क्या संदर्भित करता है?

10 
superclass 

कोड सवाल में है:

class SuperClass { 
    int a; 

    public SuperClass() { 
     this.a = 10; 
    } 

    private void another_print() { 
     System.out.println("superclass"); 
    } 

    public void print() { 
     System.out.println(this.a); 
     this.another_print(); 
    } 
} 

class SubClass extends SuperClass { 
    int a; 

    public SubClass() { 
     this.a = 20; 
    } 

    private void another_print() { 
     System.out.println("subclass"); 
    } 

    public void print() { 
     super.print(); 
    } 
} 

public class Main { 
    public static void main (String[] args) { 
     SubClass c = new SubClass(); 
     c.print(); 
    } 
} 

, कभी बनाया SuperClass का कोई उदाहरण नहीं है वहाँ नहीं है? न केवल जावा SuperClass से आने की विधि की तलाश शुरू करता है, यह किसी भी तरह से जानता है कि a = 10!

class SuperClass: 
    def __init__(self): 
     self.a = 10 

    def another_prn(self): 
     print('superclass') 

    def prn(self): 
     print(self.a) 
     self.another_prn() 

class SubClass(SuperClass): 
    def __init__(self): 
     self.a = 20 

    def another_prn(self): 
     print('subclass') 

    def prn(self): 
     super().prn() 

c = SubClass() 
c.prn() 

यह काम करता है के रूप में मैं उम्मीद:

20 
subclass 

केवल व्याख्या यह है कि अपने सहयोगियों (अजगर जावा लोगों नापसंद) के साथ आया है:

की एक ऐसी ही अजगर कोड पर विचार करें "अजगर एक असली ओओपी भाषा नहीं है "। बिलकुल भी विश्वास नहीं है।

अद्यतन: private void another_print() मेरी गलती है, मुझे protected का उपयोग करना चाहिए था।

+2

समान नहीं। पाइथन में निजी तरीके नहीं हैं। – njzk2

+7

आप निजी श्रेणी के बाद से सुपर क्लास विधि को ओवरराइड नहीं कर रहे हैं। एक वर्ग भी छुपाया जा रहा है क्योंकि दोनों वर्ग इसे घोषित करते हैं। –

+1

आप अपने सहयोगियों को यह बताने के लिए स्वतंत्र हैं कि जावा एक शुद्ध ओओपी भाषा नहीं है (और वह पाइथन शायद है, हालांकि कोई और बेहतर जानता है)। –

उत्तर

8

यह जावा में कन्स्ट्रक्टर कॉलिंग का क्रम है।
SubClass में, जब आप c का दृष्टांत, निर्माता परोक्षSuperClass (public SuperClass()) के डिफ़ॉल्ट निर्माता (यह ऐसा करना चाहिए) कहते हैं। फिर aSuperClass में 10 होने के लिए सेट है।

अब हम SuperClass कन्स्ट्रक्टर के साथ काम कर रहे हैं, हम SubClass के निर्माता के पास वापस आते हैं, जो a = 20 असाइन करता है। लेकिन खेतों जावा में अधिभावी के अधीन नहीं हैं, इसलिए SuperClass में a अभी भी 10

हो जाने के बाद कि यह बहुत स्पष्ट है, हम c.print() जो SubClass की print कॉल फोन है, जो SuperClass की print कॉल (super.print() द्वारा) है, जो प्रिंट a जो आपको याद है 10. फिर another_print (जो private से ओवरराइड नहीं है) बस superclass प्रिंट करता है और हम कर चुके हैं।

8

उप-वर्ग के प्रिंट में आप केवल सुपर-क्लास की प्रिंट विधि को कॉल करते हैं। तो यह पाठ्यक्रम के सुपर क्लास से प्रिंट करता है।

आपके पास दो अलग एक फ़ील्ड हैं। फ़ील्ड ओवरराइडिंग के अधीन नहीं हैं, केवल विधियां हैं। सुपर-क्लास में फ़ील्ड है और आपके पास उप-वर्ग में फ़ील्ड है।

यदि कोई अन्य भाषा कोई अन्य परिणाम उत्पन्न करती है, तो यह कोई आश्चर्य नहीं है। साथ ही, मुझे यकीन नहीं है कि आपका पायथन कोड तार्किक रूप से आपके जावा कोड के बराबर/समान है।

2

मेरा comment बताता है कि आपका कोड शायद अपेक्षित काम नहीं करता है। नीचे कोड लिखा गया है कि आप इसे काम करने की अपेक्षा करते हैं। कोड में टिप्पणियों पर ध्यान दें।

static class SuperClass { 
    int a; // only declare field in superclass to avoid hiding 

    public SuperClass() { 
     this.a = 10; 
    } 

    // make method protected, public, or package private to allow children to override it 
    protected void another_print() { 
     System.out.println("superclass"); 
    } 

    public void print() { 
     System.out.println(this.a); 
     this.another_print(); 
    } 
} 

static class SubClass extends SuperClass { 
    public SubClass() { 
     this.a = 20; 
    } 

    @Override 
    protected void another_print() { 
     System.out.println("subclass"); 
    } 

    public void print() { 
     super.print(); 
    } 
} 


public static void main (String[] args) { 
    SubClass c = new SubClass(); 
    c.print(); 
} 

यह प्रिंट होगा

20 
subclass 
0

मैं अपने से थोड़ा सुधारा कोड डिबग और पता चला कि है:

  1. thisSubClass
  2. अजगर के विपरीत का एक उदाहरण है, जावा है ठीक उसी नाम के एक से अधिक चर के साथ ठीक है (जैसा कि पीटर 0petrov ने अपने answer में उल्लेख किया है, लेकिन मैं डी idn't यह अंतर्निहित सुपर क्लास निर्माता कॉल के रूप में (दाएं भाग गया)
  3. a रों में से एक SubClass से है और दूसरा SuperClass से है फिर से अजगर के विपरीत)
  4. this.atest_super() और test_sub() में एक अलग महत्व है और कहा कि जादू, कि this दिया एक SubClass है और जावा प्रलेखन पढ़ता है:

thisवर्तमान वस्तु लिए एक संदर्भ है वस्तु जिसका विधि या निर्माता

बुलाया जा रहा है मुझे लगता है कि मैं इस तथ्य है कि this पूरी निर्भरता पेड़ से सभी चर होगा और जावा जो एक संदर्भ के आधार पर उपयोग करने के लिए चुन लिए जाएँगे के साथ रह सकते हैं।

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