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
Libérer: 2024-12-04 10:43:10
original
718 Les gens l'ont consulté

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
}
Copier après la connexion

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];
}
Copier après la connexion

É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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal