Integer是封装类型,也就是对象,为什么在参数传递时任然时值传递而不是引用传递呢

[复制链接]
查看11 | 回复10 | 2021-1-27 06:48:26 | 显示全部楼层 |阅读模式
publicclassDemo2_5{
publicstaticvoidmain(String[]args){
Integera=newInteger(1);
Integerb=newInteger(2);
swap(a,b);
System.out.println("a="+a+"b="+b);
}
publicstaticvoidswap(Integera,Integerb){
Integertemp=a;
a=b;
b=temp;
}
}
运行结果:a=1b=2
Integer是封装类型,也就是对象,为什么在参数传递时任然时值传递而不是引用传递呢
分 -->
回复

使用道具 举报

千问 | 2021-1-27 06:48:26 | 显示全部楼层
publicclassDemo2{
publicstaticvoidmain(String[]args){
Integera=newInteger(1);
change(a);
//输出结果仍然是1
System.out.println("a="+a);
}
privatestaticvoidchange(Integera){
a=newInteger(5);
}
}
楼主的代码可以简化成上面这个,问题还是一样。
Integer是引用数据类型,但是里面的value属性是final修饰的,意思是常量不可变。
主方法把a的地址传给change方法,但是它拿到了a的地址却不能改变a指向的变量的值,只能把原来的地址改成指向“5”,当然对主方法里面的a没影响了。(注意,change方法里的a是局部变量,他和主方法里面的a不是同一个变量。
回复

使用道具 举报

千问 | 2021-1-27 06:48:26 | 显示全部楼层
我补充下我楼上的回答,楼上说的有个地方不对:出现这个情况和value的值变不变是没关系的。
我把楼主的swap方法的形参名字改了一下:
publicclassDemo2_5{
publicstaticvoidmain(String[]args){
Integera=newInteger(1);
Integerb=newInteger(2);
swap(a,b);
System.out.println("a="+a+"b="+b);
}
publicstaticvoidswap(Integeraa,Integerbb){
Integertemp=aa;
aa=bb;
bb=temp;
}
}
以上的改动是对源程序没有任何影响的!!!
你在下意识地把主方法的a和swap方法的a当作同一个对象。
回复

使用道具 举报

千问 | 2021-1-27 06:48:26 | 显示全部楼层
引用2楼DoNotKnowYou的回复:我补充下我楼上的回答,楼上说的有个地方不对:出现这个情况和value的值变不变是没关系的。
我把楼主的swap方法的形参名字改了一下:
publicclassDemo2_5{
publicstaticvoidmain(String[]args){
Integera=newInteger(1);
Integerb=newInteger(2);
swap(a,b);
System.out.println("a="+a+"b="+b);
}
publicstaticvoidswap(Integeraa,Integerbb){
Integertemp=aa;
aa=bb;
bb=temp;
}
}
以上的改动是对源程序没有任何影响的!!!
你在下意识地把主方法的a和swap方法的a当作同一个对象。

我又看了一下源码,Integer中的value是私有的,而且也没有提供setter方法,所以对它的值是没有办法修改的,也就是没有方法使用a.value=123或者a.setter(123)去改变它的值,而且swap方法中的引用a只是main方法中主方法的复制,所以对于a=b之类的操作都只是改变了a的复制引用的值,而不是原本a,而Integer由于它的value是私有,而且没有setter方法,所以就没法改变Integer的值
不知道这样理解是否正确
回复

使用道具 举报

千问 | 2021-1-27 06:48:26 | 显示全部楼层
和其他对象一样,是引用传递没错,是你的swap程序写的有问题,本来引用传递就是传地址,你用局部变量不断改变地址,但却没有改变原地址指向对象的值。
swap方法结束后,局部变量都变没,原来的地址的东西还没变。
回复

使用道具 举报

千问 | 2021-1-27 06:48:26 | 显示全部楼层
引用4楼stacksoverflow的回复:和其他对象一样,是引用传递没错,是你的swap程序写的有问题,本来引用传递就是传地址,你用局部变量不断改变地址,但却没有改变原地址指向对象的值。
swap方法结束后,局部变量都变没,原来的地址的东西还没变。

谢谢解答

这个代码是我在一篇文章上看到的,但是它抛出了一个问题“Integer是封装类型,也就是对象,为什么在参数传递时任然时值传递而不是引用传递呢”
当时看到后感觉不知道怎么解释这个问题了
回复

使用道具 举报

千问 | 2021-1-27 06:48:26 | 显示全部楼层
引用3楼qq_33371372的回复:Quote: 引用2楼DoNotKnowYou的回复:
我补充下我楼上的回答,楼上说的有个地方不对:出现这个情况和value的值变不变是没关系的。
我把楼主的swap方法的形参名字改了一下:
publicclassDemo2_5{
publicstaticvoidmain(String[]args){
Integera=newInteger(1);
Integerb=newInteger(2);
swap(a,b);
System.out.println("a="+a+"b="+b);
}
publicstaticvoidswap(Integeraa,Integerbb){
Integertemp=aa;
aa=bb;
bb=temp;
}
}
以上的改动是对源程序没有任何影响的!!!
你在下意识地把主方法的a和swap方法的a当作同一个对象。

我又看了一下源码,Integer中的value是私有的,而且也没有提供setter方法,所以对它的值是没有办法修改的,也就是没有方法使用a.value=123或者a.setter(123)去改变它的值,而且swap方法中的引用a只是main方法中主方法的复制,所以对于a=b之类的操作都只是改变了a的复制引用的值,而不是原本a,而Integer由于它的value是私有,而且没有setter方法,所以就没法改变Integer的值
不知道这样理解是否正确

这样理解是没问题,但是这个程序里主要是因为你根本没有想去改指向对象的值,而是直接把main传给你的地址给替换掉,然后关起门来自己和自己玩,换来换去对原来mian方法中的参数没有任何的影响。
回复

使用道具 举报

千问 | 2021-1-27 06:48:26 | 显示全部楼层
看Integer源码才会明白
Interger有个cache[]缓冲保存128数字。
回复

使用道具 举报

千问 | 2021-1-27 06:48:26 | 显示全部楼层
严格来讲,java中没有真正的类似于指针的东西,swap方法中的形参a,b可以看做对主方法中a,b的引用拷贝,你直接对a,b操作是无效的,只有对操作对象中的元素时才会对原参数产生影响
回复

使用道具 举报

千问 | 2021-1-27 06:48:26 | 显示全部楼层
2楼的对引用传递的理解有偏差,要是按照2楼的说法,输出结果是3,可结果是0
publicvoidchange(intc[]){
c[2]=0;
}
@Test
publicvoidshow(){
inta[]={1,2,3,4,5};
change(a);
System.out.println(a[2]);
}
引用传递传过去的是地址,c[2]修改之后,因为a数组也指向那个地址,所以说a[2]也会改变
至于说interge是对象,不是基本类型,应该是引用传递。但是嘞,java机制中传参的时候,自动把interge拆箱为int,也就是基本类型,所以interge这样做的结果,和值传递一样。还有string类型也比较特殊,也不是基本数据类型,按说是引用传递,但它也是和值传递的结果一样。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行