访问受保护成员时出错[重复]
Posted
技术标签:
【中文标题】访问受保护成员时出错[重复]【英文标题】:Error in accessing protected member [duplicate] 【发布时间】:2016-01-07 13:44:53 【问题描述】://Filename: A.java
package packageA;
public class A
protected int x;
//Filename B.java
package packageB;
import packageA.A;
public class B extends A
void action(A ob1, B ob2, C ob3)
x = 10;
ob1.x = 10; // <-- error here
ob2.x = 10;
ob3.x = 10;
public class C extends B
void action(A ob1, B ob2, C ob3)
x = 10;
ob1.x = 10; // <-- error here
ob2.x = 10; // <-- error here
ob3.x = 10;
所以,我在阅读 Java 中的受保护用法时遇到了这个问题。
如您所见,A.java
和 B.java
是单独的文件并保存在单独的包中。在编译 B.java
时,我收到 3 个错误,表明 x
在 A
中具有受保护的访问权限。有人可以解释为什么即使在扩展类A
之后我还是会出错?
【问题讨论】:
【参考方案1】:您不能通过超类型引用访问受保护的成员。见Java Language Specification, section 6.6.2: Details on Protected Access。
这里的方法 delta 出现编译时错误:它无法访问 其参数 p 的受保护成员 x 和 y,因为虽然 Point3d( 出现对字段 x 和 y 的引用的类)是 点(声明 x 和 y 的类),它不参与 Point 的实现(参数 p 的类型)。方法 delta3d 可以访问其参数 q 的受保护成员,因为 类 Point3d 是 Point 的子类,参与实现 Point3d 的。
【讨论】:
【参考方案2】:在B
类的方法action
中,您将获得A
类的实例——ob1
作为参数。
ob1
本身是一个纯类 A
对象。它不是从类A
扩展而来的类B
的实例。因此,您不能在 A 类之外覆盖 A 类的受保护成员。
您可以覆盖 B 类的字段成员 x
,因为 x
是从 A 类的受保护成员 x
扩展而来的。
public class B extends A
// class B has member x in field which is extended from class A
void action(A ob1, B ob2, C ob3)
x = 10; // <-- this is extended field member x from class A in class B
ob1.x = 10; // <-- this is protected member of other instance of A
ob2.x = 10;
ob3.x = 10;
【讨论】:
谢谢,解决了。以上是关于访问受保护成员时出错[重复]的主要内容,如果未能解决你的问题,请参考以下文章