Heim >Java >javaLernprogramm >Können Java-Unterklassen Mitgliedsvariablen überschreiben?

Können Java-Unterklassen Mitgliedsvariablen überschreiben?

DDD
DDDOriginal
2024-12-18 18:15:10947Durchsuche

Can Java Subclasses Override Member Variables?

Überschreiben von Mitgliedsvariablen in Java: Das Ausblenden von Variablen verstehen

In Java ist das Überschreiben von Mitgliedsfunktionen ein bekanntes Konzept, aber was ist mit dem Überschreiben? Mitgliedsvariablen? Um dies zu untersuchen, betrachten Sie den folgenden Code:

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"
    }
}

Der Code zielt darauf ab, das Verhalten überschriebener Mitgliedsvariablen zu demonstrieren. Es gibt jedoch ein Rätsel: Warum gibt aRef.intVal immer noch 1 zurück, nachdem aRef auf b gesetzt wurde, das einen intVal von 2 hat?

Die Antwort liegt im Konzept des Versteckens von Variablen. Wenn eine Unterklasse eine Variable mit demselben Namen wie eine in ihrer Oberklasse deklariert, „versteckt“ sie die Variable der Oberklasse. Das bedeutet, dass die Unterklasse zwei Variablen hat: eine aus ihrer Oberklasse und eine aus ihrer eigenen Definition.

Im obigen Code wird die intVal-Mitgliedsvariable sowohl in A als auch in B deklariert. Daher wird beim Erstellen von B Es hat beide intVals – eines mit dem von A geerbten Wert 1 und eines mit dem in B definierten Wert 2.

Wenn aRef auf a gesetzt ist, bezieht es sich auf der intVal von A. Wenn aRef auf b gesetzt ist, bezieht es sich immer noch auf den intVal von A. Dies liegt daran, dass aRef im Ausdruck aRef.intVal in den Typ A aufgelöst wird und intVal eine Variable von A ist.

Um auf den intVal von B zuzugreifen, müsste man ((B)aRef).intVal verwenden, was aRef explizit in den Typ B umwandelt und den Zugriff auf ermöglicht Bs Variablen.

Das obige ist der detaillierte Inhalt vonKönnen Java-Unterklassen Mitgliedsvariablen überschreiben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn