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!