2017-07-24 4 views
2

Ich versuche, Java super() Konstruktor zu verstehen. Werfen wir einen Blick in die folgende Klasse:Verstehen Java super() Konstruktor

class Point { 
    private int x, y; 

    public Point(int x, int y) { 
     this.x = x; 
     this.y = y; 
    } 

    public Point() { 
     this(0, 0); 
    } 
} 

Diese Klasse wird kompiliert. Wenn wir ein neues Point Objekt say Point a = new Point(); erstellen, wird der Konstruktor ohne Parameter aufgerufen: Point().

Korrigieren Sie mich, wenn ich falsch liege, bevor Sie this(0,0) tun, wird der Class Konstruktor aufgerufen und nur dann Point(0,0) wird aufgerufen. Wenn das wahr ist, ist es richtig zu sagen, dass super() standardmäßig aufgerufen wird?

jetzt ist auf dem gleichen Code mit einer kleinen Änderung aussehen lassen:

class Point { 

     private int x, y; 

     public Point(int x, int y) { 
      this.x = x; 
      this.y = y; 
     } 

     public Point() { 
      super(); // this is the change. 
      this(0, 0); 
     } 
    } 

Nun wird der Code kompiliert, da this(0,0) nicht in der ersten Zeile des Konstruktors ist. Hier werde ich verwirrt. Warum wird der Code nicht kompiliert? Wird nicht super() trotzdem aufgerufen? (Der Klassenkonstruktor wie oben beschrieben).

+0

Point ist keine Unterklasse. Stellen wir uns vor, wir hätten eine Unterklasse PrettyPoint, dann PrettyPoint() {super (0,0); } würde Point (int x, int y) von oben aufrufen. – ZeldaZach

+1

Dies wird Ihnen helfen zu verstehen: https://stackoverflow.com/questions/10381244/why-cant-this-and-super-both-be-used-together-in-a-constructor –

+0

@ZeldaZach Alles ist eine Unterklasse von 'Objekt'. –

Antwort

4

können Sie rufen this()odersuper() aber beide nicht vom gleichen Konstruktor.Wenn Sie this() anrufen, wird super() automatisch von dem anderen Konstruktor aufgerufen (derjenige, den Sie mit this() aufrufen).

+0

Und deshalb habe ich 2x Anrufe für super(). Vielen Dank. – Romansko

+1

@Rom Wenn der Code kompilieren könnte, wäre das eines der Ergebnisse, ja. –

1

Wenn Sie this(...) aufrufen, müssen Sie den Superkonstruktor (falls vorhanden) im Konstruktor aufrufen, den Sie dort aufrufen.

Das Aufrufen von this(...) oder super(...) ist immer die erste Methode, die Sie in einem Konstruktor aufrufen.

EDIT

class Point { 
    private int x, y; 

    public Point(int x, int y) { 
     super(...); //would work here 
     this.x = x; 
     this.y = y; 
    } 

    public Point() { 
     this(0, 0); //but this(...) must be first in a constructor if you want to call another constructor 
    } 
} 
+0

Dies ist genau mein Punkt. Wenn ich gezwungen bin, den Superkonstruktor aufzurufen, welchen Unterschied macht es, wenn ich es explizit mit super() anrufe und dann dieses (..) aufruft? – Romansko

+1

Sie dürfen super/this nicht als zweite Methode aufrufen. Wenn Sie einen Superkonstruktor aufrufen möchten, müssen Sie dies in dem Konstruktor tun, den Sie aufrufen. – Cedric

5

this(0, 0); rufen, Konstruktor der gleichen Klasse und super() werden Super-/Elternklasse von Point Klasse aufrufen.

Jetzt wird der Code nicht kompilieren, weil dies (0,0) nicht in der ersten Zeile des Konstruktors ist. Hier werde ich verwirrt. Warum wird der Code nicht kompilieren? Wird super() sowieso nicht aufgerufen?

super() muss die erste Zeile des Konstruktors sein und auch this() muss die erste Zeile im Konstruktor sein. Also können beide nicht in der ersten Zeile stehen (nicht möglich), dh wir können nicht beide in einem Konstruktor hinzufügen.

Als explonation über Ihren Code:

this(0, 0); wird an den Konstruktor aufrufen, die zwei Parameter (in Point Klasse) hat und dass zwei Parameter Konstruktor wird implizit in den super() nennen (weil Sie es explizit nur knapp sein Ziel zu nennen).

4

Setzen Sie super() in Ihrem ersten Konstruktor, es sollte funktionieren.

class Point { 
 

 
     private int x, y; 
 

 
     public Point(int x, int y) { 
 
      super(); // this is the change. 
 
      this.x = x; 
 
      this.y = y; 
 
     } 
 

 
     public Point() { 
 
      
 
      this(0, 0); 
 
     } 
 
    }

1

Ein Konstruktor kann den Konstruktor einer Superklasse mit dem Methodenaufruf super() aufrufen. Einzige Einschränkung ist, dass es die erste Aussage sein sollte.

public Animal() { 
    super(); 
    this.name = "Default Name"; 
} 

Wird dieser Code kompilieren?

public Animal() { 
    this.name = "Default Name"; 
    super(); 
} 

Antwort ist NO. super() sollte immer in der ersten Zeile des Konstruktors aufgerufen werden.