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

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

DDD
DDDoriginal
2024-12-18 18:15:10946parcourir

Can Java Subclasses Override Member Variables?

Remplacer les variables membres en Java : comprendre le masquage des variables

En Java, le remplacement des fonctions membres est un concept bien connu, mais qu'en est-il du remplacement variables membres ? Pour explorer cela, 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); // Output: 1
        aRef.identifyClass(); // Output: "I am class A"
        aRef = b;
        System.out.println(aRef.intVal); // Output: 1
        aRef.identifyClass(); // Output: "I am class B"
    }
}

Le code vise à démontrer le comportement des variables membres remplacées. Cependant, il y a un casse-tête : pourquoi aRef.intVal renvoie-t-il toujours 1 après que aRef est défini sur b, qui a un intVal de 2 ?

La réponse réside dans le concept de masquage de variables. Lorsqu'une sous-classe déclare une variable portant le même nom qu'une variable de sa superclasse, elle "masque" la variable de la superclasse. Cela signifie que la sous-classe a deux variables : une de sa superclasse et une de sa propre définition.

Dans le code ci-dessus, la variable membre intVal est déclarée à la fois dans A et B. Par conséquent, lorsque B est créé, il a les deux intVals - un avec une valeur de 1 hérité de A et un avec une valeur de 2 définie dans B.

Lorsque aRef est défini sur a, il fait référence au intVal de A. Lorsque aRef est défini sur b, il fait toujours référence à l'intVal de A. En effet, dans l'expression aRef.intVal, aRef se résout en type A et intVal est une variable de A.

Pour accéder à l'intVal de B, il faudrait utiliser ((B)aRef).intVal, qui convertit explicitement aRef en type B et permet d'accéder aux B. variables.

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