为何使用static关键字会导致Java程序输出结果不同?
问题解析:static与非static变量的行为差异
我们通过两段代码的核心逻辑,拆解背后的Java机制:
第一段代码(val无static修饰)
import java.util.*; import java.lang.*; import java.io.*; class A { public int val = 20; // <- 无static } class Main { public static void main(String[] args) { A a = new A(); updateVal(a); System.out.println(a.val); // 输出20 } private static void updateVal(A a) { a = new A(); a.val = 50; } }
背后原理:
val是实例变量:每个A类的对象都持有独立的val副本,不同对象的val互不影响。- Java是值传递:调用
updateVal(a)时,会把main方法里a的引用值复制一份,传给方法参数中的a——这两个a是完全独立的变量,只是名字相同。 - 方法内的
a = new A()仅修改了方法内部那个引用副本的指向,和main里的原对象毫无关系。后续修改的是新对象的val,原对象的val始终是20,所以最终输出20。
第二段代码(val有static修饰)
import java.util.*; import java.lang.*; import java.io.*; class A { public static int val = 20; // <- 有static } class Main { public static void main(String[] args) { A a = new A(); updateVal(a); System.out.println(a.val); // 输出50 } private static void updateVal(A a) { a = new A(); a.val = 50; } }
背后原理:
val是类变量:属于A类本身,所有A的对象共享这一个val,无论创建多少对象,访问的都是同一个值。- static变量不依赖对象:方法里的
a.val = 50本质等价于A.val = 50——通过对象访问static变量只是语法糖,实际操作的是类级别的共享变量。 - 哪怕方法内重新new了对象,修改的依然是类共享的
val,main里的对象访问val时,拿到的就是修改后的50。
内容的提问来源于stack exchange,提问作者ilhan
相关产品推荐
相关产品推荐

