2012-05-08 15 views
35

Mam do czynienia z klasą, która rozszerza JFrame.Dlaczego wywołanie super() w konstruktorze?

To nie jest mój kod i wywołuje super super przed rozpoczęciem konstruowania GUI. Zastanawiam się, dlaczego tak się dzieje, ponieważ zawsze miałem dostęp do metod nadklasy bez konieczności dzwonienia pod numer super();

+0

Nota boczna: rozszerzenie 'JFrame' prawdopodobnie nie jest tym, co zamierzałeś zrobić. Rozszerzenie oznacza relację is-a. O ile nie tworzysz nowego komponentu okna, prawdopodobnie powinieneś rozszerzać 'JComponent'. – Jeffrey

Odpowiedz

64

Istnieje niejawne połączenie z super() bez żadnych argumentów dla wszystkich klas, które mają element macierzysty - czyli każda klasa zdefiniowana przez użytkownika w Javie - więc wywoływanie jej jawnie zazwyczaj nie jest wymagane. Jednak możesz może użyć wywołania do super() z argumentami, jeśli konstruktor nadrzędny bierze parametry, i chcesz je określić. Co więcej, jeśli konstruktor nadrzędny pobiera parametry i nie ma domyślnego konstruktora bez parametrów, będzie trzeba potrzebować, aby wywołać super() z argumentami.

Przykładem, gdzie wyraźne wezwanie do super() daje jakąś dodatkową kontrolę nad tytułem Rama:

class MyFrame extends JFrame 
{ 
    public MyFrame() { 
     super("My Window Title"); 
     ... 
    } 
} 
+0

_Dlatego ważne: _ wywołanie konstruktora _superclass_ musi być pierwszym wierszem ** w konstruktorze _subclass_. Powiązane informacje tutaj: [Dlaczego to() i super() muszą być pierwszą instrukcją w konstruktorze?] (Https://stackoverflow.com/questions/1168345/why-do-this-and-super-have- to-be-the-first-statement-in-a-constructor) – informatik01

14

Połączenie z pustym konstruktorem twojej klasy macierzystej super() odbywa się automatycznie, gdy nie robisz tego sam. To jest powód, dla którego nigdy nie musiałeś tego robić w swoim kodzie. To było zrobione dla ciebie.

Gdy twoja nadklasa nie ma konstruktora no-arg, kompilator będzie wymagał wywołania super z odpowiednimi argumentami. Kompilator sprawdzi, czy poprawnie utworzysz klasę. Więc nie jest to coś, o co musisz się martwić.

Niezależnie od tego, czy wywołasz super() w swoim konstruktorze, czy nie, nie ma to wpływu na możliwość wywołania metod twojej klasy nadrzędnej.

Na marginesie niektórzy twierdzą, że zazwyczaj najlepiej jest wykonywać połączenie ręcznie w celu zachowania przejrzystości.

+0

Należy również zauważyć, że jawne wywołanie 'super()' jest wymagane, gdy trzeba przekazać do niego argumenty. –

+0

@SamDufel Dobra rozmowa, zobacz moje edycje. –

0

Po prostu wywołuje domyślnego konstruktora nadklasy.

+1

Nie odpowiada na pytanie, które jest "dlaczego". Nie używaj formatowania kodu dla tekstu, który nie jest kodem. – EJP

0

mamy dostęp SuperClass członków za pomocą super()

Jeśli metoda nadpisuje jedną z jego metod nadklasy, można wywołać metodę nadpisaną za pomocą słowa kluczowego super. Możesz również użyć polecenia super, aby odnieść się do ukrytego pola (chociaż odstraszanie pól ukrytych jest odradzane). Rozważmy tę klasę, SuperClass:

public class Superclass { 

    public void printMethod() { 
     System.out.println("Printed in Superclass."); 
    } 
} 

// Tutaj jest podklasą, zwany Podklasa, który nadpisuje printMethod():

public class Subclass extends Superclass { 

    // overrides printMethod in Superclass 
    public void printMethod() { 
     super.printMethod(); 
     System.out.println("Printed in Subclass"); 
    } 
    public static void main(String[] args) { 
     Subclass s = new Subclass(); 
     s.printMethod();  
    } 
} 

ciągu podklasie prosta nazwa printMethod() odnosi się do jednego zadeklarowanego w podklasie których zastępuje ten w Superklasie. Tak więc, odnosząc się do printMethod() odziedziczonej z Superklasy, Subklasa musi używać kwalifikowanej nazwy, używając super jak pokazano.Kompilacja i wykonywanie odbitek podklasy następuje:

Printed in Superclass. 
Printed in Subclass 
+0

Pierwsze zdanie jest niepoprawne, a żadne z nich nie odpowiada na pytanie. – EJP

2

Możemy dostęp Super elementy klasy za pomocą super-metody

Rozważmy mamy dwie klasy, klasa nadrzędna i klasy dla dzieci z różnymi implementacjami metody foo. Teraz w klasie potomnej, jeśli chcemy wywołać metodę foo klasy nadrzędnej, możemy to zrobić przez super.foo(); możemy również uzyskać dostęp do elementów nadrzędnych metodą super().

class parent { 
    String str="I am parent"; 
    //method of parent Class 
    public void foo() { 
     System.out.println("Hello World " + str); 
    } 
} 

class child extends parent { 
    String str="I am child"; 
    // different foo implementation in child Class 
    public void foo() { 
     System.out.println("Hello World "+str); 
    } 

    // calling the foo method of parent class 
    public void parentClassFoo(){ 
     super.foo(); 
    } 

    // changing the value of str in parent class and calling the foo method of parent class 
    public void parentClassFooStr(){ 
     super.str="parent string changed"; 
     super.foo(); 
    } 
} 


public class Main{ 
     public static void main(String args[]) { 
      child obj = new child(); 
      obj.foo(); 
      obj.parentClassFoo(); 
      obj.parentClassFooStr(); 
     } 
    } 
Powiązane problemy