क्या उपवर्ग निजी क्षेत्रों को विरासत में देते हैं?


245

यह एक साक्षात्कार प्रश्न है।

क्या उपवर्ग निजी क्षेत्रों को विरासत में देते हैं?

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

मेरे वापस आने के बाद, मैंने जावदोक में निम्नलिखित उद्धरण पाया :

सुपरक्लास में निजी सदस्य

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

क्या आप साक्षात्कारकर्ता की राय के लिए कोई तर्क जानते हैं?


33
मैं एक बार ऐसी ही स्थिति में था और मुझे एहसास हुआ कि मैं ऐसी कंपनी के लिए भी काम नहीं करना चाहता था जहां साक्षात्कारकर्ता मेरे बारे में जावा से कम जानता हो। :)
बिज़िक्लोप

48
एक साक्षात्कारकर्ता कभी-कभी आपके साथ असहमत हो जाता है, भले ही वह जानता हो कि आप सही हैं। एक अच्छा साक्षात्कारकर्ता आपके तकनीकी ज्ञान से अधिक आपके बारे में जानने की कोशिश करेगा।
एंडी थॉमस

4
@DigitalRoss क्या जावा भाषा की विशिष्टता भी बुरी तरह से लिखी गई है? RD01 उत्तर देखें: stackoverflow.com/questions/4716040/…
OscarRyz

9
@ और थॉमस-क्रैमर मैं उन लोगों के साथ काम नहीं करना चाहूंगा जो जानबूझकर मेरी प्रतिक्रिया का परीक्षण करने के लिए झूठ बोल रहे हैं।
बिजिकलोप

4
खैर, मुझे लगता है कि हमें सबसे पहले जावा में "विरासत" के अर्थ का पता लगाना चाहिए। उपवर्ग के पास निजी क्षेत्र नहीं है और उपवर्ग के पास निजी क्षेत्र है, लेकिन उस तक पहुंच नहीं हो सकती है जो अलग हैं, जो कि जावा में विरासत के सटीक अर्थ को संदर्भित करता है?
मेंगट

जवाबों:


238

यहाँ प्रश्न / उत्तर में अधिकांश भ्रम इन्हेरिटेंस की परिभाषा को घेरे हुए हैं।

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

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

जैसा कि JLS कहता है ( https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.2 ):

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

यह साक्षात्कारकर्ता द्वारा प्रस्तुत किए गए सटीक प्रश्न को संबोधित करता है: " निजी क्षेत्रों को छोड़ें "। (मेरे द्वारा जोर दिया गया)

जवाब है, वे नहीं। उपवर्गों के OBJECTS में उनके सुपरक्लास के निजी क्षेत्र शामिल हैं। उपवर्ग में अपने सुपरक्लास के निजी क्षेत्रों की कोई सूचना नहीं है।

क्या यह पांडित्य प्रकृति का शब्दार्थ है? हाँ। क्या यह एक उपयोगी साक्षात्कार प्रश्न है? शायद ऩही। लेकिन जेएलएस जावा दुनिया के लिए परिभाषा स्थापित करता है, और यह ऐसा (इस मामले में) असंदिग्ध रूप से करता है।

EDITED (Bjarne Stroustrup से एक समानांतर उद्धरण हटा दिया गया है जो जावा और c ++ के बीच के अंतर के कारण संभवत: केवल भ्रम में जोड़ देता है। मैं अपने उत्तर को JLS पर छोड़ दूंगा :)


3
@ अजीत क्यों आहें भरता है। मैं समझता हूं कि आप मानते हैं कि आप सही हैं। मैं आपसे इस बात से असहमत नहीं हूं कि ऑब्जेक्ट इनहेरिटेंस वही है जो ज्यादातर प्रोग्रामर्स को सिखाया जाता है / जिनके बारे में सोचते हैं। लेकिन जेएलएस परिभाषा सीधे मूल प्रश्न पर लागू होती है। यह शब्दार्थ हाँ है, लेकिन JLS परिभाषा निर्धारित करता है, आप या मैं नहीं
robert_x44

4
इस सब को समेटने का एक तरीका यह है कि केवल यह पहचाना जाए कि "विरासत" शब्द का इस्तेमाल व्युत्पन्न और मूल वर्ग के संबंधों का वर्णन करने के लिए दो अलग-अलग तरीकों से किया जाता है, कम से कम जावा दुनिया में। हां, जेएसएल आधिकारिक है। हां, इसका मतलब है कि आप उस दुर्भाग्यपूर्ण तरीके से "विरासत" का उपयोग कर सकते हैं। लेकिन यह अभी भी स्पष्ट रूप से सच है कि उपवर्ग मेंढक करते हैं (क्योंकि अब हमारे पास एक शब्द नहीं है) उनके मूल वर्ग के निजी क्षेत्र।
डिजिटलरॉस

1
@ दिगीतल वे क्लास के ऑब्जेक्ट में हैं। वर्ग ही नहीं। सिमूला ने उन्हें समसामयिक वस्तुएं कहा। जब एक उपवर्ग का एक ऑब्जेक्ट बनाया गया था, तो यह समवर्ती 'उपसर्ग वस्तुओं' से बना था। सुपरक्लास ऑब्जेक्ट एक उपसर्ग ऑब्जेक्ट था जिसमें स्वयं अन्य उपसर्ग ऑब्जेक्ट शामिल हो सकते हैं। मुझे लगता है कि यह कहना अहंकार है कि जेएलएस में "स्पष्ट रूप से बुरा शब्द" है। हम किस शब्द का उपयोग करते हैं, निश्चित रूप से इनहेरिटेंस। थोड़ा अस्पष्ट शब्दावली का उपयोग करने के साथ कुछ भी गलत नहीं है। हस समय यह होता रहता है। लेकिन इसका मतलब यह नहीं है कि कोई सटीक परिभाषा नहीं है।
रोबर्ट_एक्स ४४

1
@digital हम निश्चित रूप से सहमत हो सकते हैं कि इस शब्द का उपयोग विभिन्न तरीकों से किया जाता है। :) हम शायद यह भी मान सकते हैं कि एक साक्षात्कार प्रश्न जो अस्पष्ट शब्द पर निर्भर करता है, शायद एक अच्छा नहीं है।
रोबर्ट_एक्स ४४

2
किसी के पास जावा / ओरेकल से "उप-वस्तुओं की वस्तुओं में उनके सुपरक्लास के निजी क्षेत्र" का संदर्भ है? मैं इससे सहमत हूं, लेकिन यह कहते हुए कोई आधिकारिक दस्तावेज नहीं मिल सकता है।
मेंगट

78

हाँ

यह महसूस करने के लिए, जबकि महत्वपूर्ण है कि कर रहे हैं दो वर्गों, वहाँ केवल एक ही वस्तु है।

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

नहीं, आप उन्हें सीधे एक्सेस नहीं कर सकते। हां, उन्हें विरासत में मिला है। वे है किया जाना है।

यह एक अच्छा सवाल है!


अपडेट करें:

एर, "नहीं"

खैर, मुझे लगता है कि हम सभी ने कुछ सीखा है। चूँकि जेएलएस ने सही "विरासत में मिला" शब्द नहीं बनाया है, इसलिए इसका उत्तर "नहीं" देना सही है । चूंकि उपवर्ग निजी क्षेत्रों तक पहुंच या संशोधित नहीं कर सकता है, इसलिए, दूसरे शब्दों में, उन्हें विरासत में नहीं मिला है। लेकिन वहाँ वास्तव में है सिर्फ एक वस्तु, यह वास्तव में शामिल करता है निजी क्षेत्रों, और किसी JLS और ट्यूटोरियल शब्दों को गलत तरीके से लेता है, इसलिए यदि, यह काफी OOP को समझने के लिए, जावा वस्तुओं, और क्या वास्तव में हो रहा है कठिन हो जाएगा।

अपडेट करने के लिए अपडेट करें:

यहां विवाद में एक मौलिक अस्पष्टता शामिल है: वास्तव में क्या चर्चा की जा रही है? वस्तु? या हम वर्ग के बारे में कुछ अर्थों में बात कर रहे हैं ? कक्षा को वस्तु के विपरीत बताते हुए बहुत सारे अक्षांश की अनुमति दी जाती है। तो उपवर्ग नहीं इनहेरिट निजी क्षेत्रों करता है, लेकिन एक वस्तु उपवर्ग का एक उदाहरण है कि निश्चित रूप से करता है को शामिल निजी क्षेत्रों।


2
@ Ma99uS। बेशक उनका पुन: उपयोग किया जाता है। यह विरासत का पूरा बिंदु है। उनके बिना व्युत्पन्न प्रकार नहीं होगा और माता-पिता के प्रकार का उदाहरण नहीं हो सकता है। ओओपी निरर्थक होगा। बहुरूपी प्रकार काम करना बंद कर देंगे । यह समझना कि केवल एक ही वस्तु है और आप मूल प्रकार के उदाहरण हैं ओओपी को समझना महत्वपूर्ण है। इसे समझने के लिए आपको इस मुद्दे को पूरा करना होगा।
डिजिटलरॉस

2
यकीन नहीं कि पिता का उदाहरण बहुत अच्छा है क्योंकि एक क्षेत्र विरासत में मिल सकता है जबकि मूल वर्ग अभी भी रहता है और उस क्षेत्र में भी है। अगर विरासत में उस तरह से काम किया जाता है जब मैं जीवित होने के दौरान अपने पिता के पैसे को प्राप्त कर सकता हूं और वह उतना ही पैसा रख सकता है। मेरे बच्चों में से प्रत्येक के पास अपना पैसा और मेरा पैसा होगा।
पीटर लॉरी

2
@Peter लॉरी बहस या कुछ भी नहीं है, लेकिन यहाँ है कि मुझे क्या लगता है। माता-पिता के पास एक बच्चा था car, उन्होंने इसे एक privateलॉकर में रखा था , जिसमें बच्चे की चाबी नहीं थी। आप वास्तव में वारिस हैं, carलेकिन यह आपके लिए बेकार है। तो, व्यावहारिक रूप से, आप विरासत से लाभ नहीं उठा रहे हैं।
निशांत १

1
@DigitalRoss। मुझे आपका बिंदु पता है। Mhh, हम कह सकते हैं कि मूल्य वहाँ है क्योंकि विरासत में मिली मूल परिभाषा भी भरी हुई नहीं है। :) मुझे लगता है कि JVM कल्पना का इस "NO WORD" के लिए सही उत्तर होगा जिसकी हम तलाश कर रहे हैं। java.sun.com/docs/books/jvms
OscarRyz

5
-1, जावा लैंग्वेज स्पेसिफिकेशन स्पष्ट रूप से बताता है कि वे विरासत में नहीं मिले हैं। नहीं अगर नहीं, लेकिन नहीं। वे बस नहीं हैं। जावा के संदर्भ में वंशानुक्रम की कोई अन्य परिभाषा गलत है।
बिजिकलोप

21

नहीं। निजी क्षेत्र विरासत में नहीं मिले हैं ... और इसीलिए संरक्षित का आविष्कार किया गया था। यह डिजाइन द्वारा है। मुझे लगता है कि यह संरक्षित संशोधक के अस्तित्व को सही ठहराता है।


अब संदर्भों पर आ रहे हैं। आपको विरासत में क्या मिला - अगर यह व्युत्पन्न वर्ग से निर्मित वस्तु में है? हाँ यही है।

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

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

कार्यात्मक रूप से, यह विरासत में नहीं मिला है। लेकिन आदर्श रूप से , यह है।


ठीक है, बस जावा ट्यूटोरियल में देखा जो वे इसे उद्धृत करते हैं:

सुपरक्लास में निजी सदस्य

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

देखें: http://download.oracle.com/javase/tutorial/java/IandI/subclasses.html

मैं सहमत हूँ, कि क्षेत्र वहाँ है। लेकिन, उपवर्ग को उस निजी क्षेत्र पर कोई विशेषाधिकार नहीं मिलता है। एक उपवर्ग के लिए, निजी क्षेत्र किसी भी अन्य वर्ग के किसी भी निजी क्षेत्र के समान है।

मेरा मानना ​​है कि यह विशुद्ध रूप से पॉइंट ऑफ व्यू का है। आप दोनों तरफ तर्क को ढाल सकते हैं। यह दोनों तरह से बेहतर है।

 


2
यह सही नहीं है। आप उन्हें एक्सेस नहीं कर सकते, यह सही है। लेकिन वे राशि के रूप में मैं समझा दिया है विरासत में मिला जा सकता है।
डिजिटलरोस

1
शानदार जवाब !!! +1 के लिए I believe it's purely matter of point-of-view.औरjustified the existence of protected modifier.
रवि

14

यह "विरासत" की आपकी परिभाषा पर निर्भर करता है। क्या उपवर्ग में अभी भी स्मृति में खेत हैं? निश्चित रूप से। क्या यह उन्हें सीधे पहुँचा सकता है? नहीं। यह परिभाषा की सिर्फ सूक्ष्मता है; मुद्दा यह समझना है कि वास्तव में क्या हो रहा है।


