废话不多说,先看一个简单的代码
public static void main(String[] args) {
int a = 0;
methodTest(a);
System.out.println(a);
}
public static void methodTest(int a) {
a += 1;
}
这个比较简单,输出结果是0
原因:当方法形参为基本类型时 传递的是 值 在这里也就是 给 methodTest方法的 a参数 设置了一个值 为0
a+=1 后 也只是 改变了 methodTest 方法里的 a变量的值 不影响 main方法里的 a变量的 值
所以输出结果为 0;
是不是很简单?再看下一个代码示例
public static void main(String[] args) {
Integer a = 0;
methodTest(a);
System.out.println(a);
}
public static void methodTest(Integer a) {
a += 1;
}
把int改为 Integer 包装对象 ,再算一下输出结果是什么?
什么?还是0?对象不是传递的是地址么?
没错,虽然包装类型的值是放到堆里的,栈中的变量只是存的一个地址值。但是包装类型和String类型有一个特性 就是 值不可变,不能修改原有值,只会创建新的值
上面的代码中 methodTest 方法的 a变量的值为 main方法中 a变量的 值的在堆中的地址
执行 a+=1操作 后 堆里面会创建一个 1的对象 并且把内存地址 赋给 methodTest方法中的变量a
但是外层的main方法中的a还是指向的 在内存中的0的地址
所以输出结果依然是 0
刚开始本菜鸡也不相信 直到我写了一个测试代码 如下所示:
public static void main(String[] args) {
Integer a = 0;
Integer b = methodTest(a);
System.out.println(a == b);
}
public static Integer methodTest(Integer a) {
a += 1;
return a;
}
在方法methodTest中修改值 看看 引用是否被改变了,结果打印false 表示a和b的引用确实不一致。
还是不服!然后注释了 a+=1这行代码,再次执行,发现打印出了true。
以上结果证明:
当包装类型的值改变的时候,不会修改原有值,而是生成一个新的值在堆中!