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

为何下述Java代码执行后println输出10?求详细解析

为什么你的Java代码没有修改Integer的值?

嘿,这个问题我刚学Java的时候也踩过坑!咱们一步步来拆解为什么结果是10,不是你预期的13:

首先先把你的代码格式化一下,方便看逻辑:

public class Exa { 
    public static void main(String[] args) { 
        Integer b = new Integer(10); 
        add(b); 
        System.out.println(b.intValue()); 
    } 
    public static void add(Integer b){ 
        int i = b.intValue(); 
        i += 3; 
        b = new Integer(i); 
        System.out.println("b="+b+",i="+i); 
    } 
}

核心原因有两个:

  • Java的参数传递是「值传递」:不管是基本类型还是引用类型,传递给方法的都是变量的副本。这里main方法里的b是指向值为10的Integer对象的引用,调用add(b)时,只是把这个引用的副本传给了add方法里的b变量——这俩b是完全独立的变量,只是一开始都指向同一个对象而已。
  • Integer是不可变类:Integer对象一旦创建,它内部存的数值就不能被修改。你在add方法里做的操作:
    1. 把原对象的值取出来给i
    2. i +=3只是修改了局部变量i的值
    3. b = new Integer(i)是新建了一个值为13的Integer对象,并让add方法里的局部b指向这个新对象,但这完全不会影响main方法里原来的b的指向——main里的b依然死死盯着最初那个值为10的对象。

所以add方法里打印的b=13,i=13只是局部变量的结果,main方法打印的是自己手里那个对象的值,自然还是10。

如果想实现预期的数值变更,有两种常见方案:

  1. 让方法返回修改后的对象,然后在main方法里接收这个新对象:
public class Exa { 
    public static void main(String[] args) { 
        Integer b = new Integer(10); 
        b = add(b); // 接收返回的新对象
        System.out.println(b.intValue()); // 现在会输出13
    } 
    public static Integer add(Integer b){ 
        int i = b.intValue(); 
        i += 3; 
        return new Integer(i); 
    } 
}
  1. 使用自定义的可变容器类:因为不可变类没法改内部值,咱们自己写个能改值的类来包装:
// 自定义可变整数容器
class MutableInteger {
    int value;
    public MutableInteger(int value) {
        this.value = value;
    }
}

public class Exa { 
    public static void main(String[] args) { 
        MutableInteger b = new MutableInteger(10); 
        add(b); 
        System.out.println(b.value); // 输出13
    } 
    public static void add(MutableInteger b){ 
        b.value += 3; // 直接修改容器里的数值
    } 
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:19:52