2012-04-30 13 views

Odpowiedz

25

this(...) wywoła innego konstruktora w tej samej klasie, natomiast super() wywoła super konstruktora. Jeśli w konstruktorze nie ma wartości super(), kompilator doda ją niejawnie.

Tak więc, jeśli oba były dozwolone, mógłbyś dwukrotnie wywołać konstruktora super.

Przykład (nie patrzeć na znaczeniu w parametrach):

class A { 
    public A() { 
    this(false); 
    } 

    public A(boolean someFlag) { 
    } 
} 

class B extends A { 
    public B() { 
    super(); 
    } 

    public B(boolean someFlag) { 
    super(someFlag); 
    } 

    public B (int someNumber) { 
    this(); // 
    } 
} 

Teraz, jeśli zadzwonisz new B(5) następujące konstruktory są wywoływane:

 this(false); 
A() ---------------> A(false) 
^ 
| 
| super(); 
| 
|  this(); 
B() <--------------- B(5) <--- you start here 

Aktualizuj:

Jeśli możesz użyć this() i super() możesz skończyć z som ething tak:

(Uwaga: ten ma na celu pokazać, co może pójść źle, jeśli pozwolono zrobić - które na szczęście nie są)

 this(false); 
A() ---------------> A(false) 
^     ^
|     | 
| super();   | super(true); <--- Problem: should the parameter be true or false? 
|     | 
|  this();  | 
B() <--------------- B(5) <--- you start here 

jak można widzisz, napotkasz problem, w którym konstruktor A(boolean) może być wywołany z różnymi parametrami i musisz teraz w jakiś sposób zdecydować, które z nich powinny być użyte. Dodatkowo, inni konstruktorzy (A() i B()) mogą zawierać kod, który teraz może nie być poprawnie wywoływany (to jest nieczynna kolejność itp.), Ponieważ wywołanie super(true) omijałoby je, podczas gdy this() nie byłoby.

4

Zarówno this(), jak i super() są wywołaniami konstruktora, a wywołanie konstruktora musi być pierwszym (i jedynym) wywołaniem w konstruktorze. W przeciwnym razie konstruktor Object będzie wywoływany więcej niż raz podczas tworzenia instancji pojedynczego obiektu.

6

Istnieje różnica między super() i this().

super() - wywołuje konstruktor klasy podstawowej, natomiast
- wywołuje bieżący konstruktor klasy.

Zarówno this(), jak i super() są wywołaniami konstruktora.
Wywołanie konstruktora musi zawsze być pierwszym stwierdzeniem. Tak więc nie możemy mieć dwóch zdań jako pierwszego stwierdzenia, dlatego możemy albo zadzwonić pod numer super(), albo możemy zadzwonić pod numer this() od konstruktora, ale nie oba.

+0

zasadzie przy A używa się tylko jednej instrukcji, co rozumiecie przez "nie możemy mieć dwóch zdań jako pierwszego zdania", to nie ma znaczenia –

+0

to jest to, co powiedziałem .. –

0

Bo to nie ma sensu. Konstruktor musi zadzwonić pod numer this() lub super() (niejawnie lub jawnie).this() dzwoni do innego konstruktora, który musi zadzwonić pod numer this() lub super() itp., Jak wcześniej. Konstruktor, który nazywał oba: this() i super(), ostatecznie wywoływałby ostatecznie dwa razy: super().

2
  • używamy to() kluczowego w konstruktora łańcuchowym, aby uzyskać dostęp do konstruktora samej klasy
  • używamy super() słowa kluczowego, gdy chcemy uzyskać dostęp do konstruktora natychmiastowej klasy dominującej dziedzictwo.

I nie jest to warunek zarówno to, że muszą być zadeklarowane w pierwszej linii konstruktora używasz. I dlatego nie możemy używać obu w jednym konstruktorze, ponieważ możesz napisać tylko jedną rzecz w pierwszej linii .

0

Porównaj przykład poniżej. Klasa FirstChild ustawia nazwę zmiennej instancji w 2 konstruktorach, ponieważ wywołanie drugiego konstruktora od pierwszego jest wykluczone przez konieczność wywołania super().

