super () w Javie

222

Czy super()służy do wywołania konstruktora nadrzędnego? Proszę wyjaśnić super().

Mohan
źródło
1
Musi być bardziej szczegółowy lub po prostu przeczytać dokumentację ...
Manu
W połączeniu z wywołaniem super () sprawdź również tę odpowiedź. stackoverflow.com/questions/34349164/…
Vishrant,
Wyjaśniono tutaj: Java: Wywołanie super ()
aioobe

Odpowiedzi:

267

super() wywołuje konstruktor nadrzędny bez argumentów.

Można go również używać z argumentami. Ie super(argument1)i wywoła konstruktor, który akceptuje 1 parametr typuargument1 (jeśli istnieje).

Można go również używać do wywoływania metod od rodzica. To znaczysuper.aMethod()

Więcej informacji i samouczek tutaj

pakore
źródło
9
UWAGA: w pierwszym przypadku klasa nadrzędna musi mieć konstruktor bez argumentów, w przypadku którego wystąpi błąd kompilacji.
KNU,
Nit: Terminologia nadrzędna / podrzędna nie jest zbyt dobra dla hierarchii klas. (Dziecko nie jest ojcem.)
aioobe
Czy są jakieś ograniczenia, gdzie można używać super?
Aaron Franke,
2
@VivekChavda, na pewno dziecko może być rodzicem, tak jak uczeń może być nauczycielem itp. Ale myślę, że rozumiesz różnicę w porównaniu na przykład z Animal -> Dog. Pies jest koniecznie Zwierzęciem. Rodzic / dziecko zazwyczaj ma związek („Rodzic ma dziecko”), podczas gdy zwierzę / pies to związek „to” . Zobacz aioo.be/2016/06/29/a-child-is-not-always-a-parent.html
aioobe
2
@AaronFranke, „Czy są jakieś ograniczenia dotyczące użycia super?” - Tak, super(...)może być użyty tylko jako pierwsza instrukcja w konstruktorze.
aioobe,
154

Kilka faktów:

  1. super() służy do połączenia z bezpośrednim rodzicem.
  2. super() może być używany z elementami instancji, tj. zmiennymi instancji i metodami instancji.
  3. super() można użyć w konstruktorze do wywołania konstruktora klasy nadrzędnej.

OK, teraz praktycznie zaimplementujmy te punkty super().

Sprawdź różnicę między programem 1 a 2. Tutaj program 2 potwierdza naszą pierwszą instrukcję super()w języku Java.

Program 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();
    }
}

Wynik:

200
200

Teraz sprawdź program 2 i spróbuj ustalić główną różnicę.

Program 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();
    }
}

Wynik:

100
200

W programie 1 dane wyjściowe pochodziły tylko z klasy pochodnej. Nie można wydrukować zmiennej ani klasy podstawowej, ani klasy nadrzędnej. Ale w programie 2 używaliśmy super()zmiennej apodczas drukowania danych wyjściowych, i zamiast awypisywać wartość zmiennej klasy pochodnej, wypisał wartość zmiennej aklasy bazowej. Udowadnia to, że super()służy do wywoływania bezpośredniego rodzica.

OK, teraz sprawdź różnicę między programem 3 a programem 4.

Program 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();
    }
}

Wynik:

200

Tutaj wyjście 200. Kiedy zadzwoniliśmy Show()The Show()funkcją klasy pochodnej została wywołana. Ale co powinniśmy zrobić, jeśli chcemy wywołać Show()funkcję klasy nadrzędnej? Sprawdź program 4 dla rozwiązania.

Program 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();
    }
}

Wynik:

100
200

Tutaj otrzymujemy dwa dane wyjściowe, 100 i 200. Kiedy Show()wywoływana jest funkcja klasy pochodnej, najpierw wywołuje Show()funkcję klasy nadrzędnej, ponieważ wewnątrz Show()funkcji klasy pochodnej wywołaliśmy Show()funkcję klasy nadrzędnej poprzez wstawienie superkluczowe przed nazwą funkcji.

