Heim >Java >javaLernprogramm >Warum führt die Vererbung statischer Variablen in Java zu unerwarteten Ergebnissen?
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:
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!