背景
前几天有个朋友写代码时,想把int变量作为形参传入方法中进行修改后,在方法外能够获取到修改后的变量进行下一步操作。类似这样:
class Test{
public static void main(String[] args){
int x=1;
add(x);
System.out.println(x);
}
public static void add(int num){
num++;
}
}
由于Java是值传递,所以这样是不行的。
(新手总是会有奇思妙想,知道可以用全局变量,但想用其他方法,随他的思路往下吧)
于是又想那使用包装类可以吗?比如这样:
class Test{
public static void main(String[] args){
Integer x=1;
add(x);
System.out.println(x);
}
public static void add(Integer num){
num++;
}
}
你猜怎么着,不行!
运行结果还是1
这是为什么呢?
原理
按照思路,x变量保存的地址已经传递给了num,那么num对这个对象内容进行修改之后,通过x是能看到的。
但是,包装类是有对象池的!
默认是-128到127之间的数,如果调用了包装类的valueOf方法就返回对象池的缓存对象
Integer x=1;是一个自动装箱的操作,其实是调用了Integer.valueOf方法将int类型的数据转换为Integer类型。
而num++这个动作可以被拆成num=num+1;
当包装对象和基本类型数据进行运算时,会进行拆箱,再执行运算,然后将运算的结果赋值给num,进行了自动装箱。从对象缓存池中取出了一个新的包装类型对象。
所以x的值没有发生改变!
最主要的原因就是进行运算后,发生了拆箱,装箱,导致num和x指向不同的对象
开发入门中,欢迎指教
标签:原值,Java,形参,void,add,num,static,Integer,public From: https://blog.csdn.net/m0_73455589/article/details/140905488