java编程,函数内变量传递问题,为什么没有都改变呢?
阿神
阿神 2017-04-18 10:51:11
0
3
576

代码如下:

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@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

请问 “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)
大家讲道理

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


int x = 10;
int y = x;
y = 0;
x ?
刘奇

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

左手右手慢动作

我来我来

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

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!