Ich habe den folgenden Code
%Vor% Ich dachte, es würde ein NPE
erhöhen, aber es gibt Mount Everest
als Ausgabe kann jemand klären?
Es passiert einfach, dass Sie auf statische Elemente für Objektreferenzen zugreifen können. In diesem Fall wird das Element nach dem Typ der Referenz aufgelöst, nicht nach seinem Wert.
Die Java-Sprachspezifikation sagt dazu Feldzugriff von static
members
Wenn das Feld ein nicht leeres letztes Feld ist, , dann ist das Ergebnis der Wert der angegebenen Klassenvariablen in der Klasse oder der Schnittstelle, die das ist Typ des primären Ausdrucks.
Wenn das Feld nicht endgültig ist oder ein leeres Finale und der Feldzugriff ist tritt in einem Konstruktor auf, dann ist das Ergebnis eine Variable , nämlich die angegebene Klassenvariable in der Klasse, die den Typ von Primary darstellt Ausdruck.
Also ist Primary , die Instanz, egal.
Wenn Sie auf ein Member static
für eine Instanz einer Klasse zugreifen, ignoriert der Java-Compiler den Laufzeitwert (und sogar die Klasse) der Variablen vollständig und verwendet das Element, das zur deklarierten Klasse gehört. In diesem Fall entspricht Ihr Code:
Auch wenn Sie einen Code wie diesen hatten:
%Vor% Sie erhalten immer noch den Wert für die Klasse Test
.
favorite()
ist eine statische Methode, die Test
type zurückgibt. Dann verwenden Sie die statische Variable dieser Klasse ( mountain
). Dies alles funktioniert, da Sie niemals eine Instanz dieser Klasse verwenden (und nicht verwenden müssen), so dass es keine Nullzeigerausnahme geben kann.