灵泽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日

悬赏问题

  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分