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

我有一个java公共类,我只需要修改一个方法。这个类在一个包中,所以我正在编写一个新的类来扩展第一个类,并重写我需要更改的方法

甲级是

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);
    }
  }
}