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

2023-11-15

问题描述

在实际业务开发过程中,我们会把实参传递给形参,在方法体内对引用对象进行构建或者修改,从而改变实参,因为对形参对象属性修改时,实参对象也会随着改变,详情请看: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协议进行许可。转载请署名作者且注明文章出处。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java无法通过形参设置为null改变实参 的相关文章

  • 如何在java swing中的每个页面中打印带有页脚的整个JPanel

    好吧 这可能很简单 但想不通 我有一个包含 JTable 的 JPanel JTable 包含很少的行 有时更多 因为我推入其中的表模型取决于数据库 但是 我不使用任何包含 JTable 的 JScolpane 因此 当 JTable 包含
  • 如何自定义BlockingQueue的阻塞行为

    我想创建一个阻塞队列 它根据自定义规则而不是队列中的项目数量来阻止生产者 例如 生产者生成一些文件并放入队列中 消费者经过一番分析后将它们转移到特定位置 对于上述场景 如果队列中的总文件大小达到某个阈值 我希望生产者等待生成新文件 如果总大
  • 在 Kotlin 中实现返回 Collection 的 Java 方法

    我将 Kotlin 与 Spring Security 结合使用 实现该方法时 public interface UserDetails extends Serializable Collection
  • 在气球内显示带有照片的多个地标的最佳做法是什么?

    我有一个项目如下 从手机上拍摄几张照片 将照片保存在网络系统中 然后将照片显示在其中的谷歌地球上 我读过很多文章 但它们都使用 fetchKml 我读过的一篇好文章是使用 php 但使用 fetchKml 我不知道是否可以使用 parseK
  • 删除 servlet 中的 cookie 时出现问题

    我尝试使用以下代码删除 servlet 中的 cookie Cookie minIdCookie null for Cookie c req getCookies if c getName equals iPlanetDirectoryPr
  • firestore快照监听器生命周期和定价之间有什么关系?

    在我的活动中 我有一个字符串列表 这些字符串表示我想要附加快照侦听器的 Firestore 文档 我使用 Acivity ModelView 存储库结构 在活动的 onCreate 中 我向 ViewModelProvider 询问适当的
  • 如何消除警告:使用“$”而不是“.”对于 Eclipse 中的内部类

    我是 Android 开发新手 当我将 eclipse 和 Android SDK 更新到最新版本后 我收到警告 Use instead of for inner classes or use only lowercase letters
  • 会话 bean 中的 EntityManager 异常处理

    我有一个托管无状态会话 bean 其中注入了 EntityManager em 我想做的是拥有一个具有唯一列的数据库表 然后我运行一些尝试插入实体的算法 但是 如果实体存在 它将更新它或跳过它 我想要这样的东西 try em persist
  • LibGdx 如何使用 OrthographicCamera 滚动?

    我已经找了 10 个小时 字面意思 我已经完成了 我需要问一下 事情是我正在学习如何使用 LibGdx 来编写 Java 游戏 我正在做一个水平太空飞船游戏 所以 我最糟糕的问题是我不知道如何滚动 我认为绘制会更好地解释 我想绘制一个巨大的
  • java JFileChooser 文件大小过滤器

    我知道我可以按文件类型进行过滤 但是可以按文件大小进行过滤吗 例如 JFileChooser 仅显示 3 MB 以内的图片 简短的回答应该是 你尝试过什么 长答案是肯定的 JFileChooser fc new JFileChooser f
  • 在 Mac 上使用 JRE 打开 jar 文件

    我有一个 jar 文件 旨在通过命令行运行 我不打算在运行应用程序的机器上进行任何java开发 我的思考过程是 因此我应该只需要JRE而不是JDK 此外 JDK 大约是 JRE 的 4 倍 我不想下载它 在 Mac 上安装 JRE 时 它不
  • 嵌入式 tomcat 7 servlet 3.0 注释不起作用

    我有一个精简的测试项目 其中包含 Servlet 版本 3 0 用注释声明 如下所示 WebServlet test public class TestServlet extends HttpServlet private static f
  • RMI 服务器:rmiregistry 或 LocateRegistry.createRegistry

    对于服务器端的RMI 我们需要启动吗rmiregistry程序 或者只是调用LocateRegistry createRegistry 如果两者都可以的话 各有什么优点和缺点 他们是同一件事 rmiregistry是一个单独的程序 您可以从
  • 为什么在尝试使用 Java 连接到 RDS PostgreSQL 数据库时会收到 SocketTimeoutException?

    我有一个 Spring 应用程序 我试图在 AWS 上托管 几天来我一直在努力配置 我有一个 EC2 实例 并且能够通过 SSH 连接到它 我还在 AWS 中设置了 Postgres RDS 数据库 但我无法使用 IDE 中的代码连接到它
  • JDK 7 的快速调试/调试构建

    我正在寻找 JDK 的调试 或者我猜他们称之为快速调试构建 以启用在运行时生成的打印程序集以及查找性能问题时所需的其他诊断 就目前情况而言 我似乎找不到可以直接使用的 现成的 快速调试构建二进制包 有人可以帮我提供下载链接 或者至少提供有关
  • Java的hashCode可以为不同的字符串产生相同的值吗?

    使用java的哈希码函数是否可以为不同的字符串提供相同的哈希码 或者如果可能的话 其可能性的 是多少 Java 哈希码是 32 位 它散列的可能字符串的数量是无限的 所以是的 会发生冲突 百分比是没有意义的 项目 字符串 的数量是无限的 而
  • Java泛型类型

    当我有一个界面时 public interface Foo
  • 日期时间解析异常

    解析日期时 我的代码中不断出现异常错误 日期看起来像这样 Wed May 21 00 00 00 EDT 2008 这是尝试读取它的代码 DateTimeFormatter formatter DateTimeFormatter ofPat
  • Java 9 中紧凑字符串和压缩字符串的区别

    有什么优点紧凑的字符串 http openjdk java net jeps 254JDK9 中的压缩字符串 压缩字符串 Java 6 和紧凑字符串 Java 9 都有相同的动机 字符串通常实际上是 Latin 1 因此浪费了一半的空间 和
  • 如何使用 Spring AOP 建议静态方法?

    在执行类的静态方法之前和之后需要完成一些日志记录 我尝试使用 Spring AOP 来实现这一点 但它不起作用 而对于正常方法来说它起作用 请帮助我理解如何实现这一点 如果可以使用注释来完成 那就太好了 也许您应该在使用 Spring AO

随机推荐

  • JAVA 正则表达式 (超详细) .

    在Sun的Java JDK 1 40版本中 Java自带了支持正则表达式的包 本文就抛砖引玉地介绍了如何使用java util regex包 可粗略估计一下 除了偶尔用Linux的外 其他Linu x用户都会遇到正则表达式 正则表达式是个极
  • java 交流学习微信群

    专注Java相关技术 SSM Spring全家桶 微服务 MySQL 集群 dubbo 分布式 中间件 Linux 网络 多线程 Jenkins Nexus Docker ELK等等 相关开发的兼职信息等 微信 18210730150 由于
  • SQL server基本的代码操作

    一 数据库相关操作 1 创建数据库 创建一个具有2个文件组的数据库test1 要求 1 主文件组包括文件test1 dat1 文件初始大小为20 MB 最大为60 MB 按5 MB增长 2 文件组test1 Group1包括文件test1
  • 智力题:砝码称重问题

    第一题 假设有280g食盐 有一架天平 有两个砝码 分别是14g 4g 请问能否在3次内将280g食盐分为100g和180g两堆 请详细描述你的解决方法 解法一 第一次 平分280g的食盐 140g 140g 目前重物 食盐 140g 14
  • java中的数组初始化赋初值

    方法一 int vis1 声明未初始化 vis1 new int 100 定义占用空间大小 100个int for int i 1 i lt 5 i vis1 i i 进行赋值 for int i 1 i lt 100 i System o
  • Ogre粒子编辑器ParticleUniverse

    最近需要使用粒子系统制作一些特效 由于没有美术人员的帮助 制作难度可想而知 在苦闷中 找到了ParticleUniverse 这也是Torchlight采用的粒子系统 ParticleUniverse包括Particle Universe
  • 配置跳转指定_http自动跳转https的配置方法

    这篇文章主要介绍了http自动跳转https的配置方法 需要的朋友可以参考下 IIs中实现Http自动转换到Https方法介绍 403跳转对SEO有一定影响 1 下载安装URL重写模块 Microsoft URL Rewrite Modul
  • Llama-1|Alpaca-LoRA 微调模型下载以及安装推理教程

    Llama 1 Alpaca LoRA 微调模型下载以及安装推理教程 经常玩AI的人应该对LoRA这一词并不陌生 尤其是在SD绘画领域 各种角色的LoRA模型层出不穷 那么语言领域是否存在LoRA呢 存在 且繁荣 LoRA你可以理解为语言模
  • c++随机数加随机种子(用时间为随机种子)随机每次运行都不同

    srand 功能 初始化随机数发生器 用法 srand unsigned int seed 需要头文件 stdlib h 返回值 void无返回值 rand 产生的随机数在每次运行的时候都是与上一次相同的 若要不同 用函数 srand 初始
  • [软考笔记]存储管理——页式,段式,段页式

    页式存储 4kb为1页 考点 逻辑地址和物理地址之间的转换 1 先区分逻辑地址哪一部分是页号 哪一部分是页内地址 2 根据页内地址确定物理地址 后面那块 3 再根据页号查找块号 4 拼接起来就是物理地址 解题过程 1 将页面大小转化为二进制
  • 网络工程师课程---7、网络通信综合实验(做网络基础综合实验 用什么软件)...

    网络工程师课程 7 网络通信综合实验 做网络基础综合实验 用什么软件 一 总结 一句话总结 cisco packet p k t tracer tre s packet 英 p k t 美 p k t n 数据包 信息包 小包 小捆 vt
  • 【区块链】万向区块链罗荣阁:为什么区块链是解决汽车供应链金融痛点最优雅的方案?

    本文整理自万向区块链CTO罗荣阁在万向区块链实验室主办的第三届区块链全球峰会 2017 9 14 16 上的演讲速记稿 点击阅读原文可观看完整演讲视频 罗荣阁在第三届区块链全球峰会演讲 区块链是一个伟大的创新 能够解决一些传统技术难以解决的
  • 【转载】【stm32】一键下载电路

    原创Nerute 2018 11 18 01 11 10 2361 首先感谢正点原子的开源资料 下面贴上正点原子一键下载电路的原理图 很显然 核心是一块CH340芯片 什么是CH 请看手册 再来就是引脚说明 了解一键之前 我们还得知道 st
  • BERT论文阅读笔记

    文章题目 BERT Pre training of Deep Bidirectional Transformers for Language Understanding Pre training指的是在一个数据集上训练好一个模型 然后这个模
  • 字符串分割

    题目描述 给定一个非空字符串S 其被N个 分隔成N 1的子串 给定正整数K 要求除第一个子串外 其余的子串每K个字符组成新的子串 并用 分隔 对于新组成的每一个子串 如果它含有的小写字母比大写字母多 则将这个子串的所有大写字母转换为小写字母
  • 小游戏:推箱子与推箱子简化版

    在第一版的代码中 将人在目标点上以及箱子在目标点上另外输出 在后续的获取方向键并处理时 只需减去人和箱子的数字就可以刷新目标点的显示 不会出现 吃 目标点的情况 而在第二版的代码中 使用偏移值的改变来简化代码 只需通过方向键的按键活动来改变
  • STL--set容器

    目录 一 set容器基本概念 二 set构造和赋值 三 set 大小和交换 四 set 插入和删除 五 set 查找和统计 六 set 和 multiset 的区别 七 set 容器排序 八 set 容器自定义类型数据排序 一 set容器基
  • chatgpt赋能python:用Python计算数学题,速度快效果好!

    用Python计算数学题 速度快效果好 在现代化的信息时代 计算机已经成为了我们生活中不可缺少的工具之一 而对于数学爱好者来说 用计算机进行数学计算已经变得非常普遍 因为使用计算机能够快速解决数学难题 同时也将复杂的计算变得更加简单易行 P
  • 分页组件

    分页组件是web开发中常见的组件 请完成pagination函数 在id为jsPagination的DOM元素中完成分页的显示部分 需求如下 1 最多连续显示5页 居中高亮显示current页 如demo1所示 2 total为0时 隐藏整
  • Java无法通过形参设置为null改变实参

    文章目录 问题描述 问题例子 问题分析 问题描述 在实际业务开发过程中 我们会把实参传递给形参 在方法体内对引用对象进行构建或者修改 从而改变实参 因为对形参对象属性修改时 实参对象也会随着改变 详情请看 Java是值传递还是引用传递 区别