2017-04-26 3 views
0

Ich lerne über Vererbung und arbeite mit diesem einfachen Programm, das eine Oberklasse und eine Unterklasse hat, wie unten gezeigt. Meine Frage ist nicht spezifisch für dieses Programm; Allerdings habe ich das zum ersten Mal gesehen, also verwende ich es als Beispiel für eine allgemeinere konzeptionelle Frage.

Warum führt die einfache Instanziierung der Klasse die Konstruktoren aus und gibt den Inhalt aus? Mein vorhergehendes Verständnis war, dass das Instanziieren der Klasse einfach das Objekt erstellt, aber es wird nichts tun.Warum werden bei der Instanziierung einer Klasse die Inhalte der Klasse ausgegeben?

SuperClass1.java

public class SuperClass1 { 
      public SuperClass1(){   
       System.out.println("This is the superclass constructor."); 
      } 
     } 

SubClass2.java

public class SubClass2 extends SuperClass1 
{ 
    public SubClass2() 
    { 
     System.out.println("This is the subclass constructor."); 
    } 

} 

Main.java

public class Main { 

    public static void main(String[] args) 
    { 
     SubClass2 obj1 = new SubClass2(); // why should this print something? 
    } 
} 

Ausgabe
Dies ist der Superklassenkonstruktor.
Dies ist der Unterklassenkonstruktor.

+0

"Instanziiert die Klasse" bedeutet oft * etwas tun *. Java selbst weiß eigentlich nicht, wie man etwas anderes macht, als jedes Feld auf 0 (oder null oder falsch) zu setzen.Das ist die meiste Zeit nicht genug, also müssen Klassen tatsächlich etwas tun, wenn sie instanziiert werden. In Ihrem Fall enthält die "Instanziierung" eine "println". – markspace

+0

Weil das so funktioniert. Ich empfehle die Oracle Java Tutorials zu lesen, da dort alle grundlegenden Dinge erklärt werden. – Kayaman

Antwort

0

Zunächst bedeutet das Instanziieren eines Objekts den Aufruf (und die Ausführung) des Konstruktors, für den es gedacht ist.

Also, das:

SubClass2 newInstance = <createNewInstance>; 
newInstance.<init()>; 

ist sowohl durch den Konstruktoraufruf getan new SubClass2() in Java. Es gibt keine Trennung zwischen "Konstruieren" des Objekts und "Initialisieren" seiner Eigenschaften.

Wenn Sie nicht explizit einen anderen Konstruktor einer Superklasse aufrufen, wird der Standardkonstruktor (der ohne Argumente) automatisch als erstes beim Erstellen eines Objekts einer Klasse aufgerufen. Wenn Sie also ein Objekt der Unterklasse instanziieren, wird der Superklassenkonstruktor aufgerufen (der die erste Zeile druckt) und dann die zweite Zeile selbst gedruckt.

Im einzelnen sieht die Unterklasse wie diese hinter der Szene:

public class SubClass2 extends SuperClass1 
{ 
    public SubClass2() 
    { 
     super(); // calls the superclass constructor 
     System.out.println("This is the subclass constructor."); 
    } 
} 
+0

http://www.geeksforgeeks.org/g-fact-67/ Dies sieht Ihrem Beispiel sehr ähnlich und fügt ein weiteres Beispiel mit parametrisierten Konstruktoren hinzu. –

+0

Danke! Das beantwortet perfekt, was ich zu verstehen versuchte! –

+0

@MalteHartwig Wenn eine Klasse geladen und instanziiert wird, muss kein Konstruktor aufgerufen werden. Wenn Sie ein Objekt konstruieren, wird es mit dem Konstruktor initialisiert, aber an der Initialisierung einer Klasse ist kein Konstruktor beteiligt. –

0

Da der Konstruktor Sie rufen eine print-Anweisung enthält.

Sie rufen die Konstruktormethode SubClass2() auf, die eine print-Anweisung enthält.

0

Die Aussagen sind nicht gedruckt, da die Klasse ist geladen, sondern weil ein Objekt dieser Klasse in instanziiert und die Konstrukteure werden genannt:

, dass eine Klasse ohne Konstruktor geladen werden kann, wird durch die folgende demonstriert code:

Das Ausführen dieses Programms zeigt, dass nur der statische Klasseninitialisierer aufgerufen wird und kein Konstruktor.

Verwandte Themen