Maison >Java >javaDidacticiel >Les sous-classes Java peuvent-elles remplacer les variables membres ou les masquent-elles simplement ?

Les sous-classes Java peuvent-elles remplacer les variables membres ou les masquent-elles simplement ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-19 22:15:09569parcourir

Can Java Subclasses Override Member Variables, or Do They Just Hide Them?

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!

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