Java में सुपर ()


222

है super()माता पिता निर्माता कहा करते थे? कृपया समझाएं super()


1
अधिक विशिष्ट होना चाहिए या सिर्फ प्रलेखन को पढ़ना होगा ...
मनु

सुपर () कॉल के संबंध में इस उत्तर को भी देखें। stackoverflow.com/questions/34349164/…
विश्रांत

यहाँ समझाया गया: जावा: कॉलिंग सुपर ()
aioobe

जवाबों:


267

super() पैरेंट कंस्ट्रक्टर को बिना किसी तर्क के कॉल करता है।

इसका उपयोग तर्कों के साथ भी किया जा सकता है। Ie super(argument1)और यह कंस्ट्रक्टर को उस प्रकार के 1 पैरामीटर को स्वीकार करेगा जो argument1(यदि मौजूद है)।

साथ ही इसका उपयोग अभिभावकों से कॉल करने के तरीकों के लिए किया जा सकता है। अर्थातsuper.aMethod()

अधिक जानकारी और ट्यूटोरियल यहाँ


9
नोट: पहले मामले में, पैरेंट क्लास के पास कोई तर्क निर्माता नहीं होना चाहिए, जो संकलन त्रुटि को फेंक देगा।
KNU

Nit: अभिभावक / बच्चे की शब्दावली वर्ग पदानुक्रम के लिए बहुत अच्छी नहीं है। (एक बच्चा पिता नहीं है।)
aioobe

क्या ऐसे कोई प्रतिबंध हैं जहां सुपर का उपयोग किया जा सकता है?
आरोन फ्रेंके

2
@VivekChavda, निश्चित रूप से एक बच्चा माता-पिता हो सकता है, जैसे एक छात्र शिक्षक हो सकता है, आदि। लेकिन मुझे लगता है कि आप पशु की तुलना में अंतर को समझते हैं -> उदाहरण के लिए कुत्ता। एक कुत्ता जरूरी एक जानवर है। माता-पिता / बच्चे को एक आम तौर पर है एक है संबंध ( "एक माता पिता एक है बच्चे"), जबकि एक जानवर / कुत्ते एक है "एक" रिश्ते। Aioo.be/2016/06/29/a-child-is-not-always-a-parent.html
aioobe

2
@AaronFranke, "क्या सुपर पर इस्तेमाल किया जा सकता है, इस पर कोई प्रतिबंध है?" - हां, super(...)केवल एक निर्माता में पहले बयान के रूप में इस्तेमाल किया जा सकता है।
aioobe

154

कुछ तथ्य:

  1. super() तत्काल माता-पिता को कॉल करने के लिए उपयोग किया जाता है।
  2. super() उदाहरण के सदस्यों, उदाहरण के चर और उदाहरण के तरीकों के साथ इस्तेमाल किया जा सकता है।
  3. super() पैरेंट क्लास के कंस्ट्रक्टर को कॉल करने के लिए एक कंस्ट्रक्टर के भीतर इस्तेमाल किया जा सकता है।

ठीक है, अब चलो व्यावहारिक रूप से इन बिंदुओं को लागू करते हैं super()

प्रोग्राम 1 और 2 के बीच अंतर की जाँच करें। यहाँ, प्रोग्राम 2 super()जावा में हमारे पहले कथन का प्रमाण देता है।

कार्यक्रम 1

class Base
{
    int a = 100;
}

class Sup1 extends Base
{
    int a = 200;
    void Show()
    {
        System.out.println(a);
        System.out.println(a);
    }
    public static void main(String[] args)
    {
        new Sup1().Show();
    }
}

आउटपुट:

200
200

अब प्रोग्राम 2 देखें और मुख्य अंतर जानने की कोशिश करें।

कार्यक्रम 2

class Base
{
    int a = 100;
}

class Sup2 extends Base
{
    int a = 200;
    void Show()
    {
        System.out.println(super.a);
        System.out.println(a);
    }
    public static void main(String[] args)
    {
        new Sup2().Show();
    }
}

आउटपुट:

100
200

