Private Methoden Vererbung
Hier ist eine interessante code-snippet:
public class Superclass {
public static void main (String[] args){
Superclass obj = new Subclass();
obj.doSomething(); #prints "from Superclass"
}
private void doSomething(){System.out.println("from Superclass");}
}
class Subclass extends Superclass {
private void doSomething(){System.out.println("from Subclass");}
}
Ich weiß, dass Unterklassen Erben nicht die privaten Mitglieder des übergeordneten, aber hier obj verwaltet, eine Methode aufzurufen, die es sollte keinen Zugang haben. Zur compile-Zeit obj ist vom Typ Superklasse, so wird zur Laufzeit der Typ der Unterklasse.
Dies hat wahrscheinlich etwas mit der Tatsache zu tun, dass der Aufruf von doSomething() wird sich in der Treiber-Klasse, die passiert zu sein, seine eigene Klasse (und warum ist es möglich, zum aufrufen von doSomething() auf den ersten Platz).
Also die Frage hinausläuft, wie funktioniert obj haben Zugang zu einem privaten Mitglied seiner Eltern?
InformationsquelleAutor Victor Cheung | 2013-01-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du beantwortet es selbst. Wie die private-Methoden nicht vererbt werden, eine Oberklasse-Referenz aufruft, seine eigene private-Methode.
Der Punkt ist, dass man die Zuordnung zu einer übergeordneten Referenz. Und mit dieser Methode als private, wird es nicht überschrieben werden durch die Unterklasse Umsetzung. Diesen Verweis kennt nur eine Methode doSomething, die in der Oberklasse.
InformationsquelleAutor Swapnil
Private Methoden sind nur für den Eigentümer.
Nicht einmal für die Kinder, verwandten oder Freunde der Eigentümer sind.
InformationsquelleAutor Alex Kreutznaer
Zu diesem Zeitpunkt
obj
ist beides Dinge, die einSubclass
, und einSuperclass
Objekt. Die Tatsache, dass Sie verwendenSuperclass
in der Deklaration der Variablen ist nur eine Frage der casting.Wenn du dies tust:
obj.doSomething()
sagen Sie der compiler auf den Aufruf der privaten MethodedoSomething()
vonobj
. Denn Sie tun es aus der Haupt-statische Methode innerhalbSuperclass
der compiler aufgerufen werden kann.Wenn Sie möchten, verwenden Sie die Methode main von
Subclass
eher als die, die inSuperclass
Sie wäre nicht in der Lage, Zugriff auf diese Methode, weil, wie Sie sagte, es ist weder geerbt noch einen Teil Ihrer definition vonSubclass
.Also im Grunde Sie verstanden Vererbung richtig. Das problem wurde im Zusammenhang mit der Sichtbarkeit von private-Methoden.
InformationsquelleAutor Pauls
Es funktioniert, weil Sie bei der Umwandlung eines
Superclass
aus innerhalb einer Methode derSuperclass
. In diesem ZusammenhangSuperclass.doSomething
verfügbar ist, um den compiler.Wenn Sie ändern Sie Ihre super-und Unterklassen auf zwei unterschiedliche beliebige Klassen A und B, die nicht zu der Klasse, in der die
main
Methode, und versuchen Sie den gleichen code, der compiler würde sich beschweren, dass Sie keinen Zugang zu der Methode.InformationsquelleAutor Martín Valdés de León
Wird, wenn Sie diese Zeile:
Sie gegossen Unterklasse in einer Oberklasse-Objekt, das verwendet nur die Methoden der Oberklasse und die gleichen Daten. Wenn Sie gegossen zurück in eine Unterklasse, könnten Sie mit den Methoden der Unterklasse wieder, wie so:
((Subclass)obj).doSomething(); #prints "from Subclass"
wird nicht kompilieren, da man Zugriff auf eine private - Methode außerhalb der KlasseSubclass
.InformationsquelleAutor EAKAE
Da den Typ der Referenz des Objekts
obj
istSuperClass
ein AufrufdoSomething()
versucht, Zugriff auf die private Methode definiertSuperClass
selbst (private-Methoden können nicht überschrieben werden).Als
doSomething()
zugänglich ist, innerhalbSuperClass
, diemain
Methode aufrufen kanndoSomething()
ohne Angabe von Fehler/s.Hoffe, das hilft! 🙂
InformationsquelleAutor learner
Warum nicht?
obj
ist ein Beispiel sowohl vonSubclass
undSuperclass
, und alsdoSomething()
deklariert istSuperclass
undobj
verwendet wird, so haben Sie Zugang zuSuperclass.doSomething()
können Sie versuchen, benennen Sie Ihre Methode (z.B.:doAnotherThing()
) und Sie haben immer noch Zugang zu ihm haben.Gibt es keine Eltern - /Kind-für eine private Methode, und als
obj
ist auch eine Art vonSuperclass
, so hat er Zugriff auf alle private-Methoden/Felder deklariert, daobj
wird in dieser Klasse. Verlieren Sie diesen Zugriff verfügen, wenn Sie außerhalb vonSuperclass
oder einer Klasse, die hatSuperclass
als Mitglied (nested class).So Was?
Gibt es keine Beziehung/Vererbung zwischen
SuperClass
's private Methoden undSubClass
's private Methoden, auch Sie haben den gleichen Namen und Signatur von Java Language Specification, Java SE 8 Edition:InformationsquelleAutor O.Badr
Zu verstehen, diese Frage, die Sie sich beziehen können private Methode zum member-variable der Klasse super-und sub-Klasse.
Damit wir wissen, member-variable wird nicht überschrieben werden, in sub-Klasse.
Beispiel:
Ähnlicher Weise, wenn es keine Vererbung Referenz-Variablen der super-Klasse wird berücksichtigt.
Ja, Sie sind identisch..nur ich habe zwei Unterklasse anstelle einer..ich denke, man sollte in Ordnung sein.
InformationsquelleAutor Devendra Dadhich
Wenn wir definieren eine private Methode mit dem gleichen Namen in der abgeleiteten Klasse, wird es eine neue Methode, die als abgeleitete Klasse nicht Erben die privaten Mitglieder.
Da die private Methode ist auch nicht sichtbar von außerhalb der Klasse, wir können nie rufen Sie eine Basisklasse private Methode von einer abgeleiteten Klasse, wird es werfen eine Zusammenstellung Fehler:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Die Methode aPrivateMethod() vom Typ Base ist nicht sichtbar
Wir können verwenden Sie die down-casting zu der übergeordneten Klasse Referenz zum aufrufen der abgeleiteten Klasse private Methode, die nur zugegriffen werden kann, in die abgeleitete Klasse.
InformationsquelleAutor Ripon Roy Chowdhury