Я хотел бы понять, что происходит в примере ниже (где защищенный член получает доступ извне пакета через подкласс).
Я знаю для классов вне пакета, подкласс может видеть защищенный член только через наследование.
Существует два пакета: package1
и 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 } }
Понятно, что метод boo()
в ExtendsprotectedClass
может получить доступ к foo()
, так как защищенные члены могут быть доступны только через наследование.
Мой вопрос: почему метод foo()
работает нормально при доступе через ссылку в методе main()
ExtendsprotectedClass
, но не будет работать при обращении через ссылку epc
в UsesExtendedClass
?