定义类为引用数据类型,都是传递的地址,
这两个代码的 a(Node node)函数本质上相同,
为什么第二种不能不能添加链表节点
希望 大_佬指点一二 \抱拳\抱拳\抱拳
Node 类
package Tree;
/**
* 文件名: Node
* 创建者: 白微我neng近
* 创建时间:2022/2/9 22:13
*/
public class Node<T> {
public Node nextNode = null;
}
第一种通过node.nextnode = new Node() 可以添加
package Tree;
/**
* 文件名:test
* 创建者:白微我neng近
* 创建时间:2022/2/13 2:25
* 说明:
*/
public class Test {
public int a(Node node) {
if (node.nextNode==null){
node.nextNode = new Node();
return 0;
}
a(node.nextNode);
return 0;
}
public static void main(String[] args) {
Test t = new Test();
Node node = new Node();
t.a(node);
System.out.println(node);
t.a(node);
System.out.println(node.nextNode);
}
}
运行结果为如下,头节点和下一节点地址不同,节点添加成功
Tree.Node@4eec7777
Tree.Node@3b07d329
第二种情况
package Tree;
/**
* 文件名:test
* 创建者:白微我neng近
* 创建时间:2022/2/13 2:25
* 说明:
*/
public class Test {
public int a(Node node) {
if(node==null){
node = new Node();
return 0;
}
a(node.nextNode);
return 0;
}
public static void main(String[] args) {
Test t = new Test();
Node node = new Node();
t.a(node);
System.out.println(node);
t.a(node);
System.out.println(node.nextNode);
}
}
运行结果如下,第一个节点正常,第二个节点为 null
Tree.Node@4eec7777
null
为什么第二种写法不能添加节点呢,本质上不是一样的吗,希望 大_佬指点一二;
原因出在引用传递传递的只是是引用,只有通过引用作用在实际对象身上的时候,行参会影响实参。否则二者互不干扰。因为形参和实参本质上是位于堆栈的两个不同地址的引用,他们初始指向了实际的对象。
第一部分代码node.nextnode=new node,由于node引用本身没有成员变量,所以它回去修改实际对象的成员变量nextnode,这样你在用实际参数访问实际对象时,会发现实际对象已经改变,即添加成功。
而第二段代码,node=new node,我开始也没看出来,但你想一下,开始的时候node和实参一样指向了null,上面这个赋值语句引用自己是可以直接执行的,形参他将自己执行了新的node,这时实参还是指向的null,所以最后通过实参访问没有变化。
有帮助的话,采纳一下,谢谢😊
函数传参是传值,把创建的新结点赋值给形参并不会改变实参的
原因就在你第二次这个node并没有引用