Chciałbym zrozumieć, co dzieje się w poniższym przykładzie (gdzie chroniony członek jest uzyskiwany z zewnątrz pakietu przez podklasę).Java: chroniony dostęp przez pakiety
Wiem dla klas poza pakietem, podklasa może zobaczyć chronionego członka tylko przez dziedziczenie.
Istnieją dwa pakiety: package1
i 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 } }
Zrozumiałe jest, że sposób w ExtendsprotectedClass
boo()
mogą uzyskać dostęp foo()
, ponieważ członkowie chronione mogą być dostępne tylko w drodze dziedziczenia.
Moje pytanie brzmi, dlaczego metoda foo()
działa dobrze, gdy dostęp poprzez odniesienie w sposobie ExtendsprotectedClass
ale main()
nie zadziała gdy dostępne poprzez odniesienie w UsesExtendedClass
epc
?
@Jon Dzięki. Rozumiem, że członkowie klasy podklasy mają dostęp do chronionych członków (jak wskazano w metodzie 'boo()'). Ale był ciekawy wiedzieć, dlaczego jest dozwolony dostęp do chronionego członka poprzez odwołanie do podklasy, ** TYLKO ** w metodach podklasy? jakiekolwiek uzasadnienie tego? – JWhiz
@JWhiz: Edytowanie ... –
2) Działa, ponieważ ponieważ metoda chroniona jest dostępna przez wskaźnik własnej klasy. Powinno to zawieść:
Publiczna pustka statyczna ExtendsprotectedClass.main (String [] args) { ProtectedClass epc = new ExtendsprotectedClass(); // upcast
epc.foo(); // powinien być błąd kompilacji?
} } –