为什么函数传递引用,对象的值却依旧没有变化?

WiseWolf_Life 2015-08-03 10:29:05
Node buildTree(Node root){
int value = in.nextInt();
if(value == -1){
return null;
}
else{
root = new Node(value);
}
root.left = buildTree(root.left);
root.right = buildTree(root.right);
return root;

}
@Test
public void test() {
BinaryTree tree = new BinaryTree();
Node root =null;
tree.buildTree(root);
tree.preOrder(root);//先序遍历
}

如果这样将root对象直接传递到函数中,函数执行完成,root的值依旧为空。
root=tree.buildTree(root);

可是如果我直接将buildTree(root)函数的返回值赋值给root,这个返回值是有值的。

...全文
436 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
逍遥jc 2015-08-06
  • 打赏
  • 举报
回复
在函数中对变量重新赋值都是无效的!
lxraiyl 2015-08-04
  • 打赏
  • 举报
回复
看了1、2、3楼的回复,我真是深深的醉了。楼主你即使按照1楼所说的将root实例化,那么你将root直接传递到函数中,你会发现root依然没有改变。这个就是涉及到函数传值和传引用(c++中也有的叫传地址),实际上只有传值这一种,不过为了方便理解所以有了传递引用这样的说法。废话不多说,下面解释你的问题: 你的buildTree(Node root)函数中,root这个变量,无论你在函数中对这个变量本身如何做改变(注意不是改变变量所指向的对象中的值),函数执行完以后,都不会影响这个变量的。简单点说,如果你的变量root开始时指向对象A,你在函数中将他指向对象B,那么你函数执行完了后,依然指向对象A。你的buildTree函数中,参数是root,开始时指向一个NULL,然后你再函数中new Node(),此时你仅仅改变了这个root变量所指向的对象,你后面的操作都是基于这个新对象。当函数执行结束后,你的root变量还是指向开始时的NULL对象。
傻傻de点点 2015-08-03
  • 打赏
  • 举报
回复
Node root =null; root都没实例化,怎么可能会有值。改为 Node root = new Node(); 即可
dlhansy 2015-08-03
  • 打赏
  • 举报
回复
在函数里边的变量与传进来的变量是两个不同的变量,只不过指向相同的地址空间。 但如果在函数里边new一个实例,就与传进来的变量指向不同的地址空间了,两个变量就没有关系了,无法回传所做的修改。 所以想使用函数的引用方式传出变化,必须先实例化,再调用函数,做相应的修改。
zhaoqiubo 2015-08-03
  • 打赏
  • 举报
回复
不实例化是不分配内存空间的。
董小姐_123 2015-08-03
  • 打赏
  • 举报
回复
实例化.....

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