Aufruf der geschützten Methode aus einer Unterklasse, die von einer anderen Instanz von verschiedenen Paketen
Ich möchte auf eine geschützte Methode von einer anderen Instanz aus einer Unterklasse der Klasse bietet dieser geschützte Methode. Siehe dazu das folgende Beispiel:
public class Nano {
protected void computeSize() {
}
}
public class NanoContainer extends Nano {
protected ArrayList<Nano> children;
}
public class SomeOtherNode extends NanoContainer {
//{Nano} Overrides
protected void computeSize() {
for (Nano child: children) {
child.computeSize(); //<< computeSize() has protected access in nanolay.Nano
}
}
}
javac
sagt mir, dass computeSize() has protected access in Nano
. Ich kann nicht sehen den Grund für dieses (ich dachte, ich tun dies bereits in einigen anderen code). Ich möchte Sie zu halten diese Methode geschützt werden, was kann ich tun?
javac version "1.7.0_09"
Bearbeiten
Ich wollte eine abgespeckte version, aber ich glaube nicht, über die Tatsache, dass die Klassen liegen in unterschiedlichen Paketen.
nanolay.Node
nanolay.NanoContainer
nanogui.SomeOtherNode
Können Sie auch zeigen, die Pakete, die Klassen sind?
Ahh, die Pakete.. nicht darüber nachdenken. Ich wollte eine abgespeckte version des Codes. Ich habe bearbeitet die Frage.
Können Sie fügen Sie bitte-Paket Qualifikation für den Frage-Titel, da scheint relevant zu sein?
Dieses okay? Ich ersetzte auch die
Ja, das ist gut. BTW die akzeptierte Antwort braucht einige Korrekturen.
Ahh, die Pakete.. nicht darüber nachdenken. Ich wollte eine abgespeckte version des Codes. Ich habe bearbeitet die Frage.
Können Sie fügen Sie bitte-Paket Qualifikation für den Frage-Titel, da scheint relevant zu sein?
Dieses okay? Ich ersetzte auch die
instance-methods
mit der packages
tag.Ja, das ist gut. BTW die akzeptierte Antwort braucht einige Korrekturen.
InformationsquelleAutor Niklas R | 2013-01-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie Zugriff auf die geschützten Methoden entweder durch erweitern und überschreiben; auch wenn Sie sind in der gleichen Paket. Ich fügen Sie einige details.
Sie können Lesen details hier.
Dem Beispiel, das Sie haben, ist auf den Linien der
protected clone()
Methode in der Object-Klasse in java; Sie können nicht direkt nennen, auf ein Objekt (obwohl alle Objekt implizit erstrecken sich von der Object-Klasse).Eine Instanz von someothernode-Objekt hat Zugriff auf die protected-Methode computeSize aber nicht von einer anderen Instanz von someothernode - also nicht in der for-Schleife.
das scheint nicht korrekt zu. Dieses ohne Fehler kompiliert, wenn Sie alle im gleichen Paket.
clone
kann nicht aufgerufen werden, weil esprotected
imObject
, die im Paketjava.lang
und diese Klasse ist nicht in diesem Paket.Ja, es wäre ordnungsgemäß kompiliert werden, wenn alle Klassen im selben Paket. Die clone-Beispiel zeigt, dass eine geschützte Methode in einem anderen Paket nicht aufgerufen werden kann; Sie erstellen also eine employee-Klasse, die außerhalb java.lang, so dass die clone-Methode auf das employee-Klasse-Objekt kann nicht aufgerufen werden, es sei denn, er macht es über public-Modifizierer
InformationsquelleAutor Scorpion
Nicht wissen, die Logik, sondern JLS bestätigt dies in 6.6.2. Details zu protected Access (Hervorhebung von mir):
Also:
In
P2A.bar
einen Anruf zuthis.foo()
ist leicht zugänglich, weilthis
ist verantwortlich für die Umsetzung derP2
aberother.foo()
nicht zugänglich ist, weilother
kann nicht einP2A
.bar2
auf der anderen Seite hat einP2A
es wird also alles gut.Nun, warum alles OK ist, wenn Sie alle der gleichen Paket, aber nicht, wenn Sie verschiedene Pakete? Was ist der Grund? Ich weiß es nicht und würde gerne wissen.
Meta-Kommentar ich habe ein Rollback der letzten Aktualisierung durch einen anderen Benutzer, da es erheblich verändern, die Lösung ist wahrscheinlich besser geeignet als top-level-Antwort von selbst.
Vielleicht können Sie bitten, eine andere Frage, über die Gründe> Es kann nicht geeignet sein für dieses forum, aber Programmierer mag, diese Arten von Fragen
warum andere hat man
P2A
ist es nicht genug für Sie zu seinP2.P2
Zugangfoo();
da foo deklariert in P2.P2. bitte klären"der Zugriff auf protected-Elemente oder protected-Methoden von außen das gleiche Paket, das Sie verwenden kann das übergeordnete Objekt der Klasse, nur die Umsetzung class-Objekt kann verwendet werden, um Zugriff auf die protected-Elemente der übergeordneten Klasse außerhalb desselben Pakets"
InformationsquelleAutor Miserable Variable