代码如下:
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
怪我咯2017-04-18 10:53:11
Java での参照による受け渡しは、本質的にはオブジェクトのアドレスを渡すことです。アドレスは実際には値によって渡され、メモリ内でポイントされているオブジェクトの値を変更できます。このアドレスの値を変更しても、実際のオブジェクトの制御が失われる以外は意味がありません。
ringa_lee2017-04-18 10:53:11
行きます、行きます
これは非常に簡単で、参照渡しではアドレスが渡されると、そのアドレスが呼び出されたメソッドのローカル変数に配置されることを理解するだけで済みます。フレームには独自のローカル変数テーブルがあり、相互に影響しません。これが、参照を渡してから、元の画像が存在しないように参照点を変更する理由です。
それでは、obj.val が変更されると val の値が変化するのはなぜでしょうか? val の値はヒープに保存され、コピーされ、変更されてからヒープに書き戻されるため、変化します。わからない場合はどんどん質問してください