【发布时间】:2011-04-02 05:21:12
【问题描述】:
我想了解以下示例中发生的情况(通过子类从包外部访问受保护的成员)。
我知道对于包外的类,子类只能通过继承才能看到受保护的成员。
有两个包:package1 和 package2。
-
package1:ProtectedClass.javapackage org.test.package1; public class ProtectedClass { protected void foo () { System.out.println("foo"); } } -
package2:ExtendsprotectedClass.javapackage 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.javapackage 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(),因为受保护的成员只能通过继承来访问。
我的问题是,为什么当通过ExtendsprotectedClass 的main() 方法中的引用访问时foo() 方法工作正常,但通过epc 引用访问时不起作用在UsesExtendedClass?
【问题讨论】:
标签: java inheritance packages protected