Ich möchte verstehen, was im folgenden Beispiel passiert (wo auf ein geschütztes Mitglied von außerhalb des Pakets durch eine Unterklasse zugegriffen wird).Java: geschützter Zugriff über Pakete hinweg
Ich weiß für Klassen außerhalb des Pakets, die Unterklasse kann das geschützte Mitglied nur durch Vererbung sehen. Es gibt zwei Pakete: package1
und package2
.
package1
:ProtectedClass.java
package org.test.package1; public class ProtectedClass { protected void foo() { System.out.println("foo"); } }
package2
:ExtendsprotectedClass.java
package org.test.package2; import org.test.package1.ProtectedClass; public class ExtendsprotectedClass extends ProtectedClass { public void boo() { foo(); // This works, // since protected method is visible through inheritance } public static void main(String[] args) { ExtendsprotectedClass epc = new ExtendsprotectedClass(); epc.foo(); // Why is this working? // Since it is accessed through a reference, // foo() should not be visible, right? } }
package2
:UsesExtendedClass.java
package org.test.package2; public class UsesExtendedClass { public static void main(String[] args) { ExtendsprotectedClass epc = new ExtendsprotectedClass(); epc.foo(); // CompilationError: // The method foo() from the type ProtectedClass // is not visible } }
Es versteht sich, dass die boo()
Methode in ExtendsprotectedClass
foo()
zugreifen können, können da geschützte Mitglieder nur durch Vererbung zugegriffen werden.
Meine Frage ist, warum die foo()
Methode funktioniert gut, wenn in den main()
Verfahren von ExtendsprotectedClass
durch eine Referenz zugegriffen aber wird nicht, wenn durch die epc
Referenz in UsesExtendedClass
zugegriffen?
@ Jon Danke. Ich verstehe, dass Klassenmitglieder der Unterklasse auf geschützte Mitglieder zugreifen können (wie in der 'boo()' Methode angegeben). Aber war es neugierig zu wissen, warum es erlaubt ist, über eine Referenz der Unterklasse ** NUR ** in Unterklassenmethoden auf das geschützte Mitglied zuzugreifen? irgendwelche Gründe dahinter? – JWhiz
@JWhiz: Bearbeiten ... –
2) Funktioniert, weil auf die geschützte Methode von einem Zeiger seiner eigenen Klasse zugegriffen wird. Dies sollte fehlschlagen:
öffentliche statische void ExtendprotectedClass.main (String [] args) { ProtectedClass epc = neue ExtendprotectedClass(); // upcast
epc.foo(); // sollte Kompilierungsfehler sein?
} –