搜尋

首頁  >  問答  >  主體

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

阿神阿神2803 天前610

全部回覆(3)我來回復

  • 大家讲道理

    大家讲道理2017-04-18 10:53:11

    你的結果兩次肯定不一樣。其實就跟下面這種是一樣的。

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

    回覆
    0
  • 怪我咯

    怪我咯2017-04-18 10:53:11

    Java中所說的按引用傳遞實質上是傳遞該物件的位址,該位址其實是按值傳遞的,透過這個位址可以修改其指向記憶體處物件的值。改變該位址的值毫無意義,只會失去對真實物件的掌控。

    回覆
    0
  • ringa_lee

    ringa_lee2017-04-18 10:53:11

    我來我來

    很簡單,你只要理解,引用傳遞傳遞的是一個位址,這個位址傳過去之後會放在被呼叫方法的本地變數變中,兩個方法就有兩個棧幀,每個棧幀都有自己的本地變數表,互不影響。所以這就是你傳個引用過去,然後改變了引用的指向對原來沒有形象的原因。

    那麼,為啥obj.val被修改的時候,val的值會改變呢,因為val的值是存在堆中的,他被複製過來,修改,然後又寫回去堆中,所以就更改了。不明白可以繼續提問

    回覆
    0
  • 取消回覆