1

我有一个需要修改的 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 类添加到包中。

4

5 回答 5

8

默认访问说明符是package-private指同一包中的类A可以使用以下实例访问此变量A

A a = ....
a.gl = ...; // this works.

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

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

于 2012-10-03T12:13:58.397 回答
3

控制对类成员的访问

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

如果它们受到保护,您就可以随意访问它们:

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

于 2012-10-03T12:16:33.737 回答
2

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

于 2012-10-03T12:14:19.790 回答
1

将变量定义为protected.

protected int gl;
protected int glu;

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

于 2012-10-03T12:15:35.703 回答
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);
    }
  }
}
于 2012-10-03T12:17:49.530 回答