(1)在函数setNull(TreeNode node)
中将传入的对象node设置为null,但是没有成功:
class TreeNode{
int val;
TreeNode left;
TreeNode right;
public TreeNode(int val){
this.val = val;
left = null;
right = null;
}
}
public class Test{
public static void setNull(TreeNode node) {
node = null;
}
public static void main(String[] args) {
TreeNode node = new TreeNode(0);
System.out.println(node);
setNull(node);
System.out.println(node);
}
}
Result:
TreeNode@77459877
TreeNode@77459877
Analysis:
main
函数中的node
与setNull
函数中的node
是栈中两个不同的引用型变量,它们都指向了堆中同一个的TreeNode object。如图所示,setNull
函数仅仅解除了该函数体中的node
变量与堆中的TreeNode object的绑定关系,并没有解除main
函数中的node
与TreeNode object的绑定关系。
(2)但是在函数setNull(TreeNode node)
中将传入的对象node的成员设置为null,却可以成功:
class TreeNode{
int val;
TreeNode left;
TreeNode right;
public TreeNode(int val){
this.val = val;
left = null;
right = null;
}
}
public class Test{
public static void setNull(TreeNode node) {
node.left = null;
}
public static void main(String[] args) {
TreeNode node = new TreeNode(0);
TreeNode node1 = new TreeNode(1);
node.left = node1;
System.out.println(node1.left);
setNull(node);
System.out.println(node1.left);
}
}
TreeNode@77459877
null
Analysis:
在setNull
中通过对node
变量进行操作,改变堆中的TreeNode object中的成员对象node.left
的指向,使它指向null
。但是需要注意的是,这里并没有改变node.left
原先指向的对象。