灵泽7331 2022-02-13 22:48 采纳率: 25%
浏览 50
已结题

java 引用两种赋值 结果为什么不一样

定义类为引用数据类型,都是传递的地址,
这两个代码的 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

为什么第二种写法不能添加节点呢,本质上不是一样的吗,希望 大_佬指点一二;

  • 写回答

3条回答 默认 最新

  • ZW钟文 2022-02-13 23:46
    关注

    原因出在引用传递传递的只是是引用,只有通过引用作用在实际对象身上的时候,行参会影响实参。否则二者互不干扰。因为形参和实参本质上是位于堆栈的两个不同地址的引用,他们初始指向了实际的对象。
    第一部分代码node.nextnode=new node,由于node引用本身没有成员变量,所以它回去修改实际对象的成员变量nextnode,这样你在用实际参数访问实际对象时,会发现实际对象已经改变,即添加成功。
    而第二段代码,node=new node,我开始也没看出来,但你想一下,开始的时候node和实参一样指向了null,上面这个赋值语句引用自己是可以直接执行的,形参他将自己执行了新的node,这时实参还是指向的null,所以最后通过实参访问没有变化。
    有帮助的话,采纳一下,谢谢😊

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 2月25日
  • 已采纳回答 2月17日
  • 创建了问题 2月13日

悬赏问题

  • ¥30 关于#java#的问题,请各位专家解答!
  • ¥30 vue+element根据数据循环生成多个table,如何实现最后一列 平均分 合并
  • ¥20 pcf8563时钟芯片不启振
  • ¥20 pip2.40更新pip2.43时报错
  • ¥15 换yum源但仍然用不了httpd
  • ¥50 C# 使用DEVMOD设置打印机首选项
  • ¥15 麒麟V10 arm安装gdal
  • ¥20 OPENVPN连接问题
  • ¥15 flask实现搜索框访问数据库
  • ¥15 mrk3399刷完安卓11后投屏调试只能显示一个设备