概述
今天看到一个Java知识点:JAVA里除了8种基本类型传参数是值传递,其他的类对象传参数都是引用传递。
这句话的意思:Integer作为参数传递时引用传递。
但是我测试了一下,发现Integer作为参数传递,没有设置返回值。Ineger的结果不变
public class test{
public void add(Integer i){
i=i+3;
}
@Test
public void test(){
Integer a=5;
add(a);
System.out.println(a);
}
}
测试上面的结果:5
首先为了验证上面的知识点是不是对的,我又测试了下面代码:
public class test{
//System.identityHashCode(对象)输出对象的地址
public void add3(Integer i){
System.out.println("i的地址:"+System.identityHashCode(i));
i=3;
}
@Test
public void test(){
Integer a=5;
System.out.println("a的地址:"+System.identityHashCode(a));
add(a);
System.out.println(a);
}
}
结果:
a的地址:352359770
i的地址:352359770
5
通过上面的代码测试,发现Integer参数确实是引用传递。通过查询知道:
由于jdk1.5自动装箱的特性,实际情况是等价于执行 i = Integer.valueOf(3);valueOf()方法 参看源码 会根据传入的数值 如果在-128-127之间 就从常量池中获取一个Integer对象返回;如果不在范围内 会new Integer(3)返回。
即是说Integer的地址会随着值的改变而改变!
我又进行了下面的测试:
public class test{
public void add3(Integer i){
System.out.println("i赋值前的地址:"+System.identityHashCode(i));
i=3;
System.out.println("i赋值后的地址:"+System.identityHashCode(i));
}
@Test
public void test(){
Integer a=5;
System.out.println("a赋值前的地址:"+System.identityHashCode(a));
add3(a);
System.out.println("a赋值前的地址:"+System.identityHashCode(a));
a=10;
System.out.println("a修改值后的地址:"+System.identityHashCode(a));
System.out.println(a);
}
}
结果
a赋值前的地址:352359770
i赋值前的地址:352359770
i赋值后的地址:243745864
a赋值前的地址:352359770
a修改值后的地址:699780352
10
通过测试,返现Integer每次改变值,都回发生地址的变化。
还需要注意的一点是:
在Integer源码中,int值是final修饰的,不可以改变
class Integer{
final int value; //一旦赋值,就不能改变。
}
总结:
(1)Integer参数传递是引用传递(或叫地址传递)
(2)Integer作为参数传入方法,没有设置返回值,Inerger的值就不会改变原因是:Integer每次赋值都是被赋予新的对象,所以作为引用传入后,又会换成其他的引用。
参考文章:
https://www.cnblogs.com/zhousysu/p/5483795.html
https://www.cnblogs.com/toSeeMyDream/p/9165846.html
https://blog.csdn.net/u012309392/article/details/83443679
https://blog.csdn.net/weixin_34249678/article/details/85995877
最后
以上就是羞涩萝莉为你收集整理的Integer参数传递问题的全部内容,希望文章能够帮你解决Integer参数传递问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复