java覆盖 - 字段不可见

时间:2012-10-03 12:11:06

标签: java override

我有一个需要修改的java公共类(只有一个方法)。这个类在一个包中,所以我正在编写一个新类,它扩展了第一个类并覆盖了我需要改变的方法。

A类是

public class A {
    GL gl;
    GLU glu;
    PGraphicsOpenGL pgrap;
    //other fields

    //constructor

    public void method() {
        this.gl = pgrap.gl;
        this.glu = pgrap.glu;
        //something else I don't want in class B
    }
}

B类就像是

public class B extends A {

    //constructor that recalls super()

    public void method() {
        super.gl = pgrap.gl;
        super.glu = pgrap.glu;
    }
}

但我收到了super.gl = pgrap.glThe field A.gl is not visible的错误消息。 我没有在包中写入任何getter方法,我该怎么办?

感谢。

注意:我无法重新编译软件包或将类B添加到软件包中。

5 个答案:

答案 0 :(得分:8)

默认访问说明符为package-private,这意味着与A在同一个包中的类可以使用A

的实例访问此变量
A a = ....
a.gl = ...; // this works.

package-private成员(和private成员)不会被继承,只有protectedpublic成员。

由于A#method()已经在执行分配操作,因此您在super.method()中调用B#method()以获得所需的行为。或者您应将其标记为protected

答案 1 :(得分:3)

Controlling Access to Members of a Class

A.glA.glu是包私有的(没有显式修饰符)。您能够访问它们的唯一方法是,如果B类与A类在同一个包中。

如果他们受到保护,您可以按照自己的意愿访问它们:

  

protected修饰符指定只能访问该成员   在它自己的包中(与package-private一样),另外,通过   另一个包中其类的子类。

答案 2 :(得分:2)

字段glglu具有包访问权限。使用protected访问修饰符可以在子类中访问它们。

答案 3 :(得分:1)

将变量定义为protected.

protected int gl;
protected int glu;

由于您的变量具有默认访问权限,因此您可以在同一个包中访问它们。因此,您需要移动B或将它们定义为protected,以便子类可以访问它们。

答案 4 :(得分:1)

假设您无法在类B的同一个包中声明您的类A,并且您无法直接修改类A,那么只能通过反思来选择:

public void method() {
  Field[] fields = this.getClass().getSuperClass().getDeclaredFields();

  for (Field field : fields) {
    if (field.getName().equals("gl")) {
      field.setAccessible(true);
      field.set(this, pgrap.gl);
    }
  }
}