सही बात। लेकिन मुझे लगता है कि इस तरह के आधार प्रश्न में आम जवाब होना चाहिए)
स्टेन कुरिलिन

मुझे लगता है कि यह उत्तराधिकार की जावा परिभाषा है।
ऑस्करराइज

या फिर यह "फ़ील्ड" की आपकी परिभाषा पर निर्भर करता है। एक पूर्णांक फ़ील्ड को परिभाषित करने के लिए "फू" एक पूर्णांक के आकार के भंडारण लॉकर को किराए पर लेना है और उस पर "फू" चिह्न डालना है। यदि फ़ील्ड को निजी घोषित किया गया है, तो व्युत्पन्न वर्ग एक गैर-सूचीबद्ध पूर्णांक-आकार के भंडारण लॉकर को विरासत में लेता है। व्युत्पन्न वर्ग "फ़ील्ड" को इनहेरिट करता है या नहीं, यह इस बात पर निर्भर करता है कि कोई कॉल अनलिस्टेड स्टोरेज लॉकर को "फ़ील्ड" करता है या नहीं।
19

10

मैं कोड के साथ अवधारणा प्रदर्शित करूंगा। उपवर्गों ने सुपर क्लास के निजी चरों को विरासत में दिया। एकमात्र समस्या यह है कि वे सुलभ नहीं हैं बाल वस्तुओं तक हैं जब तक कि आप सार्वजनिक गेटवे प्रदान नहीं करते हैं और सुपर क्लास में निजी चर के लिए बसते हैं।

पैकेज डंप में दो वर्ग पर विचार करें। बालकों का पालन-पोषण माता-पिता से होता है।

अगर मुझे सही से याद है, तो स्मृति में एक बच्चे की वस्तु में दो क्षेत्र होते हैं। एक केवल माता-पिता का हिस्सा है और दूसरा केवल बच्चे का हिस्सा है। कोई बच्चा अपने माता-पिता के कोड में निजी अनुभाग को केवल सार्वजनिक विधि के माध्यम से एक्सेस कर सकता है।

इस पर इस तरीके से विचार करें। बोरत के पिता बोल्टोक के पास $ 100,000 सुरक्षित है। वह अपने "निजी" चर को सुरक्षित साझा नहीं करना चाहता है। इसलिए, वह तिजोरी की चाबी नहीं देता है। बोरैट सुरक्षित प्राप्त करता है। लेकिन, अगर वह इसे खोल भी न सके तो क्या अच्छा है? यदि केवल उनके पिता ने चाबी प्रदान की थी।

जनक -

package Dump;

public class Parent {

    private String reallyHidden;
    private String notReallyHidden;

    public String getNotReallyHidden() {
        return notReallyHidden;
    }

    public void setNotReallyHidden(String notReallyHidden) {
        this.notReallyHidden = notReallyHidden;
    }

}//Parent

बच्चा -

package Dump;

public class Child extends Parent {

    private String childOnly;

    public String getChildOnly() {
        return childOnly;
    }

    public void setChildOnly(String childOnly) {
        this.childOnly = childOnly;
    }

    public static void main(String [] args){

        System.out.println("Testing...");
        Child c1 = new Child();
        c1.setChildOnly("childOnly");
        c1.setNotReallyHidden("notReallyHidden");

        //Attempting to access parent's reallyHidden
            c1.reallyHidden;//Does not even compile

    }//main

}//Child

10

नहीं, उन्हें यह विरासत में नहीं मिला है।

तथ्य यह है कि कुछ अन्य वर्ग इसका उपयोग अप्रत्यक्ष रूप से विरासत के बारे में कुछ नहीं कहते हैं, लेकिन इनकैप्सुलेशन के बारे में कर सकते हैं।

उदाहरण के लिए:

class Some { 
   private int count; 
   public void increment() { 
      count++;
   }
   public String toString() { 
       return Integer.toString( count );
   }
}

class UseIt { 
    void useIt() { 
        Some s = new Some();
        s.increment();
        s.increment();
        s.increment();
        int v = Integer.parseInt( s.toString() );
        // hey, can you say you inherit it?
     }
}

आप प्रतिबिंब के माध्यम से countअंदर का मूल्य भी प्राप्त कर सकते हैं UseIt। इसका मतलब यह नहीं है, आप इसे विरासत में मिला है।

अपडेट करें

मान होने पर भी, यह उपवर्ग द्वारा विरासत में नहीं मिला है।

उदाहरण के लिए एक उपवर्ग के रूप में परिभाषित:

class SomeOther extends Some { 
    private int count = 1000;
    @Override
    public void increment() { 
        super.increment();
        count *= 10000;
    }
}

class UseIt { 
    public static void main( String ... args ) { 
        s = new SomeOther();
        s.increment();
        s.increment();
        s.increment();
        v = Integer.parseInt( s.toString() );
        // what is the value of v?           
     }
}

यह पहले उदाहरण के समान ही स्थिति है। विशेषता countछिपी हुई है और उपवर्ग द्वारा विरासत में नहीं मिली है। फिर भी, जैसा कि DigitalRoss बताता है, मान है, लेकिन उत्तराधिकार के माध्यम से नहीं है।

इस तरह से रखो। यदि आपका पिता धनवान है और आपको क्रेडिट कार्ड देता है, तब भी आप उसके पैसे से चीज़ खरीद सकते हैं, लेकिन इसका मतलब यह नहीं है कि आपको वह सारा पैसा विरासत में मिला है?

अन्य अपडेट

हालांकि, यह जानना बहुत दिलचस्प है कि विशेषता क्यों है।

मुझे स्पष्ट रूप से इसका वर्णन करने के लिए सटीक शब्द नहीं है, लेकिन यह जेवीएम है और जिस तरह से यह काम करता है वह "मूल नहीं" मूल परिभाषा को भी लोड करता है।

हम वास्तव में माता-पिता को बदल सकते हैं और उपवर्ग अभी भी काम करेंगे।

उदाहरण के लिए :

//A.java
class A {
   private int i;
   public String toString() { return ""+ i; }
}
// B.java
class B extends A {}
// Main.java
class Main {
   public static void main( String [] args ) {
      System.out.println( new B().toString() );
    }
}
// Compile all the files
javac A.java B.java Main.java
// Run Main
java Main
// Outout is 0 as expected as B is using the A 'toString' definition
0

// Change A.java
class A {
   public String toString() {
      return "Nothing here";
   }
}
// Recompile ONLY A.java
javac A.java
java Main
// B wasn't modified and yet it shows a different behaviour, this is not due to 
// inheritance but the way Java loads the class
Output: Nothing here

मुझे लगता है कि सटीक शब्द यहां पाया जा सकता है: JavaTM वर्चुअल मशीन विशिष्टता


:) अगली बार आप अपने साक्षात्कारकर्ता को यह समझाने का मौका ले सकते हैं कि वह कहाँ है / वह गलत है, और इससे आपको अतिरिक्त अंक मिल सकते हैं;) जाहिर है आपको इसे कूटनीतिक सही तरीके से करना चाहिए।
ऑस्कररेज़

1
वे है बहुरूपी प्रकार सब पर कोई अर्थ के लिए विरासत में मिला जा सकता है। मेरा स्पष्टीकरण देखें। यह सच है कि आप उनके साथ फील नहीं कर सकते, लेकिन वे वहां हैं। वे है किया जाना है।
डिजिटलरोस

आपके कोड में कोई इनहेरिटेंस (फैली हुई / लागू) कीवर्ड्स नहीं हैं, इसलिए इनहेरिटेंस उदाहरण नहीं है।
fmucar

1
उह, अगर वे वहां हैं, तो वे वहां कैसे पहुंचे? क्योंकि उपवर्ग ने उन्हें परिभाषित किया था? नहीं, क्योंकि वे उह, हम्म, इरेट, विरासत में मिले थे ?
डिजिटलरॉस

1
encapsulationबनाम पर महान बिंदु inherit, मुझे लगता है कि इस जवाब में वोट देने के लायक है।
एरिक वांग

6

खैर, साक्षात्कारकर्ता के सवाल पर मेरा जवाब है - निजी सदस्यों को उप-वर्गों में विरासत में नहीं मिला है, लेकिन वे उप-समूह या उप-वर्ग की वस्तु तक केवल सार्वजनिक गेट्टर या सेटर विधियों या मूल वर्ग के ऐसे किसी भी उपयुक्त तरीके से पहुंच सकते हैं। सामान्य प्रथा यह है कि सदस्यों को निजी रखा जाए और उन्हें गेटटर और सेटर विधियों का उपयोग करके एक्सेस किया जाए जो सार्वजनिक हैं। जब केवल जिस निजी सदस्य के साथ व्यवहार किया जाता है, उसके पास विरासत और सेटर के तरीकों का क्या मतलब होता है? यहाँ 'विरासत में मिली' का सीधा मतलब है कि यह उप-वर्ग में नए शुरू किए गए तरीकों से खेलने के लिए सीधे उप-वर्ग में उपलब्ध है।

नीचे की फाइल को ParentClass.java के रूप में सहेजें और इसे स्वयं आज़माएँ ->

public class ParentClass {
  private int x;

  public int getX() {
    return x;
  }

  public void setX(int x) {
    this.x = x;
  }
}

class SubClass extends ParentClass {
  private int y;

  public int getY() {
    return y;
  }

  public void setY(int y) {
    this.y = y;
  }

  public void setXofParent(int x) {
    setX(x); 
  }
}

class Main {
  public static void main(String[] args) {
    SubClass s = new SubClass();
    s.setX(10);
    s.setY(12);
    System.out.println("X is :"+s.getX());
    System.out.println("Y is :"+s.getY());
    s.setXofParent(13);
    System.out.println("Now X is :"+s.getX());
  }
}

Output:
X is :10
Y is :12
Now X is :13

अगर हम सबक्लास की विधि में पेरेंटक्लास के निजी चर x का उपयोग करने की कोशिश करते हैं तो यह किसी भी संशोधन के लिए सीधे सुलभ नहीं है (जिसका अर्थ है विरासत में नहीं मिला है)। लेकिन x को सेटक्लोप्रेंट () विधि में किए गए सेटएक्स () विधि के माध्यम से सबक्लास में संशोधित किया जा सकता है या इसे सेटएक्स () विधि या सेटएक्सऑफपेंट () विधि का उपयोग करके चाइल्डक्लास ऑब्जेक्ट का उपयोग करके संशोधित किया जा सकता है, जिसे अंततः सेटएक्स () कहते हैं। तो यहाँ setX () और getX () एक पैरेंटक्लास के निजी सदस्य x के लिए तरह के द्वार हैं।

एक और सरल उदाहरण है क्लॉक सुपरक्लास में निजी सदस्यों के रूप में घंटे और मिनट हैं और सार्वजनिक रूप से उपयुक्त गेटटर और सेटर विधियां हैं। इसके बाद घड़ी की एक उप-श्रेणी के रूप में डिजिटललॉक आता है। यहाँ अगर DigitalClock के ऑब्जेक्ट में घंटे और मिनट के सदस्य शामिल नहीं हैं तो चीजें खराब हो जाती हैं।


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

4

ठीक है, यह एक बहुत ही दिलचस्प समस्या है, मैंने बहुत शोध किया और एक निष्कर्ष पर पहुंचा कि उपवर्ग की वस्तुओं में सुपरक्लास के निजी सदस्य वास्तव में उपलब्ध हैं (लेकिन सुलभ नहीं हैं)। यह साबित करने के लिए, यहाँ एक अभिभावक वर्ग और एक बाल वर्ग के साथ एक नमूना कोड है और मैं एक txt फ़ाइल में चाइल्ड क्लास ऑब्जेक्ट लिख रहा हूँ और फ़ाइल में 'भावेश' नामक एक निजी सदस्य को पढ़ रहा हूं, इसलिए यह साबित करना कि यह वास्तव में बच्चे में उपलब्ध है पहुँच संशोधक के कारण वर्ग लेकिन सुलभ नहीं है।

import java.io.Serializable;
public class ParentClass implements Serializable {
public ParentClass() {

}

public int a=32131,b,c;

private int bhavesh=5555,rr,weq,refw;
}

import java.io.*;
import java.io.Serializable;
public class ChildClass extends ParentClass{
public ChildClass() {
super();
}

public static void main(String[] args) {
ChildClass childObj = new ChildClass();
ObjectOutputStream oos;
try {
        oos = new ObjectOutputStream(new FileOutputStream("C:\\MyData1.txt"));
        oos.writeObject(childObj); //Writing child class object and not parent class object
        System.out.println("Writing complete !");
    } catch (IOException e) {
    }


}
}

MyData1.txt खोलें और 'भावेश' नाम के निजी सदस्य को खोजें। कृपया मुझे बताएं कि आप लोग क्या सोचते हैं।


3

ऐसा लगता है कि एक उपवर्ग निजी क्षेत्रों को इनहेरिट करता है कि इन क्षेत्रों को उपवर्ग (दार्शनिक रूप से बोलने) के आंतरिक कामकाज में उपयोग किया जाता है। एक उपवर्ग, अपने कंस्ट्रक्टर में, सुपरक्लास कंस्ट्रक्टर को बुलाता है। सुपरक्लास निजी क्षेत्रों को सुपरक्लास कंस्ट्रक्टर कहे जाने वाले उपवर्ग द्वारा स्पष्ट रूप से विरासत में मिला है यदि सुपरक्लास कंस्ट्रक्टर ने इन क्षेत्रों को अपने कंस्ट्रक्टर में इनिशियलाइज़ किया है। वह सिर्फ एक उदाहरण है। लेकिन निश्चित रूप से एक्सेसर के तरीकों के बिना उपवर्ग सुपरक्लास निजी क्षेत्रों तक नहीं पहुंच सकता है (यह फोन को रीसेट करने के लिए बैटरी को बाहर निकालने के लिए एक iPhone के बैक पैनल को पॉप करने में सक्षम नहीं है ... लेकिन बैटरी अभी भी है)।

PS वंशानुक्रम की कई परिभाषाओं में से एक है जो मैं भर में आया हूं: "वंशानुक्रम - एक प्रोग्रामिंग तकनीक जो एक व्युत्पन्न वर्ग को एक आधार वर्ग की कार्यक्षमता का विस्तार करने की अनुमति देती है, जो उसके सभी STATE (जोर मेरा) और व्यवहार को विरासत में मिला है।"

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


1

मुझे जवाब देना होगा कि जावा में निजी क्षेत्र विरासत में मिले हैं। मुझे प्रदर्शित करने की अनुमति दें:

public class Foo {

    private int x; // This is the private field.

    public Foo() {
        x = 0; // Sets int x to 0.
    }

    //The following methods are declared "final" so that they can't be overridden.
    public final void update() { x++; } // Increments x by 1.
    public final int getX() { return x; } // Returns the x value.

}


public class Bar extends Foo {

    public Bar() {

        super(); // Because this extends a class with a constructor, it is required to run before anything else.

        update(); //Runs the inherited update() method twice
        update();
        System.out.println(getX()); // Prints the inherited "x" int.

    }

}

यदि आप किसी प्रोग्राम में चलते हैं Bar bar = new Bar();, तो आपको आउटपुट बॉक्स में हमेशा "2" नंबर दिखाई देगा। क्योंकि पूर्णांक "x" विधियों के साथ संलग्न है update()और getX()फिर, यह साबित किया जा सकता है कि पूर्णांक विरासत में मिला है।

भ्रम यह है कि क्योंकि आप सीधे पूर्णांक "x" तक नहीं पहुंच सकते हैं, तो लोग तर्क देते हैं कि यह विरासत में नहीं मिला है। हालांकि, एक कक्षा में प्रत्येक गैर-स्थिर चीज, चाहे वह क्षेत्र या विधि हो, विरासत में मिली है।


3
"समाहित" का अर्थ "विरासत" नहीं है;)
स्टेन कुरिलिन

1

जावा में मेमोरी लेआउट विज़-इन-विज़ इनहेरिटेंस

यहां छवि विवरण दर्ज करें

पैडिंग बिट्स / संरेखण और VTABLE में ऑब्जेक्ट क्लास का समावेश नहीं माना जाता है। इसलिए उपवर्ग की वस्तु में सुपर क्लास के निजी सदस्यों के लिए जगह होती है। हालाँकि, इसे उपवर्ग की वस्तुओं से एक्सेस नहीं किया जा सकता ...


1

नहीं , निजी क्षेत्र विरासत में नहीं मिले हैं। एकमात्र कारण यह है कि उपवर्ग सीधे उन तक नहीं पहुंच सकते हैं


0

मेरा मानना ​​है, उत्तर पूरी तरह से उस प्रश्न पर निर्भर है, जो पूछा गया है। मेरा मतलब है, अगर सवाल है

क्या हम सीधे सुपर क्लास के निजी क्षेत्र को उनके उप-वर्ग से एक्सेस कर सकते हैं ?

फिर उत्तर है कि नहीं , यदि हम पहुंच विवरण विवरणों के माध्यम से जाते हैं , तो यह उल्लेख किया गया है, निजी सदस्य केवल कक्षा के भीतर ही सुलभ हैं।

