Geschützte member-Zugriff von verschiedenen Paketen in java - eine kuriosität
package packageOne;
public class Base
{
protected void display(){
system.out.println("in Base");
}
}
package packageTwo;
public class Derived extends packageOne.Base{
public void show(){
new Base().display();//this is not working throws compilation error that display() from the type Base is not visible
new Derived().display();//is working
display();//is working
}
}
Die beiden Pakete sind in zwei verschiedenen Dateien. Aber warum dieses Verhalten?
InformationsquelleAutor der Frage abson | 2011-04-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
http://java.sun.com/docs/books/jls/third_edition/html/names.html#6.6
Die motivation ist wohl wie folgt. Wenn
obj
ist einS
KlasseS
über ausreichende Kenntnisse Ihrer Interna, hat Sie das Recht, zu manipulieren Ihre Mitglieder, und Sie können dies tun, sicher.Wenn
obj
ist nicht einS
ist es wahrscheinlich eine andere UnterklasseS2
vonC
dieS
keine Ahnung hat.S2
möglicherweise noch gar nicht geboren, alsS
geschrieben. FürS
zu manipulierenS2
's geschützt-Interna ist ziemlich gefährlich. Wenn dies erlaubt ist, vonS2
's Sicht, es nicht zu wissen, wer tamper mit seinem geschützten Interna und wie, das machtS2
job sehr schwer zu Grund, über seinen eigenen Staat.Nun, wenn
obj
istD
undD extends S
ist es gefährlich für dieS
Zugangobj.member
? Nicht wirklich. WieS
verwendetmember
ist eine gemeinsame Erfahrung vonS
und alle Ihre Unterklassen, einschließlichD
.S
als die Oberklasse hat das Recht zu definieren Verhaltensweisen undD
als die Unterklasse hat die Pflicht zu akzeptieren und sich anzupassen.Zum besseren Verständnis der Regel sollte wirklich vereinfacht werden, zu verlangen
obj
's (statische) Typ genauS
. Nachdem alle, es ist sehr ungewöhnlich und unangemessen für UnterklasseD
erscheinen inS
. Und selbst wenn es passiert, dass der statische Typ vonobj
istD
unsere vereinfachte Regel kann leicht durch upcasting:((S)obj).member
InformationsquelleAutor der Antwort irreputable
protected
erlaubt den Zugriff von Unterklassen und von anderen Klassen im gleichen Paket. Das ist, warum jederDerived
class-Instanz kann auf die protected-Methode inBase
.Anderen Zeile erzeugt einen
Base
Instanz (nichtDerived
Beispiel!!). Und Zugriff auf geschützte Methoden dieser Instanz darf nur von Objekten innerhalb desselben Pakets.-> erlaubtda der Aufrufer eine Instanz von
Derived
hat Zugriff auf protected-Elemente und Felder, die von den zugehörigen Unterklassen, auch wenn Sie in verschiedenen Paketen-> erlaubtdenn Sie rufen die Methode auf eine Instanz der
Derived
und diese Instanz hat Zugriff auf die protected-Methoden Ihrer Unterklassen-> nicht erlaubtda der Aufrufer (die
this
Instanz) der Klasse definiert ist, nicht im gleichen Paket wie dieBase
Klasse, sothis
keinen Zugriff auf die protected-Methode. Und es spielt keine Rolle - wie wir sehen -, dass die derzeitige Unterklassen eine Klasse aus diesem Paket. Dass backdoor geschlossen ist 😉InformationsquelleAutor der Antwort Andreas_D
Protected access hat einige Besondere Regeln, die detailliert in der Java Language Specification:
InformationsquelleAutor der Antwort Jörn Horstmann
Schafft es ein Basis-Objekt, und dann versucht, rufen Sie die display() auf.
Offensichtlich funktioniert es nicht, da die Anzeige() auf Basis geschützt ist.
InformationsquelleAutor der Antwort RollingBoy
Erste denke, ist, dass Sie verwenden können
protected
Object
in irgendeiner ware, sondern nur Andere package nicht-Unterklasse keinen Zugriff auf protected-member von anderen Klassen. es bedeutet, dass Sie nicht verwenden Sie es direkt. zunächst erhalten Sie, dass obj und dann verwenden.und wir haben eine andere Klasse wie
in dieser Angelegenheit müssen Sie erweitert die Klasse der geschützten member und dann verwenden Sie Sie nicht verwenden können direkt.
InformationsquelleAutor der Antwort Bhola
Dies ist das beabsichtigte Verhalten. geschützt bedeutet, dass die vererbten Klassen und gleichen Paket können Klassen sehen die Methode. Also, es ist, was Sie sehen.
InformationsquelleAutor der Antwort Vladimir Ivanov
Könnte dies eine direkte Antwort auf deine Frage, aber ich sehe keinen Grund, warum Sie nennen würde, neue
Base().display();
. Vielleicht, was Sie bedeuten, insuper.display();
.In diesem Fall, Sie sind eigentlich mit der geerbten Methode, aber nur weil Sie das vererben einer Klasse, bedeutet es nicht, dass Sie Zugriff auf die Klasse protected-Methoden (die per definitionem nur sichtbar für super-Klassen).
Der Unterschied ist auf einen Fall (dein Beispiel) die Sie versuchen, Zugriff auf eine geschützte Methode von einer Instanz einer Klasse, die Sie geerbt. In meinem Beispiel können Sie den Zugriff auf die protected-Methode durch Vererbung.
In der Zusammenfassung: Sie können den Zugriff auf die Methode über die Vererbung Kontext.
Warum?
Es gibt Programmierer, die Flexibilität in der Entscheidung, welche Funktionen können nur verwendet werden, oder verlängert sich durch direkten Nachkommen.
InformationsquelleAutor der Antwort Sinker
Einen geschützten member oder der Konstruktor ein Objekt zugegriffen werden darf, die von außerhalb des Pakets, in dem es erklärt wird, nur durch code, der verantwortlich ist für die Implementierung des Objekts auf.
InformationsquelleAutor der Antwort Pradeep
display
ist nicht eine statische Methode in Base. Also, müssen Sie Sie zunächst erstellen Sie eine Instanz von Base und rufen Sie dann die Anzeige.InformationsquelleAutor der Antwort Piyush Mattoo