प्रोग्राम 1 में, आउटपुट केवल व्युत्पन्न वर्ग का था। यह न तो बेस क्लास और न ही पैरेंट क्लास के वैरिएबल को प्रिंट नहीं कर सकता है। लेकिन प्रोग्राम 2 में, हमने इसके आउटपुट को प्रिंट करते समय super()वेरिएबल के साथ उपयोग किया a, और aव्युत्पन्न वर्ग के वेरिएबल के मूल्य को प्रिंट करने के बजाय , इसने aबेस क्लास के वेरिएबल के मूल्य को प्रिंट किया । तो यह साबित करता है कि super()तत्काल माता-पिता को कॉल करने के लिए उपयोग किया जाता है।

ठीक है, अब प्रोग्राम 3 और प्रोग्राम 4 के बीच का अंतर देखें।

कार्यक्रम 3

class Base
{
    int a = 100;
    void Show()
    {
        System.out.println(a);
    }
}

class Sup3 extends Base
{
    int a = 200;
    void Show()
    {
        System.out.println(a);
    }
    public static void Main(String[] args)
    {
        new Sup3().Show();
    }
}

आउटपुट:

200

यहां आउटपुट 200 है। जब हमने कॉल किया Show(), Show()तो व्युत्पन्न वर्ग का कार्य कहा जाता था। लेकिन अगर हम Show()पैरेंट क्लास के फंक्शन को बुलाना चाहते हैं तो हमें क्या करना चाहिए ? समाधान के लिए प्रोग्राम 4 देखें।

कार्यक्रम 4

class Base
{
    int a = 100;
    void Show()
    {
        System.out.println(a);
    }
}

class Sup4 extends Base
{
    int a = 200;
    void Show()
    {
        super.Show();
        System.out.println(a);
    }
    public static void Main(String[] args)
    {
        new Sup4().Show();
    }
}

आउटपुट:

100
200

यहां हमें दो आउटपुट मिल रहे हैं, 100 और 200। जब Show()व्युत्पन्न वर्ग का कार्य होता है, तो यह सबसे पहले Show()मूल वर्ग के कार्य को कहता है , क्योंकि Show()व्युत्पन्न वर्ग के कार्य के अंदर , हम Show()डालकर मूल वर्ग के कार्य को कहते हैं। superइससे पहले समारोह नाम कीवर्ड।


4
आपने अपने सोर्सकोड के उदाहरणों पर ध्यान क्यों नहीं दिया? क्या कोई खास वजह है?
एरिकबवर्क

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

मेरे बेस क्लास में मैंने कंस्ट्रक्टर को एक, दो, ... तर्कों के साथ ओवरलोड किया
मोहन

लेकिन मेरे व्युत्पन्न वर्ग में मैं बिना किसी तर्क के सुपर () का उपयोग करता हूं। तब क्या होगा, जब यह स्वतः ही बेस क्लास का एक डिफ़ॉल्ट कंस्ट्रक्टर कहलाता है
मोहन

2
super()कोई कीवर्ड नहीं है। यह एक रचना है। superएक कीवर्ड है, और # 1 और # 2 केवल उस परिभाषा के साथ समझ में आता है।
लोर्ने

37

स्रोत लेख: जावा: कॉलिंग सुपर ()


हाँ। super(...)सुपर क्लास के कंस्ट्रक्टर को इनवाइट करेगा।

उदाहरण:

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


अकेले खड़े उदाहरण:

class Animal {
    public Animal(String arg) {
        System.out.println("Constructing an animal: " + arg);
    }
}

class Dog extends Animal {
    public Dog() {
        super("From Dog constructor");
        System.out.println("Constructing a dog.");
    }
}

public class Test {
    public static void main(String[] a) {
        new Dog();
    }
}

प्रिंटों:

Constructing an animal: From Dog constructor
Constructing a dog.

मेरे बेस क्लास में मैं एक, दो, ... के साथ कंस्ट्रक्टर को ओवरलोड करता हूं। मेरे व्युत्पन्न वर्ग में तर्क मैं सुपर () का उपयोग बिना किसी तर्क के करता हूं। तब क्या होगा कि क्या यह स्वतः ही बेस क्लास का एक डिफ़ॉल्ट कंस्ट्रक्टर कहलाता है
मोहन