SimonGates
źródło
4
Dlaczego nie wcięłeś przykładów kodu źródłowego? Czy jest jakiś konkretny powód?
erikbwork
NIE erikb, chcę poznać użycie super (). Odtąd tylko idę do
Mohan
W mojej klasie bazowej przeciążam konstruktora jednym, dwoma ... argumentami
Mohan
ale w mojej klasie pochodnej używam super () bez żadnych argumentów. co się stanie, jeśli automatycznie wywoła domyślnego konstruktora klasy podstawowej
Mohan
2
super()nie jest słowem kluczowym. Jest to wywołanie konstruktora. superjest słowem kluczowym, a # 1 i # 2 mają sens tylko w tej definicji.
Markiz Lorne
37

Artykuł źródłowy: Java: Calling super ()


Tak. super(...)wywoła konstruktora superklasy.

Ilustracja:

wprowadź opis zdjęcia tutaj


Przykład samodzielny:

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();
    }
}

Wydruki:

Constructing an animal: From Dog constructor
Constructing a dog.
aioobe
źródło
W mojej klasie bazowej przeciążam konstruktor jednym, dwoma ... argumentami w mojej klasie pochodnej i używam super () bez żadnych argumentów. co się stanie, jeśli automatycznie wywoła domyślnego konstruktora klasy podstawowej
Mohan
Tak. Wywołanie super()wywoła konstruktora nadklasy, który nie przyjmuje żadnych argumentów. Podobnie, jeśli to zrobisz super(arg1), wywoła konstruktor 1-argumentowy i tak dalej.
aioobe
jeśli nie było konstruktora bez argumentów w klasie bazowej, co się stanie, jeśli klasa pochodna wywoła super ().
Mohan
1
Nic. Nie będzie się kompilować. Jeśli sam zapewnisz konstruktor, automatyczny / domyślny / no-argument-konstruktor nie zostanie wygenerowany, a zatem super()nie będzie prawidłowym wywołaniem.
aioobe
29

Czy funkcja super () służy do wywoływania konstruktora nadrzędnego?

Tak.

Pls wyjaśniają o Super ().

super()jest specjalnym zastosowaniem supersłowa kluczowego, w którym wywoływany jest konstruktor bez parametrów. Zasadniczo supersłowa kluczowego można używać do wywoływania przesłoniętych metod, uzyskiwania dostępu do ukrytych pól lub wywoływania konstruktora nadklasy.

Oto oficjalny samouczek

Heinzi
źródło
5
super()służy do wywołania konstruktora nadrzędnego, super.myMethod()służy do wywołania przesłoniętej metody.
Sean Patrick Floyd
2
@seanizer lub dowolna inna metoda nadklasy (w tym statyka), jeśli jest objęta zakresem. super jest tylko odniesieniem do twojej klasy podstawowej.
atamanroman
3
Nie sądzę, że super () służy do wywoływania metod klasy podstawowej. Możesz jednak użyć super.method ().
Dheeraj Joshi
@seanizer, @Dheeraj: Dzięki za opinie, dostosowałem swoją odpowiedź.
Heinzi
7

Nazywanie superstruktorem bez argumentów to tylko strata miejsca na ekranie i czas programisty. Kompilator generuje dokładnie ten sam kod, niezależnie od tego, czy go napiszesz, czy nie.

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

class Implicit {
    Implicit() {
    }
}
Roland Illig
źródło
Znalazłem go w kilku klasach, nie jestem pewien, jaki był cel. Twoja odpowiedź jest pomocna.
iprashant
6

Tak, super()(małe litery) wywołuje konstruktora klasy nadrzędnej. Możesz dołączyć argumenty:super(foo, bar)

Istnieje również supersłowo kluczowe, którego można użyć w metodach w celu wywołania metody nadklasy

Skutkuje to szybkie google dla „Java super”

Bozho
źródło
4

To jest poprawne. Super służy do wywołania konstruktora nadrzędnego. Załóżmy, że masz taki blok kodu

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;
    }
}

Następnie możesz przypisać wartość do zmiennej członka n.

Sagar V.
źródło
2

Widziałem wszystkie odpowiedzi. Ale wszyscy zapomnieli wspomnieć o jednym bardzo ważnym punkcie:

super () należy wywołać lub użyć w pierwszym wierszu konstruktora.

Pritam Banerjee
źródło
1

