以下の例(保護されたメンバーがサブクラスを介してパッケージの外部からアクセスされている場合)で何が起こっているのかを理解したいと思います。
パッケージ外のクラスの場合、サブクラスは継承を通じてのみ保護されたメンバーを見ることができます。
2つのパッケージがあります: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 } }
保護されたメンバーは継承を通じてのみアクセスできるため、のboo()メソッドはにExtendsprotectedClassアクセスできることが理解されます。foo()
私の質問は、メソッドの参照を介してアクセスするとメソッドが 正常foo()に機能するのに、の参照を介してアクセスすると機能しないのはなぜですか?main()ExtendsprotectedClassepcUsesExtendedClass