हाँ। यदि आप कहते हैं super()कि यह सुपर क्लास के कंस्ट्रक्टर को आमंत्रित करेगा जो कोई तर्क नहीं लेता है। इसी तरह, यदि आप ऐसा करते हैं super(arg1), तो यह 1-तर्क निर्माता को आमंत्रित करेगा ।
aioobe

यदि बेस क्लास में कोई तर्क के बिना कोई कंस्ट्रक्टर नहीं था तो क्या होता है जब व्युत्पन्न वर्ग सुपर () कहता है।
मोहन

1
कुछ भी तो नहीं। यह संकलन नहीं होगा। यदि आप खुद एक कंस्ट्रक्टर प्रदान करते हैं, तो स्वचालित / डिफ़ॉल्ट / नो-तर्क-कंस्ट्रक्टर उत्पन्न नहीं किया जाएगा, इस प्रकार super()एक वैध कॉल नहीं होगा।
एयरोबे

29

क्या सुपर () का उपयोग मूल निर्माता को कॉल करने के लिए किया जाता है?

हाँ।

Pls सुपर () के बारे में बताएं।

super()उस superकीवर्ड का एक विशेष उपयोग है जहाँ आप एक पैरामीटर रहित पैरेंट कन्स्ट्रक्टर कहते हैं। सामान्य तौर पर, superकीवर्ड का उपयोग ओवरराइड विधियों को कॉल करने, छिपे हुए फ़ील्ड तक पहुंचने या सुपरक्लास के निर्माता को आमंत्रित करने के लिए किया जा सकता है।

यहाँ आधिकारिक ट्यूटोरियल है


5
super()मूल super.myMethod()रचनाकार को कॉल करने के लिए उपयोग किया जाता है , एक ओवरराइड विधि को कॉल करने के लिए उपयोग किया जाता है।
सीन पैट्रिक फ्लॉयड

2
@ सीनियर या सुपरक्लास की कोई अन्य विधि (स्टैटिक्स सहित) यदि इसके दायरे में है। सुपर आपके बेस क्लास का एक संदर्भ मात्र है।
atamanroman

3
मुझे नहीं लगता कि सुपर () बेस क्लास विधियों को कॉल करने के लिए उपयोग किया जाता है। आप सुपर.method () का उपयोग कर सकते हैं।
धीरज जोशी

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

7

बिना तर्क के सुपर कंस्ट्रक्टर को कॉल करना स्क्रीन स्पेस और प्रोग्रामर टाइम की बर्बादी है। कंपाइलर ठीक उसी कोड को जनरेट करता है, चाहे आप इसे लिखें या नहीं।

class Explicit() {
    Explicit() {
        super();
    }
}

class Implicit {
    Implicit() {
    }
}

मैंने पाया कि यह कुछ वर्गों में उपयोग किया जाता है, निश्चित नहीं कि इसका उद्देश्य क्या था। आपका उत्तर सहायक है।
आईप्राशंट

6

हां, super()(लोअरकेस) को पैरेंट क्लास का कंस्ट्रक्टर कहता है। आप तर्क शामिल कर सकते हैं:super(foo, bar)

एक superकीवर्ड भी है , जिसका उपयोग आप सुपरक्लास की एक विधि को लागू करने के तरीकों में कर सकते हैं

में "जावा सुपर" परिणाम के लिए एक त्वरित गूगल इस


4

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

class A{
    int n;
    public A(int x){
        n = x;
    }
}

class B extends A{
    int m;
    public B(int x, int y){
        super(x);
        m = y;
    }
}

तब आप सदस्य चर n के लिए एक मान असाइन कर सकते हैं।


2

मैंने सारे जवाब देखे हैं। लेकिन हर कोई एक बहुत महत्वपूर्ण बिंदु का उल्लेख करना भूल गया:

सुपर () को निर्माणकर्ता की पहली पंक्ति में बुलाया या उपयोग किया जाना चाहिए।


1

