Obecnie uczę się dziedziczenia klas na moim kursie Java i nie rozumiem, kiedy używać super()
wywołania?
Edycja:
znalazłem ten przykład kodu, w którym jest używany:super.variable
class A
{
int k = 10;
}
class Test extends A
{
public void m() {
System.out.println(super.k);
}
}
Rozumiem więc, że tutaj musisz użyć, super
aby uzyskać dostęp do k
zmiennej w superklasie. Jednak w każdym innym przypadku, co robi super();
? Na własną rękę?
java
inheritance
super
muttley91
źródło
źródło
super
nie jest wymagane odniesieniek
.k
można odwoływać się bezpośrednio.super
byłby wymagany tylkoA.k
wtedy, gdyby zadeklarowałeś inne pole o nazwiek
wTest
(Test.k
).Odpowiedzi:
Dzwonienie dokładnie
super()
jest zawsze zbędne. To jawnie robi to, co byłoby niejawnie zrobione w inny sposób. Dzieje się tak, ponieważ jeśli pominiesz wywołanie super-konstruktora, super-konstruktor bez argumentów zostanie i tak wywołany automatycznie. Nie mówiąc, że to zły styl; niektórzy lubią mówić wprost.Jednak gdy staje się to przydatne, to superkonstruktor 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"); } }
źródło
super
jest stosowany do wywołaniaconstructor
,methods
aproperties
klasy nadrzędnej.źródło
Możesz także użyć
super
słowa kluczowego w podklasie, gdy chcesz wywołać metodę z klasy nadrzędnej, gdy zastąpiłeś ją 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łujeprint()
metodę nadklasyCellPhone
. Wynik będzie:I'm a cellphone I'm a touch screen cellphone
źródło
Kiedy chcesz wywołać konstruktor superklasy - aby zainicjować pola w nim zawarte. Zapoznaj się z tym artykułem, aby dowiedzieć się, kiedy go używać:
http://download.oracle.com/javase/tutorial/java/IandI/super.html
źródło
super()
, ponieważ Java domyślnie go doda. Ale musisz zadzwonić,super(args)
jeśli potrzebujesz innego niż domyślny konstruktora nadrzędnego.Można go użyć jako pierwszego wiersza konstruktora podklasy do wywołania konstruktora swojej klasy nadrzędnej.
Na przykład:
public class TheSuper{ public TheSuper(){ eatCake(); } } public class TheSub extends TheSuper{ public TheSub(){ super(); eatMoreCake(); } }
Skonstruowanie instancji
TheSub
wywoła zarównoeatCake()
ieatMoreCake()
źródło
Możesz go użyć do wywołania metody nadklasy (np. Gdy nadpisujesz taką metodę, super.foo () itp.) - to pozwoliłoby ci zachować tę funkcjonalność i dodać do niej wszystko, co masz w nadpisaniu metoda.
źródło
Super zadzwoni do metody rodzica. Zobacz: http://leepoint.net/notes-java/oop/constructors/constructor-super.html
źródło
Wzywasz
super()
specjalnie do uruchomienia konstruktora swojej nadklasy. Biorąc pod uwagę, że klasa może mieć wiele konstruktorów, możesz wywołać określony konstruktor za pomocąsuper()
lubsuper(param,param)
lub pozwolić Java obsłużyć to i wywołać standardowy konstruktor. Pamiętaj, że klasy, które są zgodne z hierarchią klas, są zgodne z relacją „jest-jest”.źródło
Pierwsza linia konstruktora Twojej podklasy musi być wywołaniem,
super()
aby zapewnić wywołanie konstruktora nadklasy.źródło
super(some args)
, niesuper()
. Ale chodzi o to, że „musi” jest błędne. Gwarantujemy, że jeden z konstruktorów superklasy będzie wywoływany, dopóki klasa się kompiluje.super(...)
. Nie ma absolutnie żadnego niebezpieczeństwa; po prostu niebezpieczeństwo, że się nie skompiluje.Właśnie spró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(); } }
źródło
Ze strony dokumentacji oracle :
Możesz również użyć
super
w odniesieniu do ukrytego pola (chociaż ukrywanie pól jest odradzane).Użycie
super
w konstruktorze podklas:Składnia wywołania konstruktora nadklasy to
super();
lub:
super(parameter list);
W
super()
przypadku wywoływany jest bezargumentowy konstruktor nadklasy. Wsuper(parameter list)
przypadku wywoływany jest konstruktor nadklasy z pasującą listą parametrów.Uwaga: Jeśli konstruktor nie wywołuje jawnie konstruktora nadklasy, kompilator języka Java automatycznie wstawia wywołanie do konstruktora bezargumentowego nadklasy . Jeśli super klasa nie ma konstruktora bezargumentowego, wystąpi błąd kompilacji.
Powiązany post:
Polimorfizm a zastępowanie a przeciążanie
źródło