Masquage de variables en Java
Lors de l'exploration de la substitution de fonctions membres en Java, une curiosité est apparue quant à la possibilité de remplacer les variables membres. Pour enquêter, considérons le code suivant :
public class A { public int intVal = 1; public void identifyClass() { System.out.println("I am class A"); } } public class B extends A { public int intVal = 2; public void identifyClass() { System.out.println("I am class B"); } } public class MainClass { public static void main(String[] args) { A a = new A(); B b = new B(); A aRef; aRef = a; System.out.println(aRef.intVal); // Prints 1 aRef.identifyClass(); // Prints "I am class A" aRef = b; System.out.println(aRef.intVal); // Prints 1 aRef.identifyClass(); // Prints "I am class B" } }
Le résultat est :
1 I am class A 1 I am class B
Le code initialise deux classes, A et B, toutes deux avec une variable membre nommée intVal. B étend A et redéclare la variable membre intVal. Lorsque la variable de référence aRef est définie sur une instance de A, la variable membre intVal est correctement accessible. Cependant, lorsque aRef est défini sur une instance de B, la variable membre intVal imprime toujours la valeur stockée dans la classe A.
Pourquoi cela se produit-il ?
Masquage de variable membre
Dans cette situation, la variable membre intVal de la classe B ne remplace pas la variable membre intVal de la classe A. Au lieu de cela, la variable est cachée. Lorsqu'une variable est masquée, la sous-classe contient à la fois la propriété d'origine de la superclasse et une nouvelle propriété du même nom.
Pour accéder à la variable membre d'origine de la superclasse, vous pouvez utiliser super.var ou (( Syntaxe SuperClass)this).var. Par exemple :
// Access the original intVal member variable from the A class System.out.println(aRef.intVal); // Use super to access the original intVal member variable System.out.println(aRef.super.intVal);
Il est important de noter que les variables masquées n'ont pas besoin d'être du même type. Ils partagent simplement le même nom au sein de la sous-classe. Cela vous permet de créer différentes implémentations de la même propriété pour différentes sous-classes, offrant ainsi flexibilité et réutilisabilité du code.
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!