Verwirrung über Feldinitialisierung aufgrund von Shadowing
In Java bezieht sich Shadowing auf das Phänomen, bei dem eine innerhalb eines Bereichs deklarierte Variable Variablen mit dem verdeckt Gleicher Name in einem äußeren Bereich deklariert. Im bereitgestellten Codeausschnitt:
class StringArray { private String[] elements; private int capacity; public StringArray() { int capacity = 10; // Local variable shadowing field String[] elements; // Local variable shadowing field elements = new String[capacity]; } // Getters omitted for brevity }
Local Variable Shadowing
Die erste und zweite Anweisung im Konstruktorkörper deklarieren lokale Variablen mit den Namen „capacity“ und „elements“. Diese lokalen Variablen beschatten die gleichnamigen Instanzvariablen. Folglich wirken sich alle Zuweisungen oder Verweise auf Kapazitäten und Elemente innerhalb des Konstruktorbereichs ausschließlich auf die lokalen Variablen aus.
Schattierungsregeln
Schattierungsregeln schreiben vor, dass lokale Variablen eine höhere Priorität haben als Instanzvariablen innerhalb ihres Gültigkeitsbereichs. Dies bedeutet, dass die Kapazität der lokalen Variablen, initialisiert auf 10, Vorrang vor der Kapazität der Instanzvariablen hat und die Instanzvariable nicht initialisiert bleibt. Ebenso initialisiert die Zuweisung zu Elementen die lokale Variable, nicht die Instanzvariable.
Feldinitialisierung
Da die Instanzvariablen im Konstruktor nicht explizit initialisiert werden, sind sie es haben die Standardwerte für ihre jeweiligen Typen zugewiesen: 0 für Kapazität und Null für Elemente. Aus diesem Grund geben die Getter-Methoden in der Klasse diese Standardwerte zurück.
Lösung
Um dieses Problem zu beheben, entfernen Sie die lokalen Variablendeklarationen und verweisen Sie direkt auf die Instanzvariablen :
public StringArray() { this.capacity = 10; this.elements = new String[this.capacity]; }
Vermeidung
Um solche Verwirrung zu vermeiden, übernehmen Sie die Praxis von Verwendung eindeutiger Namen für lokale Variablen und Instanzvariablen.
Das obige ist der detaillierte Inhalt vonWarum sind meine Java-Instanzvariablen nicht initialisiert, obwohl sie im Konstruktor scheinbar initialisiert wurden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!