了解 Java 中的受保护访问
在 Java 中,protected 修饰符旨在允许访问同一包中的某些成员以及子类在其他包中。但是,当从子类外部的超类实例访问受保护成员时,会出现一个常见的误解。
考虑以下示例:
// Class A package package1; public class A { protected int protectedInt = 1; } // Class C package package2; import package1.A; public class C extends A { public void go() { A a = new A(); System.out.println(a.publicInt); System.out.println(a.protectedInt); // Eclipse underlines this line } }
Eclipse 在 a. 行上引发错误。 protectedInt 被访问,声称它不可见。这似乎与 Java 中 protected 的定义相矛盾:“protected 修饰符指定该成员只能在其自己的包内访问(与 package-private 一样),此外,还可以由另一个包中该类的子类访问。”
解决误解
理解这种行为的关键在于 protected 的定义,因为它只适用于子类。具体来说,仅允许在子类体内访问受保护成员。
因此,可以从 C 类内部访问受保护成员 protectedInt,但仅限于 C 类本身的实例或 C 类子类的实例。即使它们位于同一个包中,也无法直接从超类的实例访问。
要解决 go 方法中的错误,您需要创建 C 类的实例A 类的:
C c = new C(); System.out.println(c.publicInt); System.out.println(c.protectedInt);
这将通过子类实例正确访问受保护的成员。
以上是不同包中的子类可以直接访问超类的受保护成员吗?的详细内容。更多信息请关注PHP中文网其他相关文章!