Java关于值传递

jashdf123 2019-12-30 01:12:43
swap使用的参数应该是circle1和circle2的内存地址,理论上对换了以后,再次打印应该是对换过的数据。
可为什么在这边没有变化呢? 是我哪里理解错了?

public class Test2 {

public static void main(String[] args) {
Circle circle1 = new Circle(1);
Circle circle2 = new Circle(2);

System.out.println("在初始状态: Circle1 = "+
circle1.radius + " circle2 = " + circle2.radius);

swap1(circle1, circle2);
System.out.println("在进行过swap1后: Circle1 = "+
circle1.radius + " circle2 = " + circle2.radius);
// 个人预测为 2 和 1
}

public static void swap1(Circle x, Circle y) {
Circle temp = x;
System.out.println(temp.radius);
x = y;
System.out.println(x.radius);
System.out.println(y.radius);
y = temp;
System.out.println(y.radius);
}
...全文
90 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
哈希塞特 2020-01-10
  • 打赏
  • 举报
回复
跨方法是无法修改引用本身的,但是可以改变引用指向的对象
Lord.Heathcliff 2020-01-01
  • 打赏
  • 举报
回复
方法的形参的改变不能反过来改变传递的实参。
Lord.Heathcliff 2020-01-01
  • 打赏
  • 举报
回复
简单的说,swap方法相当于在方法内部建立了两个局部变量x,y,并且把C1,C2的引用复制给x,y。然后把x,y调换了一下,方法结束时x,y消失,没有影响到c1,c2。
qq_39936465 2019-12-31
  • 打赏
  • 举报
回复
事实上 只不过从 x引用c1 y引用c2,变为y引用c1,x引用c2,本身对c1和c2没有影响。 看图你就明白了
qq_39936465 2019-12-31
  • 打赏
  • 举报
回复
引用 5 楼 jashdf123 的回复:
略有疑问,你说的修改radius我能够理解,相当于我直接修改了Circle1和2对应内存地址上的数据。 但同样的,我这边的Circle x 和 y 其实都是 1 和 2的内存地址,如果我对x和y进行互换,那应该也会影响1和2 我也在IDEA中的调试中发现在执行swap的时候 x和y的内存地址和1和2是一样的。那为什么当这个方法执行完成以后,1和2就像什么也没发生过一样?
这个没啥多研究的,这个就是值的作用范围问题,好好看看基础书吧。 https://blog.csdn.net/qq_38182125/article/details/88094475
jashdf123 2019-12-31
  • 打赏
  • 举报
回复
引用 4 楼 dkwuxiang 的回复:
调用swap1(circle1, circle2)时,时重新new 了两个对象 x3 , y4 指向 分别 circle1,circle2的内存地址, 这里可以理解为: public static void swap1(Circle x3, Circle y4) {} 只不过 方法内如果你是直接改比如:x3.radius = 100;这样,等于是会修改原内存地址中的值,造成值被改变了 这是circle1.radius 等于100; 但是你现在是将 方法中的 x3,y4 重新赋值指向其他的内存地址,已经影响不到原内存地址中的值了; 不知道能理解吗?
略有疑问,你说的修改radius我能够理解,相当于我直接修改了Circle1和2对应内存地址上的数据。 但同样的,我这边的Circle x 和 y 其实都是 1 和 2的内存地址,如果我对x和y进行互换,那应该也会影响1和2 我也在IDEA中的调试中发现在执行swap的时候 x和y的内存地址和1和2是一样的。那为什么当这个方法执行完成以后,1和2就像什么也没发生过一样?
CS_草祭先生 2019-12-31
  • 打赏
  • 举报
回复
这其实就是一个作用域的问题。 这个只是地址的引用,并非修改了原先的地址。
jashdf123 2019-12-31
  • 打赏
  • 举报
回复
赞 我瞬间明白了 XY是复制了引用地址。所以xy得对换不会对c1c2产生影响。同时也谢谢 @dkwuxiang
dkwuxiang 2019-12-31
  • 打赏
  • 举报
回复
你的操作只是造成了如上图所示的效果
dkwuxiang 2019-12-30
  • 打赏
  • 举报
回复
调用swap1(circle1, circle2)时,时重新new 了两个对象 x3 , y4 指向 分别 circle1,circle2的内存地址, 这里可以理解为: public static void swap1(Circle x3, Circle y4) {} 只不过 方法内如果你是直接改比如:x3.radius = 100;这样,等于是会修改原内存地址中的值,造成值被改变了 这是circle1.radius 等于100; 但是你现在是将 方法中的 x3,y4 重新赋值指向其他的内存地址,已经影响不到原内存地址中的值了; 不知道能理解吗?
qq_39936465 2019-12-30
  • 打赏
  • 举报
回复
引用 楼主 jashdf123 的回复:
swap使用的参数应该是circle1和circle2的内存地址,理论上对换了以后,再次打印应该是对换过的数据。 可为什么在这边没有变化呢? 是我哪里理解错了?
一般来说参数相当于局域变量,不会影响原值,除非你有返回值。 你Circle1和Circle2也非全局变量
源者鬼道 2019-12-30
  • 打赏
  • 举报
回复
方法中定义的变量是局部变量,局部变量在方法结束之后是会销毁的,所以你需要对所指代的对象的值进行修改才可以
zzzzzzzzzzzw___ 2019-12-30
  • 打赏
  • 举报
回复
这个类也贴出来吧Circle

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