我对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;
}
......该死的东西确实有效......(好吧,它很慢,因为每次调用该方法都会产生一个新对象)
为什么会这样?
它是如何正确完成的? :) (使用其他类的方法来“覆盖”变量)
问候 红色
答案 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);