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

时间:2012-04-17 16:18:54

标签: 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:这个类单独用于更改变量a,它不包含构造函数来创建“子对象”

public class Sub {
//stuff

subMethod(){
int a = 5;
}

如果我将行Main main;放在Sub类中,如果我调用subMethod(),程序将给出一个nullpointer异常。 好吧...我猜因为我没有真正创建主要对象......到目前为止一切都很好。

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

奇怪的是,如果我将行Main main = new Main();放在subMethod中......

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

......该死的东西确实有效......(好吧,它很慢,因为每次调用该方法都会产生一个新对象)

为什么会这样?

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

问候 红色

2 个答案:

答案 0 :(得分:0)

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

a

答案 1 :(得分: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作为参数设置方法

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

此外,如果setA中的方法B不是static,则必须在instance B上调用它

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

如果它是静态的,你可以在class B

上调用它
B.setA(a, val);