为何下述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方法里做的操作:
- 把原对象的值取出来给
i i +=3只是修改了局部变量i的值b = new Integer(i)是新建了一个值为13的Integer对象,并让add方法里的局部b指向这个新对象,但这完全不会影响main方法里原来的b的指向——main里的b依然死死盯着最初那个值为10的对象。
- 把原对象的值取出来给
所以add方法里打印的b=13,i=13只是局部变量的结果,main方法打印的是自己手里那个对象的值,自然还是10。
如果想实现预期的数值变更,有两种常见方案:
- 让方法返回修改后的对象,然后在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); } }
- 使用自定义的可变容器类:因为不可变类没法改内部值,咱们自己写个能改值的类来包装:
// 自定义可变整数容器 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
相关产品推荐
相关产品推荐

