java编程,函数内变量传递问题,为什么没有都改变呢?
问题描述
代码如下:
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.leftthreadSleep.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.leftthreadSleep.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
问题解答
回答1:你的结果两次肯定不一样。其实就和下面这种是一样的。
int x = 10;int y = x;y = 0;x ?回答2:
Java中所说的按引用传递实质上是传递该对象的地址,该地址其实是按值传递的,通过这个地址可以修改其指向内存处对象的值。改变该地址的值毫无意义,只会失去对真实对象的掌控。
回答3:我来我来
很简单,你只要理解,引用传递传递的是一个地址,这个地址传过去之后会放在被调用方法的本地变量变中,两个方法就有两个栈帧,每个栈帧都有自己的本地变量表,互不影响。所以这就是你传个引用过去,然后改变了引用的指向对原来没有形象的原因。
那么,为啥obj.val被修改的时候,val的值会改变呢,因为val的值是存在堆中的,他被复制过来,修改,然后又写回去堆中,所以就更改了。不明白可以继续提问
相关文章:
