मुख्य सामग्री पर जाएं
मॉड्यूल 3 · पाठ 1 का 2पाठ्यक्रम में 5/14~12 min
मॉड्यूल पाठ (1/2)

विरासत

इनहेरिटेंस OOP का एक मौलिक तंत्र है जो एक वर्ग (जिसे चाइल्ड क्लास या उपवर्ग कहा जाता है) को किसी अन्य वर्ग (जिसे पैरेंट क्लास या सुपरक्लास कहा जाता है) से फ़ील्ड और विधियों को प्राप्त करने की अनुमति देता है।

यह कोड पुन: उपयोग को बढ़ावा देता है और अनावश्यक पुनरावृत्ति से बचाता है।

extends के साथ एक कक्षा का विस्तार

जावा में, हम यह इंगित करने के लिए extends कीवर्ड का उपयोग करते हैं कि एक वर्ग दूसरे से विरासत में मिला है:

Java
class Vehicle {
    protected int speed; // 'protected' makes the field visible to subclasses

    public void honk() {
        System.out.println("Beep beep!");
    }
}

class Car extends Vehicle {
    // Car automatically inherits the speed field and the honk() method
}

कंस्ट्रक्टर और super() कीवर्ड

यदि सुपरक्लास में एक कंस्ट्रक्टर है जो मापदंडों को स्वीकार करता है, तो उपवर्ग को इसे अपने कंस्ट्रक्टर में super(...) का उपयोग करके पहले स्टेटमेंट के रूप में स्पष्ट रूप से कॉल करना होगा:

Java
class Person {
    String name;

    public Person(String name) {
        this.name = name;
    }
}

class Student extends Person {
    int studentId;

    public Student(String name, int studentId) {
        super(name); // Invokes the constructor of Person
        this.studentId = studentId;
    }
}

विधि ओवरराइडिंग (@Override)

एक उपवर्ग सुपरक्लास से विरासत में मिली विधि के लिए अपना विशिष्ट कार्यान्वयन प्रदान कर सकता है। इस ऑपरेशन को ओवरराइडिंग (मेथड ओवरराइडिंग) कहा जाता है और इसे @Override एनोटेशन द्वारा दर्शाया जाता है।

Java
class Animal {
    public void makeSound() {
        System.out.println("Rumore generico");
    }
}

class Cat extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Miao!");
    }
}

protected संशोधक

protected एक्सेस संशोधक इनहेरिटेंस में महत्वपूर्ण भूमिका निभाता है। private के विपरीत, जो सदस्यों को केवल एक ही वर्ग के भीतर दृश्यमान बनाता है, protected एक ही पैकेज के भीतर और सभी उपवर्गों द्वारा फ़ील्ड और विधियों तक पहुंच की अनुमति देता है, भले ही वे अलग-अलग पैकेज में रहते हों।

super के साथ मूल सदस्यों तक पहुंच

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

Java
class Animal {
    public void sleep() {
        System.out.println("Zzz");
    }
}

class Cat extends Animal {
    @Override
    public void sleep() {
        super.sleep(); // Executes the behavior of Animal
        System.out.println("The cat purrs while sleeping.");
    }
}

जावा में एकल वंशानुक्रम

जावा में, एक क्लास केवल एक क्लास (एकल इनहेरिटेंस) का विस्तार कर सकती है। अनेक वर्गों से प्रत्यक्ष वंशानुक्रम (एकाधिक वंशानुक्रम) की अनुमति नहीं है; उदाहरण के लिए, class Cat extends Animal, Mammal संकलन त्रुटि का कारण बनेगा। यह डिज़ाइन विकल्प "डायमंड समस्या" के रूप में जानी जाने वाली अस्पष्टताओं से बचाता है (जब दो सुपरक्लास अलग-अलग कार्यान्वयन के साथ एक ही विधि को परिभाषित करते हैं)। इस सीमा को दूर करने के लिए, जावा इंटरफ़ेस की अवधारणा पेश करता है, जिसे हम अगले मॉड्यूल में देखेंगे।


खुद कोशिश करना

व्यायाम#java.m3.l1.e1
प्रयास: 0लोड हो रहा है...

एनिमल का विस्तार करके कुत्ता उपवर्ग पूरा करें। डॉग कंस्ट्रक्टर की घोषणा करें जो एक नाम (स्ट्रिंग) स्वीकार करता है और इसे एनिमल कंस्ट्रक्टर को पास करने के लिए सुपर (नाम) का उपयोग करता है।

संपादक लोड हो रहा है...
संकेत दिखाएँ

`सार्वजनिक कुत्ता (स्ट्रिंग नाम) {सुपर (नाम) लिखें; `` डॉग क्लास के अंदर।

3 प्रयासों के बाद समाधान उपलब्ध है

व्यायाम#java.m3.l1.e2
प्रयास: 0लोड हो रहा है...

एनिमल से डॉग का विस्तार करें और मेकसाउंड() विधि को ओवरराइड करें ताकि यह जेनेरिक साउंड के बजाय स्ट्रिंग वूफ़ लौटाए। @Override एनोटेशन का उपयोग करें.

संपादक लोड हो रहा है...
संकेत दिखाएँ

घोषणा के ऊपर `@Override` लिखें `public String makeSound() { return 'Woof'; `` कुत्ते के अंदर.

3 प्रयासों के बाद समाधान उपलब्ध है

व्यायाम#java.m3.l1.e3
प्रयास: 0लोड हो रहा है...

एक कैट वर्ग घोषित करें जो एनिमल का विस्तार करता है और स्ट्रिंग मेव को वापस करने के लिए मेकसाउंड () विधि को ओवरराइड करता है। एनिमल क्लास में पहले से ही एक कंस्ट्रक्टर है जो एक नाम स्वीकार करता है; सुनिश्चित करें कि कैट कंस्ट्रक्टर भी एक नाम स्वीकार करता है और इसे सुपरक्लास कंस्ट्रक्टर को सही ढंग से भेजता है।

संपादक लोड हो रहा है...
संकेत दिखाएँ

`एनिमल` का विस्तार करते हुए `कैट` वर्ग बनाएं। कंस्ट्रक्टर को घोषित करें `सार्वजनिक बिल्ली (स्ट्रिंग नाम) {सुपर (नाम); }` और ``मेव'' वापस करने के लिए `@Override` का उपयोग करके `makeSound()` विधि को ओवरराइड करें।

3 प्रयासों के बाद समाधान उपलब्ध है