Ich habe einen Programmierleitfaden zur Java ™ SCJP-Zertifizierung von Khalid Mughal gelesen .
Im Kapitel Vererbung wird dies erklärt
Die Vererbung von Mitgliedern ist eng mit ihrer erklärten Zugänglichkeit verbunden. Wenn auf ein Mitglied der Oberklasse über seinen einfachen Namen in der Unterklasse zugegriffen werden kann (ohne die Verwendung einer zusätzlichen Syntax wie Super), wird dieses Mitglied als geerbt betrachtet
Es wird auch erwähnt, dass statische Methoden nicht vererbt werden. Aber der folgende Code ist vollkommen in Ordnung:
class A
{
public static void display()
{
System.out.println("Inside static method of superclass");
}
}
class B extends A
{
public void show()
{
// This works - accessing display() by its simple name -
// meaning it is inherited according to the book.
display();
}
}
Wie kann ich direkt display()
im Unterricht arbeiten B
? Noch mehr B.display()
funktioniert auch.
Gilt die Erklärung des Buches nur für Instanzmethoden?
java
inheritance
static
Algorithmusist
quelle
quelle
Antworten:
Alle Methoden, auf die zugegriffen werden kann, werden von Unterklassen geerbt.
Aus den Sun Java- Tutorials :
Der einzige Unterschied zu geerbten statischen (Klassen-) Methoden und geerbten nicht statischen (Instanz-) Methoden besteht darin, dass beim Schreiben einer neuen statischen Methode mit derselben Signatur die alte statische Methode nur ausgeblendet und nicht überschrieben wird.
Von der Seite über den Unterschied zwischen Überschreiben und Ausblenden.
quelle
Wenn das das ist, was das Buch wirklich sagt, ist es falsch. [1]
In der Java-Sprachspezifikation # 8.4.8 heißt es:
[1] Das steht nicht in meinem Exemplar, 1. Auflage, 2000.
quelle
Sie können den Unterschied im folgenden Code feststellen, der geringfügig gegenüber Ihrem Code geändert wurde.
Dies liegt daran, dass statische Methoden Klassenmethoden sind.
A.display () und B.display () rufen die Methode ihrer jeweiligen Klassen auf.
quelle
B.display () funktioniert, weil durch die statische Deklaration die Methode / das Mitglied zur Klasse gehört und keine bestimmte Klasseninstanz (auch bekannt als Object). Sie können mehr darüber lesen Sie hier .
Beachten Sie außerdem, dass Sie eine statische Methode nicht überschreiben können. Ihre Unterklasse kann eine statische Methode mit derselben Signatur deklarieren, ihr Verhalten kann jedoch anders sein als erwartet. Dies ist wahrscheinlich der Grund, warum es nicht als vererbt betrachtet wird. Sie können das problematische Szenario und die Erklärung hier überprüfen .
quelle
Statische Methoden werden in Java vererbt, nehmen jedoch nicht am Polymorphismus teil. Wenn wir versuchen, die statischen Methoden zu überschreiben, werden nur die statischen Methoden der Oberklasse ausgeblendet, anstatt sie zu überschreiben.
quelle
Dieses Konzept ist nicht so einfach, wie es aussieht. Wir können ohne Vererbung auf statische Mitglieder zugreifen, was eine HasA-Beziehung ist. Wir können auf statische Mitglieder zugreifen, indem wir auch die übergeordnete Klasse erweitern. Das bedeutet nicht, dass es sich um eine ISA-Beziehung (Vererbung) handelt. Tatsächlich gehören statische Mitglieder zur Klasse, und static ist kein Zugriffsmodifikator. Solange die Zugriffsmodifikatoren den Zugriff auf die statischen Elemente zulassen, können wir sie in anderen Klassen verwenden. Wenn es öffentlich ist, ist es innerhalb desselben Pakets und auch außerhalb des Pakets zugänglich. Für Privatpersonen können wir es nirgendwo verwenden. Standardmäßig können wir es nur innerhalb des Pakets verwenden. Aber für geschützte müssen wir die Superklasse erweitern. Das Abrufen der statischen Methode für eine andere Klasse hängt also nicht davon ab, ob sie statisch ist. Dies hängt von den Zugriffsmodifikatoren ab. Also meiner Meinung nach, Statische Mitglieder können zugreifen, wenn die Zugriffsmodifikatoren dies zulassen. Andernfalls können wir sie wie bei der Hasa-Beziehung verwenden. Und hat eine Beziehung ist keine Vererbung. Auch hier können wir die statische Methode nicht überschreiben. Wenn wir eine andere Methode verwenden können, diese aber nicht überschreiben können, handelt es sich um eine HasA-Beziehung. Wenn wir sie nicht überschreiben können, handelt es sich nicht um eine Vererbung. Der Autor war also zu 100% korrekt.
quelle
Statische Methoden in Java werden vererbt, können jedoch nicht überschrieben werden. Wenn Sie dieselbe Methode in einer Unterklasse deklarieren, blenden Sie die Oberklassenmethode aus, anstatt sie zu überschreiben. Statische Methoden sind nicht polymorph. Zum Zeitpunkt der Kompilierung wird die statische Methode statisch verknüpft.
Beispiel:
Sie erhalten Folgendes:
quelle
Die statische Methode wird in der Unterklasse vererbt, ist jedoch kein Polymorphismus. Wenn Sie die Implementierung einer statischen Methode schreiben, wird die Klassenmethode des übergeordneten Elements nicht ausgeblendet, sondern ausgeblendet. Denken Sie, wenn es nicht vererbt wird, wie können Sie dann ohne zugreifen
classname.staticMethodname();
?quelle
Alle öffentlichen und geschützten Mitglieder können von jeder Klasse geerbt werden, während die Standard- oder Paketmitglieder auch von der Klasse innerhalb desselben Pakets wie das der Oberklasse geerbt werden können. Es hängt nicht davon ab, ob es sich um ein statisches oder ein nicht statisches Element handelt.
Es ist aber auch wahr, dass statische Elementfunktionen nicht an der dynamischen Bindung teilnehmen. Wenn die Signatur dieser statischen Methode sowohl in der übergeordneten als auch in der untergeordneten Klasse gleich ist, gilt das Konzept der Abschattung, nicht der Polymorphismus.
quelle
Sie können statische Methoden überschreiben. Wenn Sie jedoch versuchen, Polymorphismus zu verwenden, funktionieren diese entsprechend dem Klassenumfang (im Gegensatz zu dem, was wir normalerweise erwarten).
Im ersten Fall ist o / p die "in statische Methode von B" # erfolgreiche Überschreibung. Im zweiten Fall ist o / p "in statischer Methode von A" # Statische Methode - berücksichtigt keinen Polymorphismus
quelle
Wir können statische Methoden mit derselben Signatur in der Unterklasse deklarieren, dies wird jedoch nicht als überschreibend angesehen, da es keinen Laufzeitpolymorphismus gibt. Da alle statischen Elemente einer Klasse zum Zeitpunkt des Ladens der Klasse geladen werden, entscheidet dies beim Kompilieren Zeit (zur Laufzeit überschreiben) Daher lautet die Antwort "Nein".
quelle
Viele haben ihre Antwort in Worten ausgesprochen. Dies ist eine erweiterte Erklärung in Codes:
Ergebnisse:
Daher ist dies die Schlussfolgerung:
null
Instanz aus aufgerufen werden. Ich vermute, dass der Compiler den Variablentyp verwendet, um die Klasse während der Kompilierung zu finden und diesen in den entsprechenden statischen Methodenaufruf zu übersetzen.quelle
Statische Mitglieder sind universelle Mitglieder. Sie sind von überall zugänglich.
quelle
Statische Elemente werden nicht an die Unterklasse vererbt, da die Vererbung nur für nicht statische Elemente gilt. Statische Elemente werden vom Klassenladeprogramm in den statischen Pool geladen. Die Vererbung gilt nur für diejenigen Elemente, die in das Objekt geladen werden
quelle