为了账号安全,请及时绑定邮箱和手机立即绑定

java编程,函数内变量传递问题,为什么没有都改变呢?

java编程,函数内变量传递问题,为什么没有都改变呢?

哔哔one 2019-02-17 13:16:04
代码如下: public void test(BSTNode<T> z) { BSTNode<T> y; if (z.left != null){ y = z.parent; BSTNode<T> a; a = y.left; if (y != null){ System.out.println("before a "+a); System.out.println("before y.left "+y.left); System.out.println("befere z.parent.left "+z.parent.left); y.left = null; //a = null; System.out.println("after a "+a); System.out.println("after y.left "+y.left); System.out.println("after z.parent.left "+z.parent.left); } } } 打印结果如下:before a threadSleep.BSTree$BSTNode@15db9742before y.left threadSleep.BSTree$BSTNode@15db9742befere z.parent.left threadSleep.BSTree$BSTNode@15db9742after a threadSleep.BSTree$BSTNode@15db9742after y.left nullafter z.parent.left null 请问 “after a ”为什么不是null? 或者将代码: y.left = null; //a = null; 改为 //y.left = null; a = null; 结果为: before a threadSleep.BSTree$BSTNode@15db9742 before y.left threadSleep.BSTree$BSTNode@15db9742 befere z.parent.left threadSleep.BSTree$BSTNode@15db9742 after a threadSleep.BSTree$BSTNode@15db9742 after y.left null after z.parent.left null 运行环境: jdk1.8
查看完整描述

3 回答

?
缥缈止盈

TA贡献2041条经验 获得超4个赞

你的结果两次肯定不一样。其实就和下面这种是一样的。


int x = 10;
int y = x;
y = 0;
x ?
查看完整回答
反对 回复 2019-03-01
?
交互式爱情

TA贡献1712条经验 获得超3个赞

Java中所说的按引用传递实质上是传递该对象的地址,该地址其实是按值传递的,通过这个地址可以修改其指向内存处对象的值。改变该地址的值毫无意义,只会失去对真实对象的掌控。

查看完整回答
反对 回复 2019-03-01
?
慕慕森

TA贡献1856条经验 获得超17个赞

我来我来

很简单,你只要理解,引用传递传递的是一个地址,这个地址传过去之后会放在被调用方法的本地变量变中,两个方法就有两个栈帧,每个栈帧都有自己的本地变量表,互不影响。所以这就是你传个引用过去,然后改变了引用的指向对原来没有形象的原因。

那么,为啥obj.val被修改的时候,val的值会改变呢,因为val的值是存在堆中的,他被复制过来,修改,然后又写回去堆中,所以就更改了。不明白可以继续提问

查看完整回答
反对 回复 2019-03-01
  • 3 回答
  • 0 关注
  • 587 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信