Po prostu super (); samodzielnie wywoła domyślnego konstruktora, jeśli istnieje nadklasa klasy. Ale musisz sam napisać domyślny konstruktor. Jeśli nie, Java wygeneruje ją bez implementacji, zapisz super (); , odnosząc się do uniwersalnego obiektu nadklasy, i nie można go nazwać w podklasie.

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.
   }

}
TheArchon
źródło
Bez argumentów .
Markiz Lorne
1

Na przykład w automatyzacji selenu masz obiekt PageObject, który może używać konstruktora rodzica w następujący sposób:

public class DeveloperSteps extends ScenarioSteps {

public DeveloperSteps(Pages pages) {
    super(pages);
}........
Todd Zhang
źródło
1

Chciałbym podzielić się z kodami, co rozumiem.

Super słowo kluczowe w java jest zmienną referencyjną, która służy do odwoływania się do obiektów klasy nadrzędnej. Jest głównie używany w następujących kontekstach:

1. Zastosowanie super ze zmiennymi:

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(); 
    } 
} 

Wynik:-

Maximum Speed: 120
  1. Zastosowanie super z metodami:
/* 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(); 
    } 
}

Wynik:-

This is student class
This is person class

3. Zastosowanie super z konstruktorami:

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(); 
    } 
} 

Wynik:-

Person class Constructor
Student class Constructor
Gulsan Borbhuiya
źródło
0

Konstruktory
W konstruktorze można go używać bez kropki, aby wywoływać innego konstruktora. superwywołuje konstruktora w nadklasie; thiswywołuje konstruktor w tej klasie:

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.
}

superjest przydatny, jeśli superklasa musi się zainicjować. thisprzydaje się, abyś mógł napisać cały twardy kod inicjujący tylko raz w jednym z konstruktorów i wywołać go z wszystkich innych, znacznie łatwiejszych do napisania konstruktorów.

Metody
W dowolnej metodzie można użyć kropki, aby wywołać inną metodę. super.method()wywołuje metodę w nadklasie; this.method()wywołuje metodę w tej klasie:

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]";
}

superjest przydatny w pewnym scenariuszu: jeśli twoja klasa ma taką samą metodę jak twoja nadklasa, Java założy, że chcesz tę w swojej klasie; superpozwala zamiast tego poprosić o metodę nadklasy. thisjest przydatny tylko jako sposób na zwiększenie czytelności kodu.

Olathe
źródło
0

Super kluczowe mogą być wykorzystane do wywołania konstruktora klasy nadrzędnej i zwrócić się do członka nadklasy

Kiedy wywołujesz super () z właściwymi argumentami, faktycznie wywołujemy konstruktor Box , który inicjuje zmienne szerokość , wysokość i głębokość , do których się odwołuje, używając wartości odpowiednich parametrów. Pozostaje tylko zainicjować jego wartość dodaną. Jeśli to konieczne, możesz teraz zrobić zmienne klasowe Box jako prywatne . Umieść w polach prywatnego modyfikatora klasy Box i upewnij się, że masz do nich dostęp bez żadnych problemów.

W nadklasie może znajdować się kilka przeciążonych wersji konstruktorów, dzięki czemu można wywołać metodę super () z różnymi parametrami. Program wykona konstruktor, który pasuje do podanych argumentów.

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;
    }

}
Łucznik
źródło
0

super jest słowem kluczowym. Jest używany w definicji metody podklasy, aby wywołać metodę zdefiniowaną w nadklasie. Nie można wywoływać prywatnych metod nadklasy. Super słowo kluczowe może wywoływać tylko metody publiczne i chronione. Jest również używany przez konstruktorów klas do wywoływania konstruktorów swojej klasy nadrzędnej.

Sprawdź tutaj, aby uzyskać dalsze wyjaśnienia.

otoloye
źródło
0

Jak wspomniano, wewnątrz domyślnego konstruktora znajduje się niejawna funkcja super () wywołana w pierwszym wierszu konstruktora.

Ta super () automatycznie wywołuje łańcuch konstruktorów rozpoczynający się na szczycie hierarchii klas i przesuwa się w dół hierarchii.

Gdyby w hierarchii klas programu były więcej niż dwie klasy, domyślny konstruktor najwyższej klasy zostałby wywołany jako pierwszy .

Oto przykład:

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();
    }
} 

Powyższe spowoduje, że:

Constructor A
Constructor B
Constructor C
Mark Burleigh
źródło