बस सुपर (); अकेले डिफ़ॉल्ट कंस्ट्रक्टर को कॉल करेगा, अगर यह एक क्लास के सुपरक्लास में मौजूद है। लेकिन आपको स्वयं स्पष्ट रूप से डिफ़ॉल्ट निर्माता लिखना होगा। यदि आप जावा नहीं बनाते हैं तो आपके लिए कोई कार्यान्वयन नहीं होगा, सुपर () को बचाएं; , सार्वभौमिक सुपरक्लास ऑब्जेक्ट का उल्लेख करते हुए, और आप इसे उप-वर्ग में नहीं कह सकते।

public class Alien{
   public Alien(){ //Default constructor is written out by user
   /** Implementation not shown…**/
   }
}

public class WeirdAlien extends Alien{
   public WeirdAlien(){
   super(); //calls the default constructor in Alien.
   }

}

बिना किसी तर्क के
लोर्ने

1

उदाहरण के लिए, सेलेनियम स्वचालन में, आपके पास एक PageObject है जो अपने माता-पिता के निर्माता का इस तरह उपयोग कर सकता है:

public class DeveloperSteps extends ScenarioSteps {

public DeveloperSteps(Pages pages) {
    super(pages);
}........

1

मैं जो कुछ भी समझा, उसे कोड के साथ साझा करना चाहूंगा।

जावा में सुपर कीवर्ड एक संदर्भ चर है जिसका उपयोग मूल श्रेणी की वस्तुओं को संदर्भित करने के लिए किया जाता है। इसका उपयोग निम्नलिखित संदर्भों में किया जाता है: -

1. चर के साथ सुपर का उपयोग:

class Vehicle 
{ 
    int maxSpeed = 120; 
} 

/* sub class Car extending vehicle */
class Car extends Vehicle 
{ 
    int maxSpeed = 180; 

    void display() 
    { 
        /* print maxSpeed of base class (vehicle) */
        System.out.println("Maximum Speed: " + super.maxSpeed); 
    } 
} 

/* Driver program to test */
class Test 
{ 
    public static void main(String[] args) 
    { 
        Car small = new Car(); 
        small.display(); 
    } 
} 

आउटपुट: -

Maximum Speed: 120
  1. विधियों के साथ सुपर का उपयोग:
/* Base class Person */
class Person 
{ 
    void message() 
    { 
        System.out.println("This is person class"); 
    } 
} 

/* Subclass Student */
class Student extends Person 
{ 
    void message() 
    { 
        System.out.println("This is student class"); 
    } 

