Maison >Java >javaDidacticiel >Pourquoi mes valeurs de champ ne sont-elles pas correctement initialisées dans mon constructeur ?

Pourquoi mes valeurs de champ ne sont-elles pas correctement initialisées dans mon constructeur ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-02 19:11:12683parcourir

Why Are My Field Values Not Initialized Correctly in My Constructor?

Pourquoi l'observation interfère avec l'initialisation des champs

Votre classe a des champs nommés capacité et éléments, que vous essayez d'initialiser dans le constructeur. Toutefois, les valeurs que vous définissez lors de la construction ne sont pas reflétées lors de l'interrogation des valeurs de champ. Ce comportement découle d'un concept appelé shadowing.

L'ombrage se produit lorsque deux variables partagent le même nom mais existent dans des portées différentes. Dans votre constructeur, vous déclarez des variables locales également nommées capacité et éléments. Ces variables locales ont priorité sur les champs correspondants dans la portée du constructeur, les occultant ainsi.

public StringArray() {
    int capacity = 10; // Local variable shadows field
    String[] elements; // Local variable declaration without initializer
    elements = new String[capacity]; // Initializes local variable, not field
}

En conséquence, l'affectation à la variable de capacité locale initialise cette variable, pas le champ. De même, bien que vous initialisiez la variable elements, son affectation n'a pas d'impact sur le champ car la variable locale est prioritaire. Par conséquent, la capacité du champ reste à sa valeur par défaut (0) et les éléments sont définis sur null.

Pour résoudre ce problème, supprimez les déclarations de variables locales dans le constructeur pour permettre aux noms de capacité et aux éléments de faire référence au variables d'instance.

public StringArray() {
    // Remove local variable declarations
    this.capacity = 10;
    this.elements = new String[capacity];
}

Alternativement, si la conservation des paramètres du constructeur est nécessaire, utilisez des noms qualifiés pour référencer explicitement les variables d'instance.

public StringArray(int capacity) {
    this.capacity = capacity; // Initializes the field using qualified name
}

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