【问题标题】: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 之后我还是会出错?

【问题讨论】:

    标签: java oop inheritance packages protected


    【解决方案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;
          }
      }
      

      【讨论】:

      • 谢谢,解决了。
      猜你喜欢
      • 1970-01-01
      • 2012-05-26
      • 2012-11-20
      • 2014-04-24
      • 2017-08-01
      • 2016-10-01
      • 2013-08-06
      • 2015-01-30
      相关资源
      最近更新 更多