2 Stimmen

Erstellen von Objekten einer Klasse innerhalb der Klasse

Schnelle Frage zum unten stehenden Code:

public class Test {

    public final static Test t1 = new Test("test 1");
    public final static Test t2 = new Test("test 2");
    public final static Test t3 = new Test("test 3");

    private String s;

    private Test (string s1) {
        s = s1;
    }
}

Ich bin verwirrt, ob dieser Code unbegrenzte Instanzen von sich selbst erstellt?

3voto

Frank Punkte 15919

Nein, die VM wird nicht: "unbegrenzte Instanzen von sich selbst erstellen"

Ihre statischen Felder (t1, t2 und t3) werden jeweils einmal auf Klassenebene erstellt und nicht auf Instanzebene. Ihre 3 Felder werden zwischen allen Instanzen geteilt.

1voto

Bernhard Barker Punkte 52773

Der Code wird keine unbegrenzten Instanzen von sich selbst erstellen, weil die Variablen t1, t2 und t3 statisch initialisiert sind (bedeutet, dass sie nur einmal initialisiert werden, wenn die Klasse geladen wird, nicht einmal für jede Instanz), aufgrund derstatic Deklaration in Kombination mit der Zuweisung in der Deklaration.

Du solltest vielleicht nachlesen, was genau static bewirkt.

Nützlicher Hinweis:

Das untenstehende Beispiel hingegen würde beim Verwenden einer static Variable dazu führen, dass sie initialisiert wird, wenn eine Instanz erstellt wird (aufgrund der Zuweisung im Konstruktor) und somit einen StackOverflowError verursachen würde:

public class Test {
   static Test t1;
   Test () {
      t1 = new Test();
   }
}

1voto

uba Punkte 1953

Statische Mitglieder sind nicht Teil des erstellten Objekts. Es wird also keine unendliche Erstellung von Test-Objekten geben.

0voto

Filipe Fedalto Punkte 2480

Du fragst danach, weil die statischen (t1, t2 und t3) Deklarationen dir den Eindruck vermitteln, dass jede Instanz ihre eigenen Kopien dieser Variablen haben wird.

Tatsächlich wird das nicht passieren. Statische Variablen werden nicht pro Instanz erstellt. Es existiert immer nur eine Instanz von ihnen in einer JVM.

0voto

Narendra Pathai Punkte 39852

Wenn es etwas Ähnliches gewesen wäre

public class Test {
   // kein static, also werden diese für jede Instanz von A erstellt oder jedes Mal, wenn der Konstruktor aufgerufen wird
   public final Test t1 = new Test("Test 1");
   public final Test t2 = new Test("Test 2");
   public final Test t3 = new Test("Test 3");

   private String s;

   private Test (String s1){
      s = s1
   }

}

Dann hätte es unbegrenzte Instanzen erstellt, da t1, t2 und t3 Instanzvariable sind.

Aber in Ihrem Fall sind sie static, so dass Instanzen zur Kompilierungszeit erstellt werden und nicht bei jeder Instanz, also keine unbegrenzten Instanzen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X