Maison >Java >javaDidacticiel >Pourquoi mes variables d'instance Java ne sont-elles pas initialisées alors qu'elles semblent initialisées dans le constructeur ?

Pourquoi mes variables d'instance Java ne sont-elles pas initialisées alors qu'elles semblent initialisées dans le constructeur ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-04 10:43:10737parcourir

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

Confusion sur l'initialisation du champ en raison de l'observation

En Java, l'observation fait référence au phénomène où une variable déclarée dans une portée obscurcit les variables avec le même nom déclaré dans une portée externe. Dans l'extrait de code fourni :

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
}

Observation des variables locales

Les première et deuxième instructions à l'intérieur du corps du constructeur déclarent des variables locales nommées capacité et éléments. Ces variables locales masquent les variables d'instance du même nom. Par conséquent, toute affectation ou référence à la capacité et aux éléments dans la portée du constructeur affecte exclusivement les variables locales.

Règles d'ombrage

Les règles d'ombrage dictent que les variables locales ont une priorité plus élevée que variables d'instance dans leur portée. Cela signifie que la variable locale capacité, initialisée à 10, est prioritaire sur la variable d'instance capacité, laissant la variable d'instance non initialisée. De même, l'affectation aux éléments initialise la variable locale, pas la variable d'instance.

Initialisation du champ

Étant donné que les variables d'instance ne sont pas explicitement initialisées dans le constructeur, elles le sont attribué les valeurs par défaut pour leurs types respectifs : 0 pour la capacité et null pour les éléments. C'est pourquoi les méthodes getter de la classe renvoient ces valeurs par défaut.

Résolution

Pour résoudre ce problème, éliminez les déclarations de variables locales et référez-vous directement aux variables d'instance :

public StringArray() {
    this.capacity = 10;
    this.elements = new String[this.capacity];
}

Évitement

Pour éviter une telle confusion, adoptez la pratique d'utiliser des noms uniques pour les variables locales et les variables d'instance.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn