Warum kann die statische Methode nicht mit der gleichen Signatur versteckt werden, aber das statische Feld darf dies tun? Beide sind Instanzenebene, also warum ist nur das statische Feld erlaubt?
m1()
in der Klasse Test
ist eine static
-Methode, während m1()
in Test1
nicht statisch ist. Nun stellen Sie sich vor, wenn dies erlaubt wäre, welche Implementierung von der Laufzeit ausgewählt würde, wenn Sie die Anweisung unten ausführen:
Da die Instanz der Kindklasse ( Test1
in Ihrem Fall) auf die statische Methode der Elternklasse zugreifen kann (von Test
). Deshalb ist es nicht erlaubt.
Für Ihre nächste Frage warum die Variable mit demselben Namen in Test1
erlaubt ist: Die statische Variable der Elternklasse kann nicht von der Kindklasseninstanz aus erreicht werden. Mit anderen Worten, der statische Zustand der Elternklasse ist vor Kind verborgen. Das ist
führt zu einem Kompilierungsfehler. Und wenn du es versuchst
%Vor%Es wird auf den Status der Kindklasse verweisen, nicht auf die Eltern. Deshalb kann die Kindklasse eine Variable mit demselben Namen haben.
Hinweis: Wenn i
in Test
nicht statisch ist, kann Test1 auch in diesem Fall eine Variable mit dem Namen i
enthalten. In diesem Fall wird i
in Test1
i
in Test
schattieren.
BEARBEITEN
Aus Shahaan Syeds Kommentar :
new Test1().i;
Warum ist das erlaubt ist meine Betroffene
Um Shahan Syeds Verwirrung mit anderen Worten zu beschreiben: Warum
Als Kevin Esche kommentierte , Ich denke auch, dass Java irgendwo durch den Zugriff auf static
-Methoden der Elternklasse aus der Instanz der Kindklasse durcheinander gebracht hat. Obwohl es keine gute Übung ist und der Compiler auch eine Warnung generiert.
Hier ist ein Zitat von ( JLS §8.3 ):
In dieser Hinsicht unterscheidet sich das Ausblenden von Feldern vom Ausblenden von Methoden (§8.4.8.3), denn es wird nicht zwischen statisch und. Unterschieden Nicht-statische Felder im Feld ausblenden, während eine Unterscheidung gemacht wird zwischen statischen und nicht statischen Methoden beim Verstecken von Methoden.
Aber ich konnte keine Gründe dafür in JLS finden.
Ich denke, anstatt eine Warnung zu generieren, sollte es einen Kompilierzeitfehler gegeben haben. Dies bedeutet, dass sowohl static
-Feld als auch static
-Methode der übergeordneten Klasse von der untergeordneten Klasseninstanz zugreifbar sind und ein Compilerfehler aufgetreten sein sollte. In dieser Hinsicht wären die Dinge konsistent und leicht zu verstehen. Aber wieder ist es nur mein Gedanke.
Eine weitere interessante Frage in derselben Zeile: Warum ruft eine statische Methode über eine Instanz keinen Fehler für den Java-Compiler auf?
Tags und Links java inheritance