Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用其他类的方法“覆盖”变量_Java - Fatal编程技术网

Java 使用其他类的方法“覆盖”变量

Java 使用其他类的方法“覆盖”变量,java,Java,我对java比较陌生,并对javafx进行了一些体验 我想在使用类B中的方法时更改类a中的变量 Main:这是主类,它包含所有需要的东西,显示primaryStage等。它确实有一个构造函数,所以它不创建实际的主对象 public class Main extends Application { Sub sub = new Sub(); int a; // stuff public void aMethod() { sub.subMethod(); } } Sub:这个类的作用是更改变量

我对java比较陌生,并对javafx进行了一些体验

我想在使用类B中的方法时更改类a中的变量

Main:这是主类,它包含所有需要的东西,显示primaryStage等。它确实有一个构造函数,所以它不创建实际的主对象

public class Main extends Application {
Sub sub = new Sub();
int a;

// stuff

public void aMethod() {
sub.subMethod();
}

}
Sub:这个类的作用是更改变量a,它不包含用于创建子对象的构造函数

public class Sub {
//stuff

subMethod(){
int a = 5;
}
如果我把主线放在主线上;在子类中,如果调用子方法,程序将给我一个null指针异常。 好吧…我想是因为我没有真正创建主对象。。。到目前为止还不错

但是。。。如果我输入行Main=newmain;程序甚至不会在运行应用程序错误时给我一个异常

奇怪的是,如果我把行Main=newmain;在子方法中

subMethod(){
Main main = new Main();
int a = 5;
}
…这该死的东西实际上是工作的…嗯,它很慢,猜猜看,因为每次调用该方法都会创建一个新对象

为什么会这样

如何正确地完成它 使用其他类的方法覆盖变量

问候
红色

您不应该在程序中创建多个Main实例。Main可能不是存储可变状态类成员的最佳位置,但如果需要,需要将Main的实例传递给subMethod并公开,或者提供一个公共setter方法:

public class Main extends Application {
Sub sub = new Sub();
public int a;

// stuff

public void aMethod() {
sub.subMethod(this);
}

}

public class Sub {
//stuff

subMethod(Main main){
main.a = 5;
}

因此,您需要一个方法来更改另一个类的字段的值。有几种方法可以做到这一点。如果你有这门课

public Class A {
   private int a;
   ...

   public void setA(int a) {
      this.a = a;
   }
}
你可以这样做

public Class B {
   private static A instance;

   ....

   public static void setA(int a) {
      instance.setA(a);
   }
}
或者,您可以将A作为set方法的参数

 public Class B {
  ...

   public static void setA(A a, int val) {
       a.setA(val);
   }
}
如果您想直接访问上的字段,则必须将其公开,这通常不是您想要做的,因为它提供了完整的访问权限,而不仅仅是提供其他类所需的访问权限

Public Class A {
  public int a;
  ...
}
那你就可以了

Public Class B {
    ...
    public static void setVal(A a, int val) {
         a.a = val;
     }
}
另外,如果您没有将B中的方法setA设置为static,则必须在B的实例上调用它,如

如果它是静态的,你把它叫做B类


它实际上不起作用,只是编译了你设置为5的数字与主类中的数字不同。另外,你在方法中使用的Main与另一个实例也不相同。你能提供你程序的全部源代码吗?现在还不清楚。
B b = new B();
b.setA(a, val);
B.setA(a, val);