Java值传递与引用传递的区别

news2024/11/24 5:55:07

我们先来看一下值传递和引用传递的定义;
值传递:在调用函数时,将实际参数复制一份传递到函数中,这样在函数中对参数进行修改,就不会影响到原来的实际参数。
引用传递:在调用函数时,将实际参数的地址直接传递到函数中。这样在函数中对参数进行的修改,就会影响到实际参数。

实参与形参
形式参数:是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数。
实际参数:在调用有参函数时,主调函数和被调函数之间有数据传递关系。在主调函数中调用一个函数时,函数名后面括号中的参数称为

我们先举个简单的例子: i的值就是实际参数,j就是形式参数

package method;

public class Demo02 {
    public static void main(String[] args) {
        Demo02 demo = new Demo02();
        int i = 10;
        demo.test(i);
        System.out.println("i: "+i);
    }

    public void test(int j){
        j = 20;
        System.out.println("j: "+j);
    }
}

 运行结果为,可以发现原来的i值并没有发生改变。

第二个例子:

public class Demo02 {
    public static void main(String[] args) {
        Demo02 demo = new Demo02();
        User user1 = new User();
        user1.setName("A1")
        demo.test(user1);
        System.out.println("main--->"+user1.getName()); //B1
    }

    public void test(User user){
        user.setName("B1");
        System.out.println("Test-->" +user.getName());//B1
    }
}

发现两个都是输出B1,这是有人可能会这样认为:Java的方法中,在传递普通类型的时候是值传递,在传递对象类型的时候是引用传递,但是这种说法也是错误的。我们接着看下一个例子

package method;

public class Demo02 {
    public static void main(String[] args) {
        Demo02 demo = new Demo02();
        User user1 = new User();
        user1.setName("A1")
        demo.test(user1);
        System.out.println("main--->"+user1.getName()); //A1
    }

    public void test(User user){
        User user = new User();
        user.setName("B1");
        System.out.println("Test-->" +user.getName());//B1
    }
}

如图可以看到,当new了一个对象时,会在内存中开辟一片空间保存name的数据,user1存有该内存的地址0x123456,当user1作为实际参数传递给形式参数user时,会把地址传递给user。
如果如例2一样,没有新new一个对象的话,会将user1的值赋给user,那么user和user1是指向同一个地址的,所以不论是user的修改还是user1的修改,本质上都是对0x123456地址上保存的数据进行修改。
但是要是如例3一样,重新new了一个对象,重新开辟了一片内存赋值给user,那么user和user1指向的是不同地址,对user的修改不会影响到user1指向内存的数据。


所以当传递的参数是对象数据类型时,对象本身指向的是它在内存中的地址,所以传递的应该是对副本,所以在调用方法时,如果没有重新new一个对象的话,方法内的对象地址指向和传递进来的对象地址是保持一致的,所以地址指向不变,那么对其值进行修改时,值也会发生改变。

总之,Java都是值传递的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1164790.html

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

相关文章

使用这些优秀的 iPad App 提升您的技术水平

还记得当年 iPad 隆重登场,每个人都对其改变游戏规则的潜力感到震惊吗?嗯,你猜怎么着?iPad 应用程序世界已经发展,我们为您精心挑选了最好的应用程序(由 AVNation 提供)。 1、Crestron Electro…

【CSDN 每日一练 ★★☆】【动态规划】最小路径和

【CSDN 每日一练 ★★☆】【动态规划】最小路径和 动态规划 题目 给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。 示例 示例 1&#x…

java毕业设计基于ssm的招聘求职网站

项目介绍 本前途招聘求职网站是针对目前仓库的实际需求,从实际工作出发,对过去的前途招聘求职网站存在的问题进行分析,完善用户的使用体会。采用计算机系统来管理信息,取代人工管理模式,查询便利,信息准确…

微服务架构之路1,服务如何拆分?使用微服务的注意事项?

目录 一、前言二、单体服务的弊端三、微服务化四、服务如何拆分?五、使用微服务的注意事项1、服务如何定义2、服务如何发布和订阅3、服务如何监控4、服务如何治理5、故障如何定位 大家好,我是哪吒。 一、前言 微服务已经是Java开发的必备技能&#xff…

Java--多线程--Thread类+Runnable接口

1.多进程与多线程 1.1多进程: 一个进程是一个包含自身地址的程序,每个独立执行的程序都称为进程,也就是正在执行的程序,系统可以分配给每个进程一段有限的使用CPU的时间(CPU时间片),CPU在这个时…

数据库实验:SQL的多表数据查询

目录 实验目的实验内容实验要求实验过程实验代码结果示意 书接上文,但是感觉之前的形式不太好用,至少不是很方便观看,所以这篇尝试改变一下写法,希望可以提升一些观感 实验目的 (1) 掌握RDBMS的数据多表查询功能 (2) 掌握SQL语言…

Junit使用