    // Note that display() is only in Student class 
    void display() 
    { 
        // will invoke or call current class message() method 
        message(); 

        // will invoke or call parent class message() method 
        super.message(); 
    } 
} 

/* Driver program to test */
class Test 
{ 
    public static void main(String args[]) 
    { 
        Student s = new Student(); 

        // calling display() of Student 
        s.display(); 
    } 
}

आउटपुट: -

This is student class
This is person class

3. निर्माणकर्ताओं के साथ सुपर का उपयोग:

class Person 
{ 
    Person() 
    { 
        System.out.println("Person class Constructor"); 
    } 
} 

/* subclass Student extending the Person class */
class Student extends Person 
{ 
    Student() 
    { 
        // invoke or call parent class constructor 
        super(); 

        System.out.println("Student class Constructor"); 
    } 
} 

/* Driver program to test*/
class Test 
{ 
    public static void main(String[] args) 
    { 
        Student s = new Student(); 
    } 
} 

आउटपुट: -

Person class Constructor
Student class Constructor

0

कंस्ट्रक्टर्स
एक कंस्ट्रक्टर में, आप एक अन्य कंस्ट्रक्टर को कॉल करने के लिए बिना डॉट के इसका उपयोग कर सकते हैं। superसुपरक्लास में एक निर्माता को बुलाता है; thisइस वर्ग में एक निर्माता को बुलाता है:

public MyClass(int a) {
  this(a, 5);  // Here, I call another one of this class's constructors.
}

public MyClass(int a, int b) {
  super(a, b);  // Then, I call one of the superclass's constructors.
}

superसुपरक्लास को खुद को इनिशियलाइज़ करने की जरूरत है तो उपयोगी है। thisआपको सभी हार्ड इनिशियलाइज़ेशन कोड को एक बार केवल एक कंस्ट्रक्टर में लिखने और अन्य सभी से कॉल करने की अनुमति देने के लिए उपयोगी है, बहुत आसान लिखने वाले कंस्ट्रक्टर।

विधियाँ
किसी भी विधि में, आप किसी अन्य विधि को कॉल करने के लिए डॉट के साथ इसका उपयोग कर सकते हैं। super.method()सुपरक्लास में एक विधि कहता है; this.method()इस वर्ग में एक विधि कहते हैं:

public String toString() {
  int    hp   = this.hitpoints();  // Calls the hitpoints method in this class
                                   //   for this object.
  String name = super.name();      // Calls the name method in the superclass
                                   //   for this object.

  return "[" + name + ": " + hp + " HP]";
}

superएक निश्चित परिदृश्य में उपयोगी है: यदि आपकी कक्षा में आपके सुपरक्लास के समान विधि है, तो जावा मान लेगा कि आप अपनी कक्षा में चाहते हैं; superआपको इसके बजाय सुपरक्लास की विधि पूछने के लिए अनुमति देता है। thisआपके कोड को अधिक पठनीय बनाने के लिए केवल एक तरीके के रूप में उपयोगी है।


0

सुपर कीवर्ड सुपर क्लास निर्माता कॉल करने के लिए और सुपर क्लास के एक सदस्य का उल्लेख किया जा सकता है

जब आप सही तर्कों के साथ सुपर () कहते हैं , तो हम वास्तव में कंस्ट्रक्टर बॉक्स को कहते हैं , जो चर की चौड़ाई , ऊंचाई और गहराई को प्रारंभिक करता है , इसे संबंधित मापदंडों के मूल्यों का उपयोग करके संदर्भित किया जाता है। आप केवल इसके मूल्य वर्धित भार को आरंभ करने के लिए बने हुए हैं। यदि आवश्यक हो, तो आप अब निजी के रूप में वर्ग चर बॉक्स कर सकते हैं । बॉक्स वर्ग के निजी संशोधक के क्षेत्रों में नीचे रखें और सुनिश्चित करें कि आप उन्हें बिना किसी समस्या के उपयोग कर सकते हैं।

सुपरक्लास में कई अतिभारित संस्करण निर्माता हो सकते हैं, इसलिए आप विभिन्न मापदंडों के साथ सुपर () विधि को कॉल कर सकते हैं । प्रोग्राम निर्दिष्ट तर्क से मेल खाने वाले निर्माता का प्रदर्शन करेगा।

public class Box {

    int width;
    int height;
    int depth;

    Box(int w, int h, int d) {
        width = w;
        height = h;
        depth = d;
    }

    public static void main(String[] args){
        HeavyBox heavy = new HeavyBox(12, 32, 23, 13);
    }

}

class HeavyBox extends Box {

    int weight;

    HeavyBox(int w, int h, int d, int m) {

        //call the superclass constructor
        super(w, h, d);
        weight = m;
    }

}

0

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

अधिक स्पष्टीकरण के लिए यहां देखें ।


0

जैसा कि कहा गया है, डिफ़ॉल्ट कंस्ट्रक्टर के अंदर एक अंतर्निहित सुपर () होता है जिसे कंस्ट्रक्टर की पहली पंक्ति में कहा जाता है ।

यह सुपर () स्वचालित रूप से श्रेणी पदानुक्रम के शीर्ष पर शुरू होने वाले निर्माणकर्ताओं की एक श्रृंखला को कॉल करता है और पदानुक्रम को नीचे ले जाता है।

यदि कार्यक्रम के वर्ग पदानुक्रम में दो से अधिक कक्षाएं थीं, तो शीर्ष श्रेणी के डिफ़ॉल्ट निर्माता को पहले बुलाया जाएगा ।

इसका एक उदाहरण इस प्रकार है:

class A {
    A() {
    System.out.println("Constructor A");
    }
}

class B extends A{

    public B() {
    System.out.println("Constructor B");
    }
}

class C extends B{ 

    public C() {
    System.out.println("Constructor C");
    }

    public static void main(String[] args) {
    C c1 = new C();
    }
} 

उपरोक्त उत्पादन होगा:

Constructor A
Constructor B
Constructor C
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.