Heim >Java >javaLernprogramm >Warum führt die Vererbung statischer Variablen in Java zu unerwarteten Ergebnissen?

Warum führt die Vererbung statischer Variablen in Java zu unerwarteten Ergebnissen?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-01 19:10:12723Durchsuche

Why Does Java's Static Variable Inheritance Produce Unexpected Results?

Rätsel beim Überschreiben von Java-Klassenvariablen

Betrachten Sie den folgenden Java-Codeausschnitt:

<br>class Papa {</p>
<pre class="brush:php;toolbar:false">protected static String me = "dad";

public void printMe() {
    System.out.println(me);
}

}

class Son verlängert Papa {

protected static String me = "son";

}

public void doIt() {

new Son().printMe();

}

Der Code scheint eine Klassenvariable mit dem Namen zu definieren „Ich“ sowohl in der Klasse „Vater“ als auch in der Klasse „Sohn“. Beim Aufruf von „doIt()“ könnte man erwarten, dass der Code „son“ ausgibt, da „Son“ eine Unterklasse von „Dad“ ist. Dies ist jedoch nicht der Fall.

Warum gibt „doIt()“ „dad“ aus?

In Java können Klassenvariablen nicht überschrieben werden. Stattdessen sind sie verborgen. Insbesondere wenn eine Klassenvariable mit einem vorhandenen Namen in einer Unterklasse deklariert wird, verbirgt die Unterklasse die geerbte Klassenvariable und erstellt so effektiv eine neue Klassenvariable mit demselben Namen, die sich jedoch von der übergeordneten Klasse unterscheidet.

Überschreiben vs. Ausblenden

Überschreiben beinhaltet die Bereitstellung einer anderen Implementierung für eine Methode in einer Unterklasse, die die Methode in der Oberklasse überschreibt. Im Gegensatz dazu beinhaltet das Ausblenden die Verwendung desselben Variablennamens in einer Unterklasse, aber es verbirgt die von der Oberklasse geerbte Variable und erstellt eine neue Variable lokal für die Unterklasse.

Wie druckt man „son“?

Um das gewünschte Verhalten beim Drucken von „son“ zu erreichen, kann man die Klassenvariable nicht überschreiben. Stattdessen kann man andere Vererbungstechniken verwenden, wie zum Beispiel:

  • Verwendung eines anderen Variablennamens in der Unterklasse, z. B. „myName“ anstelle von „me“.
  • Ändern der geerbten Klasse Variable mithilfe von Reflektion (diese Methode wird nicht für den allgemeinen Gebrauch empfohlen).
  • Übergabe des Werts als Konstruktorargument, wie im Beispiel gezeigt unten:

Beispiel mit Konstruktorargument:

<br>public class Person {</p>
<pre class="brush:php;toolbar:false">private String name;

public Person(String name) {
    this.name = name;
}

public void printName() {
    System.out.println(name);
}

}

In diesem Beispiel hat die Klasse „Person“ eine Konstruktor, der den Namen festlegt. Dies ermöglicht es, Unterklassen von „Person“ zu erstellen und spezifische Werte für den Namen zu übergeben.

Das obige ist der detaillierte Inhalt vonWarum führt die Vererbung statischer Variablen in Java zu unerwarteten Ergebnissen?. 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