Я хотел бы понять, что происходит в приведенном ниже примере (когда защищенный элемент доступен из пакета через подкласс).
Я знаю, что для классов вне пакета подкласс может видеть защищенный член только через наследование.
Существует два пакета: 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