wake-up-neo.com

Standardkonstruktor initialisiert die Instanzmitglieder der Klasse nicht?

Ich bin auf eine Frage gestoßen, in der folgende Frage gestellt wird: "Welche der folgenden Aussagen trifft auf den" Standardkonstruktor "zu?"

und eine Option .__ "Initialisiert die Instanzmitglieder der Klasse." war eine falsche Wahl.

Nun war mein Verständnis das, wenn wir einen Code haben wie

    Class Test {
        String name;
    }

dann erstellt der Compiler einen Standardkonstruktor, der wie folgt aussieht

    Class Test {
        String name;
        Test(){
            super();
            name = null;
        }
    }

Initialisiert der Standardkonstruktor nicht den Instanzmitgliednamen = null?

15
SERich

Der Klassenkonstruktor ist nicht derjenige, der die Initialisierung durchführt, die JVM führt dies aus. Nachdem der Speicher für das Objekt erstellt wurde, werden die Mitglieder des Objekts standardmäßig mit einem vorhersagbaren Wert initialisiert, der zu ihrem Standardwert wird.

Nach der Spezifikation

  • Jede Klassenvariable, Instanzvariable oder Array-Komponente wird bei ihrer Erstellung mit einem Standardwert initialisiert ( §15.9 , §15.10.2 ):
    • Beim Typ Byte ist der Standardwert Null, dh der Wert von (byte)0.
    • Für den Typ short ist der Standardwert null, d. H. Der Wert von (short)0.
    • Für den Typ int ist der Standardwert null, dh 0.
    • Für den Typ long ist der Standardwert null, d. H. 0L.
    • Für den Typ float ist der Standardwert eine positive Null, dh 0.0f.
    • Für den Typ double ist der Standardwert eine positive Null, dh 0.0d.
    • Für den Typ char ist der Standardwert das Nullzeichen, dh '\u0000'.
    • Für den Typ boolean ist der Standardwert false.
    • Für alle Referenztypen ( §4.3 ) ist der Standardwert null.

Ihre Annahme ist nahe, aber Tatsache ist, bevor die Konstruktorparameter überhaupt ausgewertet werden - bevor jedem Feld sogar ein Wert zugewiesen werden kann - diese Felder enthalten bereits ihre Standardwerte, und dies geschieht in der JVM.

Lesen Sie den Abschnitt §15.9.4 , um zu verstehen, wie der Initialisierungsprozess ausgeführt wird

10
smac89

In Java werden Felder vorher der Konstruktor initialisiert. Dies kann leicht durch den folgenden Code nachgewiesen werden:

public class MyClass {

    int myField = initMyField();

    MyClass(){
        System.out.println("ctor");
    }

    static int initMyField() {
        System.out.println("init field");
        return 1;
    }
}

ausgabe

init field
ctor

Sie können auch den dekompilierten Code überprüfen.

4
Danny Chen

Initialisiert der Standardkonstruktor nicht das Instanzmitglied name = null?

Nein, Konstruktoren heißen after. Alle Instanzvariablen werden mit den Standardwerten initialisiert: 0 oder dem entsprechenden Wert für primitive numerische Typen , false für den Typ boolean, null für Referenztypen .

3
Andrew Tobilko

Nein, es ist nicht der Standardkonstruktor, der die Instanzvariablen für Sie initialisiert. Jeder Typ hat einen Standardwert. Sobald Sie das Objekt erstellt haben, wird der Standardwert verwendet.

Wenn Sie also die Instanzvariablen nicht explizit initialisieren, verwenden sie implizit weiterhin die für sie definierten Standardwerte.

d. h. 0 für int, null für Referenztyp ... usw

Es ist jedoch erwähnenswert, dass wir nicht davon ausgehen, dass ein Standardwert angegeben wird, und die Variablen nicht initialisieren.


Sie können versuchen, einen leeren Konstruktor zu definieren, der den Standardkonstruktor mit leerer Implementierung überschreibt. Sie werden feststellen, dass alle Instanzvariablen noch initialisiert werden.

1
user3437460

Es tut. Obwohl die Frage eher auf der Nutzung basiert.

public class Main {
    String x;

    Main() {
        x = "Init";
    }

    @Override
    public String toString() {
        return x;

    }

    public static void main(String[] args) {
        System.out.println(new Main());
    }

}

Ausgabe:

Init
1
RCInd

Wann immer wir eine Java-Klasse ausführen, wird zuerst Static Control Flow ausgeführt. Wenn wir im Static Control Flow ein Objekt erstellen, werden die folgenden Schritte (in der genannten Reihenfolge) als Teil des Inatance Control Flow ausgeführt:

  1. Identifikation der Instanzmitglieder (Instanzvariable und Instanzblöcke) von oben nach unten.
  2. Ausführung von Instanzvariablenzuweisungen und Instanzblöcken.
  3. Ausführung des Konstruktors.

In Ihrem obigen Code ist die Instanzvariable "name" bereits vor der Ausführung des Konstruktors dem Wert null (Standardwert für Referenztypen) zugewiesen.

0
Rajdeep Sarkar

Der Standardkonstruktor stellt die Standardwerte für die Objekte bereit und wird normalerweise vom Compiler erstellt, wenn kein Konstruktor explizit definiert ist. z.B.

class DefaultTest{  
int id;  
String name;  

void display(){System.out.println(id+" "+name);}  

public static void main(String args[]){  
DefaultTest s1=new DefaultTest();  
DefaultTest s2=new DefaultTest();  
s1.display();  
s2.display();  
}  
}  

NB: Da kein Konstruktor definiert ist, generiert der Compiler einen Standardkonstruktor, der den beiden Objekten 0 Nullwerte zuweist.

0
mc.Ambugo