Java 静态实例变量传递值
我认为java中的静态原语变量在传递给方法时应与非静态原语变量的工作方式不同:Java 静态实例变量传递值,java,static,parameter-passing,Java,Static,Parameter Passing,我认为java中的静态原语变量在传递给方法时应与非静态原语变量的工作方式不同: public class Main { private static int a; public static void main(String[] args) { modify(a); System.out.println(a); } static void modify(int a){ a++; } } 输出为0,这
public class Main {
private static int a;
public static void main(String[] args) {
modify(a);
System.out.println(a);
}
static void modify(int a){
a++;
}
}
输出为0,这对于通过值传递的原语是可以理解的,但是为什么静态在这里没有任何意义呢?我希望输出为1
可能是一个愚蠢的问题,但我感到困惑。您的
modify
方法中的a
名称指的是本地方法参数,而不是static
变量。您的静态方法中有一个隐藏变量
执行a++
时,该方法局部变量的值将增加1
静态变量的默认值为0,不会受到影响
如果你想改变的话
使用
如果您真的愿意,您可以通过int包装解决这个问题,比如
AtomicInteger
:
public class Main {
private static final AtomicInteger a = new AtomicInteger(0);
public static void main(String[] args) {
modify(a);
System.out.println(a);
}
static void modify(AtomicInteger a){
a.getAndIncrement(); // "eqvivalent" of a++
}
}
您当前的代码采用int,并且由于Java的工作方式,它会接收您的
静态a
,并且对您的静态字段没有影响。那么如何从modify()访问“a”实例变量呢?您不能在静态上下文中使用“this”,对吗?@jarosik您可以限定它Main.a
。我提出的其他有效解决方案是:您只需将方法参数重命名为:modify(int b)或除“a”以外的任何内容,普通的“a++”就可以了。@jarosik这个概念称为范围。
public class Main {
private static final AtomicInteger a = new AtomicInteger(0);
public static void main(String[] args) {
modify(a);
System.out.println(a);
}
static void modify(AtomicInteger a){
a.getAndIncrement(); // "eqvivalent" of a++
}
}