W klasie SecondChild wprowadzono trzeci prywatny konstruktor, który przyjmuje 2 parametry - pierwszy przekazany do kolacji() i drugi do ustawienia nazwy. Pierwsze 2 konstruktory wywołują trzeci. Super() jest wywoływany dokładnie raz, także zmienna instancji jest ustawiana tylko w jednym konstruktorze. Kod daje ten sam wynik bez potrzeby wywoływania super() i this() w tym samym konstruktorze.

class FirstChild extends ConstructorTest{ 
    private String name = null; 
    public FirstChild(){ 
     super("super text 1"); 
     //this("Unknown"); //UNCOMMENTED DOES NOT COMPILE 
     name = "Unknown"; 
    } 
    public FirstChild(String name){ 
     super("super text 2"); 
     this.name = name; 
    } 
    public String getName(){ 
     return name; 
    } 
} 

class SecondChild extends ConstructorTest{ 
    private String name = null; 
    public SecondChild(){ 
     this("super text 1", "Unknown"); 
    } 
    public SecondChild(String name){ 
     this("super text 2", name); 
    } 
    private SecondChild(String superStr, String name) 
    { 
     super(superStr); 
     this.name = name; 
    } 
    public String getName(){ 
     return name; 
    } 
} 

public class ConstructorTest{ 
    public ConstructorTest(String str){ 
     System.out.println("ConstructorTest constructor called with parameter \"" + str + "\""); 
    } 
    public static void main(String... args) 
    { 
     System.out.println("Hello from main, FirstChild results:"); 
     FirstChild fc1 = new FirstChild(); 
     FirstChild fc2 = new FirstChild("John"); 
     System.out.println("   child fc1 name: " + fc1.getName()); 
     System.out.println("   child fc2 name: " + fc2.getName()); 
     System.out.println("Hello from main, SecondChild results:"); 
     SecondChild sc1 = new SecondChild(); 
     SecondChild sc2 = new SecondChild("John"); 
     System.out.println("   child sc1 name: " + sc1.getName()); 
     System.out.println("   child sc2 name: " + sc2.getName()); 
    } 
} 
0

Bo jeśli używasz this() i super() razem w konstruktorze to daje błąd kompilacji czas. Ponieważ this() i super() musi być pierwszą instrukcją wykonywalną. Jeśli napiszesz this() najpierw niż super() stanie się drugim stwierdzeniem i na odwrót. Dlatego nie możemy razem używać this() i super().

0

to() i super(), oba są konstruktorami, dlatego musi to być pierwsze zdanie. Ale możemy użyć obu w programie.

to(): Jest używane do wywoływania, tej samej klasy Domyślny lub Parametrized Constructor.

super(): Służy do wywołania, natychmiastowa klasa super/rodzica Domyślna lub Parametrizowana konstrukcja.

//Super Class 
    public class SuperConstructor { 
    SuperConstructor(){ 
     this(10); 
     System.out.println("Super DC"); 
    } 

    SuperConstructor(int a){ 
     this(10,20); 
     System.out.println("Suer SPC with Iteger"); 
    } 

    SuperConstructor(int i,int j){ 
     System.out.println("Super with DPC with Iteger and Integer"); 
    } 
} 


//subclass 
    public class ThisConstructor extends SuperConstructor{ 
    ThisConstructor(){ 
     this(10,20); 
     System.out.println("Subcalss DC ");//DC Default Constructor 
    } 

    ThisConstructor(int i){ 
     super(i);  
     System.out.println("Subcalss SPC with Iteger");//SPC Single Parameterized Constructor 
    } 

    ThisConstructor(int i, String s){ 
     this(); 
     System.out.println("Subcalss DPC with Iteger and String");//DPC double Parameterized Constructor 
    } 

    ThisConstructor(int i,int age){ 
     super(i,age); 
     System.out.println("Subcalss DPC with Iteger and Integer"); 
    } 

    public static void main(String []k){ 
     System.out.println("=================Frist time Calling ==========================\n"); 
     ThisConstructor t = new ThisConstructor(1); 


     System.out.println("=================Second time Calling ==========================\n"); 
     ThisConstructor t1 = new ThisConstructor(1,2); 
    } 
} 
Powiązane problemy