लेकिन, अगर सवाल है

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

जिसका अर्थ है, यह मायने नहीं रखता कि आप निजी सदस्य तक पहुँचने के लिए क्या करेंगे। उस स्थिति में, हम सार्वजनिक विधि को सुपर-क्लास में बना सकते हैं और आप निजी सदस्य तक पहुंच सकते हैं। इसलिए, इस मामले में आप निजी सदस्य तक पहुंचने के लिए एक इंटरफ़ेस / ब्रिज बना रहे हैं।

C ++ जैसी अन्य OOPs भाषा की friend functionअवधारणा है, जिसके द्वारा हम अन्य वर्ग के निजी सदस्य तक पहुँच सकते हैं।


0

हम बस यह बता सकते हैं कि जब एक सुपरक्लास विरासत में मिलता है, तो सुपरक्लास के निजी सदस्य वास्तव में उप-वर्ग के निजी सदस्य बन जाते हैं और आगे विरासत में प्राप्त नहीं हो सकते हैं या उप-वर्ग की वस्तुओं के लिए अप्राप्य हो सकते हैं।


0

एक निजी वर्ग का सदस्य या कंस्ट्रक्टर केवल शीर्ष स्तर के वर्ग ( ) 7.6 ) के निकाय के भीतर ही सुलभ होता है जो सदस्य या कंस्ट्रक्टर की घोषणा को संलग्न करता है। यह उपवर्गों द्वारा विरासत में नहीं मिला है। https://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.6


-1

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


-2

निजी सदस्यों (राज्य और व्यवहार) को विरासत में मिला है। वे () उस वस्तु के व्यवहार और आकार को प्रभावित कर सकते हैं जो वर्ग द्वारा त्वरित किया जाता है। यह उल्लेख करने के लिए नहीं कि वे सभी अतिक्रमण-तोड़ने वाले तंत्रों के माध्यम से उपवर्गों के लिए बहुत अच्छी तरह से दिखाई देते हैं, जो उनके कार्यान्वयनकर्ताओं द्वारा ग्रहण किए जा सकते हैं।

यद्यपि वंशानुक्रम में एक "डिफैक्टो" परिभाषा है, लेकिन निश्चित रूप से इसका "दृश्यता" पहलुओं से कोई संबंध नहीं है, जो "नहीं" उत्तरों द्वारा ग्रहण किया जाता है।

लिहाजा, कूटनीतिक होने की जरूरत नहीं है। इस बिंदु पर JLS गलत है।

कोई भी धारणा जो उन्हें "विरासत में नहीं मिली" असुरक्षित और खतरनाक है।

तो दो डिफैक्टो (आंशिक रूप से) परस्पर विरोधी परिभाषाओं (जो मैं दोहराऊंगा नहीं) के बीच, केवल एक का पालन किया जाना चाहिए वह है जो सुरक्षित (या सुरक्षित) है।


1
-1। JLS भाषा को परिभाषित करता है, JLS के लिए "गलत" होना असंभव है। इसके अलावा, अगर ऐसे तंत्र हैं जो एनकैप्सुलेशन को तोड़ते हैं, तो इसका मतलब यह नहीं है कि क्षेत्र विरासत में मिला है; केवल यह कि ऐसे तंत्र हैं जो एनकैप्सुलेशन को हटाते हैं।
एसएल बर्थ -

एक परिभाषा अपने आप में कई मायनों में गलत हो सकती है। इस पर आगे चर्चा करना मेरा उद्देश्य नहीं है। यहाँ तर्क उस तंत्र पर नहीं है जो अतिक्रमण को तोड़ता है (ईश्वर या जैसा भी हो) खराब हो सकता है, लेकिन इस तथ्य पर कि क्षेत्र / विधि वहां है, आपके उपवर्ग के व्यवहार और स्थिति को प्रभावित करता है। तो यह "विरासत" है। एक वर्ग में एक 100kb निजी बाइट सरणी का उपयोग कर सकता है और सिर्फ यह मान सकता है कि उसके (जंबो) वंशज इसे विरासत में नहीं लेते हैं। इस बिंदु को याद न करें और इसे एक अच्छे या बुरे अभ्यास के रूप में आंकें (अतिशयोक्ति एक बिंदु बनाने में मदद करती है): यह एक पूर्वाभास, वैध कार्रवाई है। निजी सदस्य "विरासत में मिले" हैं।
gakakas
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.