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

代码如下:

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

結果は間違いなく2倍異なります。実は以下のものと同じものです。

リーリー
いいねを押す +0
刘奇

Java での参照による受け渡しは、本質的にはオブジェクトのアドレスを渡すことです。アドレスは実際には値によって渡され、メモリ内でポイントされているオブジェクトの値を変更できます。このアドレスの値を変更しても、実際のオブジェクトの制御が失われる以外は意味がありません。

いいねを押す +0
左手右手慢动作

行きます、行きます

これは非常に簡単で、参照渡しではアドレスが渡されると、そのアドレスが呼び出されたメソッドのローカル変数に配置されることを理解するだけで済みます。フレームには独自のローカル変数テーブルがあり、相互に影響しません。これが、参照を渡してから、元の画像が存在しないように参照点を変更する理由です。

それでは、obj.val が変更されると val の値が変化するのはなぜでしょうか? val の値はヒープに保存され、コピーされ、変更されてからヒープに書き戻されるため、変化します。わからない場合はどんどん質問してください

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!