我想了解下面的示例中发生了什么(通过子类从包外部访问受保护成员的位置)。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 } }
据了解,在ExtendsprotectedClass
的boo()
方法可以访问foo()
,由于受保护成员可以通过继承才可以访问。
我的问题是,为什么是foo()
方法通过在ExtendsprotectedClass
但的main()
方法的引用访问通过UsesExtendedClass
的epc
参考访问时,将无法正常工作时工作正常?
@Jon谢谢。我明白,子类的类成员可以访问受保护的成员(如'boo()'方法中所示)。但很想知道为什么它允许通过子类的引用来访问受保护的成员,**仅在子类方法中**。任何背后的理由? – JWhiz 2010-08-22 08:26:19
@JWhiz:编辑... – 2010-08-22 08:39:05
2)工作原理是因为受保护的方法是由它自己的类的指针访问的。这应该失败:
public static void ExtendsprotectedClass.main(String [] args){ ProtectedClass epc = new ExtendsprotectedClass(); // upcast
epc.foo(); //应该是编译错误?
} – 2010-08-22 08:52:31