访问受保护成员时出错[重复]

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.javaB.java 是单独的文件并保存在单独的包中。在编译 B.java 时,我收到 3 个错误,表明 xA 中具有受保护的访问权限。有人可以解释为什么即使在扩展类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;
    

【讨论】:

谢谢,解决了。

以上是关于访问受保护成员时出错[重复]的主要内容,如果未能解决你的问题,请参考以下文章

无法访问基类中的受保护成员 [重复]

通过基类变量访问的 C# 受保护成员 [重复]

C#访问派生类中的受保护成员[重复]

java中不同包的受保护成员访问-好奇心[重复]

受保护的内部成员 [重复]

无法从派生类构造函数参数访问受保护的基类成员[重复]