1

我对 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;
}

如果我把这条线Main main;放在 Sub 类中,如果我正在调用 subMethod(),程序会给我一个空指针异常。好的...我猜是因为我实际上并没有创建主要对象...到目前为止一切都很好。

但是...如果我输入该行Main main = new Main();,程序甚至不会开始给我一个“运行应用程序时出现异常”错误

奇怪的是,如果我把这条线Main main = new Main();放在子方法中......

subMethod(){
Main main = new Main();
int a = 5;
}

...该死的东西实际上有效...(它很慢,猜测是因为每次调用该方法都会创建一个新对象)

为什么呢?

它是如何正确完成的?:) (使用其他类的方法“覆盖”变量)

问候红

4

2 回答 2

0

您不应在程序中创建多个实例Main。可能Main不是存储可变状态(类成员)的最佳位置,但如果需要,您需要传递 to 的实例MainsubMethoda公开,或提供公共 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;
}
于 2012-04-17T16:23:56.810 回答
0

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

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 in 作为 set 方法的参数

 public Class B {
  ...

   public static void setA(A a, int val) {
       a.setA(val);
   }
}

如果您想直接访问上的字段,A则必须将它们公开(这通常不是您想要做的,因为它提供了完全访问权限,而不仅仅是提供其他类所需的访问权限)

Public Class A {
  public int a;
  ...
}

然后你可以做

Public Class B {
    ...
    public static void setVal(A a, int val) {
         a.a = val;
     }
}

此外,如果您没有该方法setAB因为static您必须在类似的情况下instance调用B

B b = new B();
b.setA(a, val);

好像它是静态的,你在哪里调用它class B

B.setA(a, val);
于 2012-04-17T16:28:39.053 回答