Heim > Java > javaLernprogramm > Warum sind meine Java-Instanzvariablen nicht initialisiert, obwohl sie im Konstruktor scheinbar initialisiert wurden?

Warum sind meine Java-Instanzvariablen nicht initialisiert, obwohl sie im Konstruktor scheinbar initialisiert wurden?

Patricia Arquette
Freigeben: 2024-12-04 10:43:10
Original
718 Leute haben es durchsucht

Why Are My Java Instance Variables Uninitialized Despite Appearing to Be Initialized in the Constructor?

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
}
Nach dem Login kopieren

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];
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage