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

news2024/9/28 13:15:53

文章目录

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

问题描述

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.coloradmin.cn/o/366605.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《Java核心技术》笔记——第六章

文章目录CH6.接口、lambda表达式与内部类1.接口基本2.常用接口3.lambda表达式4.内部类5.服务加载器与代理前章: 第三章~第五章的学习笔记CH6.接口、lambda表达式与内部类 1.接口基本 接口基本——interface声明,方法无需指明public(默认都是…

基于node vue的电商系统 mongodb express框架

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 基于node vue的电商系统 mongodb express框架前言技术栈基本功能普通用户管理员一、运行截图?二、使用步骤1.前端main.js2.后端admin路由前言 技术栈 本项目采用…

行业分析| OA系统中的实时通讯

前言 当前实时通讯市场中有QQ、MSN、网络电话以及视频会议等,同时也有各个互联网巨头推出的基于自身平台的实时通讯工具,比如,百度hi,淘宝旺旺等,相对而言其与纯粹的实时通讯工具不同,基于自身平台的实时通…

点击化学 PEG 试剂1858242-47-3,Propargyl丙炔基-PEG1-乙酸活性酯

Propargyl-PEG1-Acetic acid-NHS ester,丙炔基-聚乙二醇-乙酸琥珀酰亚胺酯,丙炔基-PEG1-乙酸活性酯,丙炔基-PEG1-乙酸-NHS 酯产品规格:1.CAS号:1858242-47-32.分子式:C9H9NO53.分子量:211.174.包…

ChatGPT商业前景如何?人工智能未来会如何发展?

ChatGPT不仅在互联网和多个行业引发人们的关注,在投资界还掀起了机构对人工智能领域的投资热潮。人工智能聊天程序ChatGPT在去年11月亮相之后,在推出仅两个月后,今年1月份的月活用户已达到了1亿,成为史上增长最快的消费者应用程序…

【selenium 自动化测试】如何搭建自动化测试环境,搭建环境过程应该注意的问题

最近也有很多人私下问我,selenium学习难吗,基础入门的学习内容很多是3以前的版本资料,对于有基础的人来说,3到4的差别虽然有,但是不足以影响自己,但是对于没有学过的人来说,通过资料再到自己写的…

UA-DETRAC数据集转YOLO格式

一: 数据集下载 链接:(后续添加) 二: 处理标注文件 先处理标注文件,UA-DETRAC提供的标注文件格式是VOC格式,需要先转为XML格式,然后再将每个XML文件转为YOLO文件。 下面提供两个代…

git 本地新建分支并进行合并

由于新的要求 不允许在线上直接clone下的git分支进行开发,只能本地新建分支再往线上分支合并远程库clone到本地库 git clone 需要下载的git地址注意我下载下来的是dev分支 根据实际情况进行分析git clone https://gitee.com/hello.git本地创建新的分支 git checkout…

Keil编译头文件iec_std_functions.h错误解决

Keil 编译IEC61131-3库,头文件,大量出现以下错误; cast to type ? is not allowed compiling resource1.c... ..\PLC\rts\matiec\lib\C\iec_std_functions.h(192): error: #119: cast to type "TIME" is not allowed…

公派访问学者的申请条件

知识人网海外访问学者申请老师为大家分享公派访问学者申请的基本条件以及哪些人员的申请是暂不受理的,供大家参考:一、 申请人基本条件:1.热爱社会主义祖国,具有良好的思想品德和政治素质,无违法违纪记录。2.具有良好专…

Java常见问题总结五

1、垃圾回收方式 SerialGC(串行垃圾回收):为单线程环境设计且使用一个线程进行垃圾回收,会暂停所有的用户线程。 ParalleGC(并行垃圾回收):对过GC线程并行工作,此时用户线程是停止的。 ConcMarkSweep(CMS):用户线程和GC线程同时执…

Tatuk GIS Developer Kernel for .NET 最新Crack

Tatuk GIS Developer Kernel for .NET 是一个地理SDK,它是受控代码和 .NET GIS SDK,用于为用户 Windows 操作系统创建 GIS 专业软件的过程。它被认为是一个完全用于 Win Forms 的 .NET CIL,WPF 的框架是为 C# 以及 VB.NET、VC、oxygen 以及最…

StarRocks携手零洞科技,助力碧桂园物业企业微信数字化项目

作者:零洞科技大数据部零洞科技有限公司(以下简称“零洞”),是碧桂园集团的核心联盟企业,致力于成为国内领先的数智空间解决方案服务商,业务场景覆盖户内及户外,在智慧家居板块,打造…

【C语言】字符分类函数+内存函数

目录 1.字符函数 1.1字符分类函数 1.2.字符转换函数 //统一字符串中的大小写 2.内存处理函数 2.1内存拷贝函数memcpy //模拟实现memcpy 2.2内存移动函数memmove //模拟实现memmove 2.3内存比较函数memcmp 2.4内存设置函数memset 1.字符函数 1.1字符分类函数 头文…

【微信小程序】-- 宿主环境 通信模型 运行机制介绍(五)

💌 所属专栏:【微信小程序开发教程】 😀 作  者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! &#…

NFTScan x TiDB丨一栈式 HTAP 数据库为 Web3 数据服务提供毫秒级多维查询

导读 NFTScan 是一家多链 NFT 数据基础设施服务商,为 Web3 用户提供高效简洁的 NFT 资产搜索查询服务,为 Web3 开发者和新一代金融科技公司提供专业的 NFT API 数据服务。 TiDB 作为一种分布式 HTAP 数据库,可以同时满足海量数据存储和高并…

I2C实验

目录 一、I2C简介 二、硬件原理 1、看原理图,找到I2C 2、查看使用设备 3、查看使用的IO 4、查数据手册看复用位 三、查看寄存器 1、I2C Address Register (I2Cx_IADR) 2、I2C Frequency Divider Register (I2Cx_IFDR) 3、I2C Control Register (I2Cx_I2CR) …

【C++】哈希表

1. unordered系列关联式容器 在C98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到 ,即最差情况下需要比较红黑树的高度次,当树中的节点非常多时,查询效率也不理想。最好的查询是,进行…

TCP/IP网络协议介绍及原理分析

一.应用层协议对于应用层而言,协议是开发者自己进行定义的,开发者根据自定义的格式规范对数据进行编码和解析。但是从原理上进行分析,其核心主要包括两点内容:①确定客户端和服务端交互的内容(协议的内容)②…

记一次docker虚拟机横向移动渗透测试

本次渗透在几个docker虚拟机间多次横向移动,最终找到了一个可以进行docker逃逸的出口,拿下服务器。渗透过程曲折但充满了乐趣,入口是172.17.0.6的docker虚拟机,然后一路横向移动,最终在172.17.0.2出实现了docker逃逸&a…