如果引用的表达式的编译时类型是您自己的类或子类,则只能访问其他包中某个类型的受保护成员。(“
your”类是包含代码的类。)您自己的类也必须是最初声明方法的类型的子类。
这是一个例子。假定
base与所有其他类都在不同的包中:
package first;public class base{ protected void Foo() {}}// Yes, each class is really in its own file normally - but treat// all the classes below as being in package "second"package second;public class Child extends base{ public void OtherMethod(Object x) { ((base) x).Foo(); // Invalid: base is not Child or subclass ((Child) x).Foo(); // Valid: Child is Child ((GrandChild) x).Foo(); // Valid: GrandChild is subclass of Child ((OtherChild) x).Foo(); // Invalid: OtherChild is not Child or subclass }}public class GrandChild extends Child {}public class OtherChild extends base {}换句话说,它使您可以访问“像您一样的对象”的受保护成员。
详细信息在Java语言规范的6.6.2节中:
甲
protected对象的成员或构造可以从它仅由代码中声明的封装,它负责该对象的执行外部访问。6.6.2.1访问受保护的成员
令 C 为声明受保护成员 m 的类。访问仅在一个子类的主体允许 小号 的 Ç
。此外,如果Id表示实例字段或实例方法,则:如果通过限定名称 Q.Id 进行访问,其中 Q 是 expressionName
,则且仅当表达式 Q 的类型为 S时 ,才允许访问或 S 的子类 。如果通过字段访问表达式 E.Id进行 访问,其中 E 为
主要对象 表达,或通过一个方法调用表达式 (。)E.Id ,其中 Ë 是一个 主要 表达,则接入是允许的,当且仅当的类型 ë 是
小号 或的一个子类 小号 。



