Vererbungshilfe für das Verstecken von Methoden und das Ausblenden von Feldern

8
%Vor%

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?

    
Shahaan Syed 15.04.2016, 08:42
quelle

1 Antwort

8

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:

%Vor%

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

%Vor%

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

  • Im Fall einer Variablen kann die untergeordnete Klasse eine nicht statische Variable haben Elternklasse hat eine statische Variable mit dem gleichen Namen,
  • andererseits kann die untergeordnete Klasse keine nicht statische Methode haben Elternklasse hat eine statische Methode mit dem gleichen Namen?

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?

    
Sudhir Singh 15.04.2016 08:47
quelle

Tags und Links