You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何使用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;
    }
}

背后原理:

  1. val是实例变量:每个A类的对象都持有独立的val副本,不同对象的val互不影响。
  2. Java是值传递:调用updateVal(a)时,会把main方法里a的引用值复制一份,传给方法参数中的a——这两个a是完全独立的变量,只是名字相同。
  3. 方法内的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;
    }
}

背后原理:

  1. val是类变量:属于A类本身,所有A的对象共享这一个val,无论创建多少对象,访问的都是同一个值。
  2. static变量不依赖对象:方法里的a.val = 50本质等价于A.val = 50——通过对象访问static变量只是语法糖,实际操作的是类级别的共享变量。
  3. 哪怕方法内重新new了对象,修改的依然是类共享的val,main里的对象访问val时,拿到的就是修改后的50。

内容的提问来源于stack exchange,提问作者ilhan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 20:12:17