我有一个需要修改的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.gl
:The field A.gl is not visible
的错误消息。
我没有在包中写入任何getter方法,我该怎么办?
感谢。
注意:我无法重新编译软件包或将类B添加到软件包中。
答案 0 :(得分:8)
默认访问说明符为package-private
,这意味着与A
在同一个包中的类可以使用A
A a = ....
a.gl = ...; // this works.
package-private
成员(和private
成员)不会被继承,只有protected
和public
成员。
由于A#method()
已经在执行分配操作,因此您在super.method()
中调用B#method()
以获得所需的行为。或者您应将其标记为protected
。
答案 1 :(得分:3)
Controlling Access to Members of a Class
A.gl
和A.glu
是包私有的(没有显式修饰符)。您能够访问它们的唯一方法是,如果B类与A类在同一个包中。
如果他们受到保护,您可以按照自己的意愿访问它们:
protected修饰符指定只能访问该成员 在它自己的包中(与package-private一样),另外,通过 另一个包中其类的子类。
答案 2 :(得分:2)
字段gl
和glu
具有包访问权限。使用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);
}
}
}