java重写-字段不可见
我有一个java公共类,我只需要修改一个方法。这个类在一个包中,所以我正在编写一个新的类来扩展第一个类,并重写我需要更改的方法 甲级是java重写-字段不可见,java,overriding,Java,Overriding,我有一个java公共类,我只需要修改一个方法。这个类在一个包中,所以我正在编写一个新的类来扩展第一个类,并重写我需要更改的方法 甲级是 public class A { GL gl; GLU glu; PGraphicsOpenGL pgrap; //other fields //constructor public void method() { this.gl = pgrap.gl; this.glu = p
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有一个错误:字段A.gl不可见。
我没有在包中编写任何getter方法,我应该怎么做
谢谢
注意:我无法重新编译包或将类B添加到包中。默认访问说明符为包私有,这意味着与A位于同一包中的类可以使用A的实例访问此变量 包私有成员和私有成员不被继承,只有受保护的成员和公共成员被继承
由于Amethod已经在执行赋值操作,因此可以在Bmethod中调用super.method来获得所需的行为。或者您应该将它们标记为受保护。默认的访问说明符是package private,这意味着与A相同的包中的类可以使用A的实例访问此变量 包私有成员和私有成员不被继承,只有受保护的成员和公共成员被继承 由于Amethod已经在执行赋值操作,因此可以在Bmethod中调用super.method来获得所需的行为。或者您应该将它们标记为受保护。字段gl和glu具有包访问权限。使用受保护的访问修饰符使其在子类中可访问。字段gl和glu具有包访问权限。使用受保护的访问修饰符使它们在子类中可访问。将变量定义为受保护的 因为您的变量具有默认访问权限,所以您可以在同一个包中访问它们。因此,您需要移动B或将它们定义为受保护的,以便子类可以访问它们。将变量定义为受保护的 因为您的变量具有默认访问权限,所以您可以在同一个包中访问它们。因此,您需要移动B或将它们定义为受保护的,以便子类可以访问它们 A.gl和A.glu是包私有的,没有显式修饰符。您能够访问它们的唯一方法是,类B与类A位于同一个包中 如果它们受到保护,您可以按照自己的意愿访问它们: 受保护的修改器指定只能访问该成员 在它自己的包内,与包私有一样,并且 它的类在另一个包中的子类 A.gl和A.glu是包私有的,没有显式修饰符。您能够访问它们的唯一方法是,类B与类A位于同一个包中 如果它们受到保护,您可以按照自己的意愿访问它们: 受保护的修改器指定只能访问该成员 在它自己的包内,与包私有一样,并且 它的类在另一个包中的子类
假设您不能在类A的同一个包中声明类B,也不能直接修改类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);
}
}
}
假设您不能在类A的同一个包中声明类B,也不能直接修改类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);
}
}
}
在同一个包中定义类B。或者将其更改为protecteduse gatter and setter来访问变量,或者将变量的访问级别更改为public。在同一个包中定义类B。或者将其更改为protecteduse gatter and setter以访问变量,或者将变量的访问级别更改为public。谢谢,这正是我需要的,因为您的假设是正确的,但现在我得到的函数getSuperClass不存在,我在处理BTWB时这样做,因为我忘记添加getClass,不管怎么说,我认为它正在处理,它使用了很多次。作为Java的一个子集,Processing提供的语法可能足够了,否则您将不得不转移到一个真正的Java项目中,在一个普通的Java应用程序中嵌入一个处理框架是非常容易的。。。可能是因为它在处理1.2?谢谢你的帮助,我会尽可能长时间地使用Processing,如果我不能解决这个问题,我会切换到Java。谢谢,这正是我需要的,因为你的假设是正确的,但是现在我得到的函数getSuperClass不存在,我正在处理BTWB,因为我忘了添加getClass,不管怎么说,我认为它正在处理,它使用了很多次。作为Java的一个子集,Processing提供的语法可能足够了,否则您将不得不转移到一个真正的Java项目中,在一个普通的Java应用程序中嵌入一个处理框架是非常容易的。。。可能是因为它在处理1.2?无论如何,谢谢你的帮助,我将尽可能长时间地使用处理,如果我不能解决这个问题,我将切换到Java
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);
}
}
}