Kiedy używać super ()?

Obecnie uczę się dziedziczenia klas w moim kursie Java i nie rozumiem, kiedy użyć wywołania super()?

Edit:
Znalazłem ten przykład kodu, gdzie super.variable jest używany:

class A
{
    int k = 10;
}

class Test extends A
{
    public void m() {
        System.out.println(super.k);
    }
}

Więc rozumiem, że tutaj musisz użyć super, aby uzyskać dostęp do zmiennej k W super-klasie. Jednak w każdym innym przypadku, co robi super();? Sama?

Author: muttley91, 2010-11-03

11 answers

Wywołanie dokładnie super() jest Zawsze zbędny. Wyraźnie robi to, co w sposób dorozumiany byłoby zrobione w przeciwnym razie. To dlatego, że jeśli pominiesz wywołanie super konstruktora, bez argumentu Super konstruktor zostanie wywołany automatycznie. Nie mówiąc, że to zły styl; niektórzy ludzie lubią być wyraźni.

Jednakże, gdy staje się to przydatne, to gdy super konstruktor pobiera argumenty, które chcesz przekazać z podklasy.

public class Animal {
   private final String noise;
   protected Animal(String noise) {
      this.noise = noise;
   }

   public void makeNoise() {
      System.out.println(noise);
   }
}

public class Pig extends Animal {
    public Pig() {
       super("Oink");
    }
}
 128
Author: Mark Peters,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-03 20:07:01

super służy do wywoływania constructor, methods i properties klasy rodzica.

 38
Author: Zain Shaikh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-03 19:33:42

Możesz również użyć słowa kluczowego super w podklasie, gdy chcesz wywołać metodę z klasy nadrzędnej, gdy ją nadpisałeś w podklasie.

Przykład:

public class CellPhone {
    public void print() {
        System.out.println("I'm a cellphone");
    }
}

public class TouchPhone extends CellPhone {
    @Override
    public void print() {
        super.print();
        System.out.println("I'm a touch screen cellphone");
    }
    public static void main (strings[] args) {
        TouchPhone p = new TouchPhone();
        p.print();
    }
}

Tutaj linia super.print() wywołuje metodę print() klasy nadrzędnej CellPhone. Wyjście będzie:

I'm a cellphone
I'm a touch screen cellphone
 19
Author: Dhiraj Shekar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-15 16:30:28

Gdy chcesz, aby konstruktor klasy super został wywołany-aby zainicjalizować pola w nim. Zapoznaj się z tym artykułem, aby dowiedzieć się, kiedy go używać:

Http://download.oracle.com/javase/tutorial/java/IandI/super.html

 9
Author: Jon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-03 19:28:48

Użyłbyś go jako pierwszej linii konstruktora podklasy do wywołania konstruktora jego klasy nadrzędnej.

Na przykład:

public class TheSuper{
    public TheSuper(){
        eatCake();
    }
}

public class TheSub extends TheSuper{
    public TheSub(){
        super();
        eatMoreCake();
    }
}

Konstruowanie instancji TheSub wywoła zarówno eatCake(), jak i eatMoreCake()

 8
Author: TartanLlama,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-15 16:15:26

Możesz go użyć do wywołania metody superclass (np. gdy nadpisujesz taką metodę, super.foo () etc) -- to pozwoli Ci zachować tę funkcjonalność i dodać do niej cokolwiek innego masz w nadpisanej metodzie.

 1
Author: AHungerArtist,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-03 19:28:08
 1
Author: Ben Groot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-03 19:28:18

Wywołujesz super(), aby konkretnie uruchomić konstruktor swojej superklasy. Biorąc pod uwagę, że klasa może mieć wiele konstruktorów, możesz wywołać konkretny konstruktor używając super() lub super(param,param) oder, możesz pozwolić Javie obsłużyć to i wywołać standardowy konstruktor. Pamiętaj, że klasy, które podążają za hierarchią klas, podążają za relacją "is-a".

 1
Author: 0xCAFEBABE,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-12 09:24:04

Pierwsza linia konstruktora podklasy musi być wywołaniem super(), aby upewnić się, że konstruktor klasy nadrzędnej zostanie wywołany.

 0
Author: robev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-12 17:42:43

Właśnie próbowałem, komentując super (); robi to samo bez komentowania jak powiedział @ Mark Peters

package javaapplication6;

/**
 *
 * @author sborusu
 */
public class Super_Test {
    Super_Test(){
        System.out.println("This is super class, no object is created");
    }
}
class Super_sub extends Super_Test{
    Super_sub(){
       super();
       System.out.println("This is sub class, object is created");
    }
    public static void main(String args[]){
        new Super_sub();
    }
}
 0
Author: user2567665,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-19 09:11:21

Z dokumentacji oracle Strona :

Jeśli twoja metoda nadpisuje jedną z metod klasy nadrzędnej, możesz wywołać nadpisaną metodę za pomocą słowa kluczowego super.

Możesz również użyć super, aby odnieść się do ukrytego pola(chociaż ukrywanie pól jest zniechęcane).

Użycie super w konstruktorze podklas:

Wywołanie konstruktora klasy nadrzędnej musi być pierwszą linią w podklasie konstruktor.

Składnia wywołania konstruktora klasy superclass to

super();  

Lub:

super(parameter list);

Z super() wywoływany jest superklasowy konstruktor bez argumentu. Za pomocą super(parameter list) wywoływany jest konstruktor klasy superclass z pasującą listą parametrów.

Uwaga: jeśli konstruktor nie wywoła jawnie konstruktora klasy nadrzędnej, kompilator Javy automatycznie wstawia wywołanie do konstruktora klasy nadrzędnej bez argumentu . Jeśli super klasa nie ma konstruktor bez argumentu, otrzymasz błąd w czasie kompilacji.

Related post:

Polimorfizm a nadmiarowość a przeciążenie

 0
Author: Ravindra babu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-25 10:07:58