Java:跨包的受保护访问
我想了解下面的示例中发生了什么(通过子类从包外部访问受保护成员)。
我知道对于包外的类,子类只能通过继承看到受保护的成员。
有两个包:和 。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