一、Junit常用注释 Test 将一个普通的方法修饰成为一个测试方法。 Test(exceptedXX.class) Test(exceptedArithmeticException.class):预期被测方法是否抛出ArithmeticException异常Test(timeout毫秒)BeforeClass:它…

velero备份k8s集群

流程图 velero备份原理 本地 Velero 客户端发送备份指令。Kubernetes 集群内就会创建一个 Backup 对象。BackupController 监测 Backup 对象并开始备份过程。BackupController 会向 API Server 查询相关数据。BackupController 将查询到的数据备份到远端的对象存储。 velero的…

【深度学习】pytorch——Tensor(张量)详解

笔记为自我总结整理的学习笔记,若有错误欢迎指出哟~ pytorch——Tensor 简介创建Tensortorch.Tensor( )和torch.tensor( )的区别torch.Tensor( )torch.tensor( ) tensor可以是一个数(标量)、一维数组(向量)、二维数组&…

EasyExcel动态复杂表头导出方法

目录 需求分析解决方案数据问题数据导入 需求分析 公司数据比较特殊有一部分数据需要动态修改导致信息导入时表头是不确定的,但其中又有一部分表头是固定的,如下图所示,如果表头全部是固定的话可以通过EasyExcel实体类的注解很轻松的解决&am…

Linux CentOS7.9安装OpenJDK17

Linux CentOS7.9安装OpenJDK17 一、OpenJDK下载 清华大学开源软件镜像站 国内的站点,下载速度贼快 二、上传解压 文件上传到服务器后,解压命令: tar -zxvf jdk-xxxx-linux-x64.tar.gz三、配置环境 export JAVA_HOME/home/local/java/j…

ffmpeg mp3截取命令,视频与mp3合成带音频视频命令

从00:00:03.500开始截取往后长度到结尾的mp3音频(这个更有用,测试好用) ffmpeg -i d:/c.mp3 -ss 00:00:03.500 d:/output.mp3 将两个音频合并成一个音频(测试好用) ffmpeg -i "concat:d:/c.mp3|d:/output.mp3&…

Linux C语言进阶-D10指针数组

指针变量构成的数组 理解下面printf中的a和p的表示,其中p[0]、p[1]、p[2]表示存储的a,a1和a2这几个地址,而再加个*,相当于对地址解引用,从而得到数组中的值。 如下图,要想得到a[0][1]的值可以直接打印a[0][1]&#xf…

使用pytorch处理自己的数据集

目录 1 返回本地文件中的数据集 2 根据当前已有的数据集创建每一个样本数据对应的标签 3 tensorboard的使用 4 transforms处理数据 tranfroms.Totensor的使用 transforms.Normalize的使用 transforms.Resize的使用 transforms.Compose使用 5 dataset_transforms使用 1 返回本地…

YOLOv5:修改backbone为SPPCSPC

YOLOv5:修改backbone为SPPCSPC 前言前提条件相关介绍SPPCSPCYOLOv5修改backbone为SPPCSPC修改common.py修改yolo.py修改yolov5.yaml配置 参考 前言 记录在YOLOv5修改backbone操作,方便自己查阅。由于本人水平有限,难免出现错漏,敬…

一文读懂最小相位滤波器和线性相位滤波器

一文读懂最小相位滤波器和线性相位滤波器 1. 举例说明2. 最小相位定义2.1 最小相位多项式2.2 最大相位滤波器2.3 最小相位意味最快的衰减2.4 最小相位/全通分解 3. 建立最小相位系统 前一篇博客 《一文读懂滤波器的线性相位,全通滤波器,群延迟》 详细解…

curl(二)HTTP协议和头

一 HTTP协议相关 ① 强制发出请求的http1.0 7.29 版本默认是http1.1 ② 查看当前curl版本是否支持http2 方式2: curl --version看Features 补充: 7.33.0 版本才引入 http2,才能使用curl发出http2.0版本的请求 ③ 强制发送http3 说明: 了解即可 二…

DevChat:超越编码的未来 - 优势、安装、使用、以及未来前景

目录 前言1 DevChat的优势1.1 精确的上下文控制1.2 灵活的提示管理1.3 上下文构建1.4 提前准备好的提示模板1.5 高级命令控制 2 安装DevChat插件3 使用DevChat插件3.1 代码生成3.2 文档撰写3.3 解释代码3.4 解决问题3.5 版本控制 4 DevChat的未来前景结语 前言 在软件开发领域…

Docker 多阶段构建的原理及构建过程展示

Docker多阶段构建是一个优秀的技术,可以显著减少 Docker 镜像的大小,从而加快镜像的构建速度,并减少镜像的传输时间和存储空间。本文将详细介绍 Docker 多阶段构建的原理、用途以及示例。 Docker 多阶段构建的原理 在传统的 Docker 镜像构建…

阿里面试:让代码不腐烂,DDD是怎么做的?

说在前面 在40岁老架构师 尼恩的读者交流群(50)中,最近有小伙伴拿到了一线互联网企业如阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格,遇到很多很重要的面试题: 谈谈你的高并发落地经验? 谈谈你对DDD的理解&#xf…