当前位置: 首页 > news >正文

Java无法通过形参设置为null改变实参

文章目录

  • 问题描述
  • 问题例子
  • 问题分析

问题描述

Java无法通过形参设置为null改变实参

在实际业务开发过程中,我们会把实参传递给形参,在方法体内对引用对象进行构建或者修改,从而改变实参,因为对形参对象属性修改时,实参对象也会随着改变,详情请看:Java是值传递还是引用传递?区别是什么?
但是方法的形参对象进行修改设置为null时,发现实参并没有被设置为null,这是为什么呢?

问题例子

class TreeNode{int val;TreeNode left;TreeNode right;public TreeNode(int val){this.val = val;left = null;right = null;}
}public class Main{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);}
}

结果:

TreeNode@ 484
TreeNode@ 484

问题分析

Java无法通过形参设置为null改变实参 - Java技术债务

main函数中的node与setNull函数中的node是栈中两个不同的引用型变量,它们都指向了堆中同一个的TreeNode object。

如图所示,setNull函数仅仅解除了该函数体中的node变量与堆中的TreeNode object的绑定关系,并没有解除main函数中的node与TreeNode object的绑定关系。

Java中的对象是通过引用来传递的,这意味着当我们将一个对象作为参数传递给函数时,实际上是将该对象的引用传递给函数。当在函数内部将该引用设置为null时,只是将引用本身设置为null,而不会对原始对象产生影响。

但是在函数setNull(TreeNode node)中将传入的对象node的成员设置为null,却可以成功。本质上是改变中的TreeNode object中的成员对象node.left的指向,使它指向null。这里并没有改变node.left原先指向的对象。

--------------------------------------欢迎叨扰此地址---------------------------------------

本文作者:Java技术债务
原文链接:https://cuizb.top/myblog/article/1677162125
版权声明: 本博客所有文章除特别声明外,均采用 CC BY 3.0 CN协议进行许可。转载请署名作者且注明文章出处。

http://www.lryc.cn/news/17938.html

相关文章:

  • GEE:样本点选择教程
  • 3.知识图谱相关学习资料汇总,提供系统化的知识图谱学习路径。一份详细的指南,补全你知识的漏洞
  • TypeScript学习笔记(一)编译环境、数据类型、函数类型、联合类型
  • 为什么要移除数据库物理外键?
  • Linux 计划任务讲解
  • Qt智能指针模板类的使用方式和区别总结
  • 【STL】模拟实现vector
  • Window 的 PHP XAMPP 安装 mongodb 的扩展
  • Codeforces Round #849 (Div. 4)(E~G)
  • 网易云音乐财报解读:收入大增亏损收窄,“云村”草长莺飞
  • MariaDB-10.8.6安装+主从搭建
  • Win11系统user profile service服务登录失败解决方法
  • Solon2 之基础:四、应用启动过程与完整生命周期
  • Java性能分析
  • 2023年阿里云ECS服务器S6/C6/G6/N4/R6/sn2ne/sn1ne/se1ne处理器CPU性能详解
  • 数据分析与SAS学习笔记8
  • 切割多个conf文件Nginx和Apache配置多版本PHP
  • 使用Navicat进行SSH加密方式连接MySQL数据库
  • 大数据Hadoop教程-学习笔记04【数据仓库基础与Apache Hive入门】
  • 20230223 刚体上的两个点速度之间的关系
  • 17.1 Display system tasks
  • 【4】linux命令每日分享——cd切换路径
  • 诚邀您体验人工智能AI
  • 【蓝桥杯集训·每日一题】AcWing 2058. 笨拙的手指
  • 运维排查篇 | Linux 连接跟踪表满了怎么处理
  • docker网络基
  • C++:谈谈单例模式的多种实现形式
  • 【Spring Cloud Alibaba】007-Nacos 配置*
  • 《安富莱嵌入式周报》第304期:开源硬件耳机设计,AI单片机STM32N6已确定为M55内核,另外还有新品STM32H5, H50X, H7R, H7S发布
  • vuex篇