2010-11-03 19 views
68

Obecnie uczę się o dziedziczeniu klas w moim kursie Java i nie rozumiem, kiedy użyć połączenia super()?Kiedy używam super()?

Edit:
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); 
    } 
} 

więc rozumiem, że tutaj trzeba użyć super dostęp do zmiennej k w super-klasie. Jednak w każdym innym przypadku, co robi super();? Na własną rękę?

+29

Właściwie w tym przykładzie 'super' nie jest wymagane, aby odwołać się do' k'. "k" można odwoływać się bezpośrednio. 'super' będzie wymagane tylko do uzyskania' A.k', jeśli zadeklarowałeś inne pole o nazwie 'k' w' Test' ('Test.k'). –

Odpowiedz

126

Wywołanie dokładniesuper() jest zawsze zbędne. Wyraźnie robi to, co w domyśle byłoby inaczej. Dzieje się tak, ponieważ jeśli pominąć połączenie z super konstruktorem, super-konstruktor bezargumentowy zostanie tak czy inaczej wywołany automatycznie. Nie powiedzieć, że to zły styl; niektórzy ludzie lubią być jawnymi.

Jednakże, gdy staje się użyteczny, jest 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"); 
    } 
} 
+2

Załóżmy, że metoda została nadpisana w klasie potomnej, a następnie ponownie przetworzona w klasie potomnej. (Wielopoziomowe dziedziczenie) Co, jeśli musimy zadzwonić metodą dziadka i rodzica jednocześnie do klasy wnuków. W jaki sposób super będzie używany? – h8pathak

+0

@ h8pathak: Jeśli pytasz, w jaki sposób klasa potomna może ominąć implementację rodzica, ale zadzwonić do dziadków, to nie jest to możliwe w Javie. –

1

Można go użyć do wywołania metody nadklasy (np. Gdy nadpisujesz taką metodę, super.foo() itd.) - to pozwoliłoby ci zachować tę funkcjonalność i dodać do niej cokolwiek innego mieć w overriden metoda.

0

Pierwszy wiersz konstruktora Twojej podklasy musi być połączeniem do super(), aby zapewnić wywołanie konstruktora superklasy.

+0

Nieprawda. To się stanie automatycznie. –

+0

Nawet jeśli nie ma domyślnego konstruktora? Jak będzie wiedział, co przekazać? – robev

+0

Jeśli nie ma domyślnego konstruktora, musisz wywołać 'super (niektóre argumenty)', a nie 'super()'. Ale chodzi o to, że "musi" jest złe. Jeden z konstruktorów superklasy ma ** gwarantowane **, aby można go było nazwać tak długo, jak kompiluje klasę. –

9

Jeśli chcesz wywołać super-klasy konstruktora - aby zainicjować pola w nim. Spójrz na ten artykuł do zrozumienia, kiedy go używać:

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

+4

Jak mówi się w łączu, nigdy nie * masz * na wywoływanie 'super()', ponieważ Java doda ją domyślnie. Ale musisz wywołać 'super (args)' jeśli potrzebujesz innego niż domyślny konstruktora macierzystego. –

8

by użyć go jako pierwszy wiersz konstruktora podklasy aby wywołać konstruktor tej klasy nadrzędnej.

Na przykład:

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

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

Konstruowanie instancją TheSub nazwałbym zarówno eatCake() i eatMoreCake()

1

zadzwonić super() specjalnie uruchomić konstruktor swojej nadklasy. Biorąc pod uwagę, że klasa może mieć wiele konstruktorów, możesz zadzwonić do konkretnego konstruktora, używając super() lub super(param,param) lub możesz pozwolić Java go obsłużyć i wywołać standardowy konstruktor. Pamiętaj, że klasy zgodne z hierarchią klas są zgodne z relacją "is-a".

39

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

18

Można również użyć słowa kluczowego super w klasie sub gdy chcesz wywołać metodę z klasy nadrzędnej, gdy zostały zastąpione go 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ę nadklasy CellPhoneprint(). Wyjście będzie:

I'm a cellphone 
I'm a touch screen cellphone 
+0

było to (String [] args) w linii głównej deklaracji metody? Wielkie dzięki! –

0

Z dokumentacji systemu Oracle page:

Jeśli metoda zastępuje jedną z metod nadklasy, można wywołać metodę zastąpiona przez użycie słowa kluczowego super.

Możesz również użyć super, aby odnieść się do ukrytego pola (choć odstraszanie pól ukrytych jest odradzane).

Zastosowanie super w konstruktorze podklasy:

Inwokacja z konstruktora nadklasy musi być w pierwszej linii w konstruktorze podklasy.

Składnia wywołanie konstruktora nadklasy jest

super(); 

czyli

super(parameter list); 

Z super(), konstruktor nadklasy bez argumentów jest tzw. Za pomocą super(parameter list) wywoływany jest konstruktor nadklasy z pasującą listą parametrów.

Uwaga: Jeśli konstruktor nie jawnie wywołać konstruktor nadklasy, kompilator Javy automatycznie wstawia wywołanie konstruktora no-argument nadklasy. Jeśli super klasa nie ma konstruktora bezargumentowego, otrzymasz błąd podczas kompilacji.

Related Post:

Polymorphism vs Overriding vs Overloading

0

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

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