Java的参数传递是「按值传递」还是「按引用传递」?

Java 中的参数传递是按值还是按引用? Java 中,所有方法参数都是值传递。String的不可变性进一步确保了它的原始值不会被修改。理解String的不可变性和值传递的机制,有助于更好地编写和调试代码。类型传递方式方法内操作对原变量的影响基本数据类型值传递不会影响原变量不可变类引用值的副本传递不会影响原变量可变引用类型引用值的副本传递可能通过引用修改原变量指向对象的内部状态。 阅读详情

当一个对象被当作参数传递到一个方法后,在此方法内可以改变这个对象的属性,那么这里到底是「按值传递」还是「按引用传递」? 
  答:是按值传递。Java 语言的参数传递只有「按值传递」。当一个实例对象作为参数被传递到方法中时,参数的值就是该对象的引用的一个副本。指向同一个对象,对象的内容可以在被调用的方法内改变,但对象的引用(不是引用的副本) 是永远不会改变的。

 

Java的参数传递,不管是基本数据类型还是引用类型的参数,都是按值传递,没有按引用传递!

 我们可以看一下microsoft的文档中对按引用传递参数的定义(如下截图):

 

1、基本数据类型的参数

先来看一下基本数据类型的参数按值传递的例子:

TransferTest.java

public class TransferTest {
    public static void main(String[] args) {
        int num = 1;
        System.out.println("changeNum()方法调用之前:num = " + num);
        changeNum(num);
        System.out.println("changeNum()方法调用之后:num = " + num);
    }

    public static void changeNum(int x) {
        x = 2;
    }
}

运行结果:

 

这个传递过程的示意图如下:

num作为参数传递给changeNum()方法时,是将内存空间中num所指向的那个存储单元中存放的值1传递给了changeNum()方法中的x变量,而这个x变量也在内存空间中分配了一个存储单元,这个时候,就把num的值1传递给了x的这个存储单元中。此后,在changeNum()方法中对x的一切操作都是针对x所指向的这个存储单元,与num所指向的那个存储单元没有关系了!

所以,在changeNum()方法调用之后,num所指向的存储单元的值还是没有发生变化,这就是所谓的“按值传递”!按值传递的精髓是:传递的是存储单元中的内容,而不是存储单元的引用!

 

2、引用类型的参数

同样,先看一个例子:

TransferTest2.java  

1 public class TransferTest2 {
 2     public static void main(String[] args) {
 3         Person p1 = new Person();
 4         System.out.println(p1);
 5         change(p1);
 6         System.out.println(p1);
 7     }
 8 
 9     public static void change(Person p2) {
10         p2 = new Person();
11     }
12 }
13 
14 /**
15  * Person类
16  */
17 class Person {
18 
19 }

  

运行结果:

 

可以看出两次打印person的地址值是一样的,即调用完change() 方法之后,person变量并没有发生改变。

 

这个传递过程的示意图如下:

 

当执行到第3行代码时,程序在堆内存中开辟了一块内存空间用来存储Person类的实例对象,同时在栈内存中开辟了一个存储单元用来存储该实例对象的引用,即上图中person指向的存储单元。

当执行到第5行代码时,person作为参数传递给change()方法,需要注意的是:person将自己存储单元的内容传递给了change()方法的p变量!此后,在change()方法中对p的一切操作都是针对p所指向的存储单元,与person所指向的那个存储单元没有关系了!

Java参数传递:值传递还是引用传递? Java中的参数传递方式是一个常见但容易混淆的概念。Java采用的是值传递,而不是引用传递。在值传递中,方法接收的是变量的副本,而不是原始变量本身。对于基本数据类型,方法内部的修改不会影响原始变量;对于对象引用,虽然传递的是引用的副本,但修改对象属性会影响原始对象,而重新赋值引用则不会影响原始引用。理解这一点对于正确编写Java代码至关重要。为避免混淆,可以使用包装类来实现类似引用传递的效果。 阅读详情

相关推荐

WRF模式学习入门基础(建议收藏!!!)

本文详细介绍了WRF-ARW(Advanced Research WRF)模式的结构组成,重点讲解了前处理系统(WPS)和主模式中的各个关键程序的功能与流程。通过对geogrid、ungrib、metgrid、real和wrf等模块的逐步解析,帮助初学者全面理解数值天气预报模型在初始化和运行过程中所需的关键步骤。

2503_90234341的博客 3081

Java中的参数传递,到底是值传递还是引用传递?(*)

参数传递

weixin_42408447的博客 5090

VCSA安装使用和虚拟机数据迁移

VCSA(VMware vCenter Server Appliance)安装使用和虚拟机数据迁移是VMware虚拟化环境中常见的操作。准备工作:首先,确保已从VMware官网下载了正确版本的VCSA安装包。此外,应准备好安装所需的硬件资源,包括足够的CPU、内存和存储空间。安装过程:安装VCSA通常涉及挂载虚拟光驱或解压安装包,然后选择安装并输入相关信息,如ESXi主机的IP地址、用户名和密码,VCSA的虚拟机名称和root密码等。

weixin_68840588的博客 3377

Java的参数传递是值传递还是引用传递!

当一个对象被当作参数传递到一个方法后,在此方法内可以改变这个对象的属性,那么这里到底是值传递还是引用传递?  答:是值传递。Java 语言的参数传递只有值传递。当一个实例对象作为参数被传递到方法中时,参数的值就是该对象的引用的一个副本。指向同一个对象,对象的内容可以在被调用的方法内改变,但对象的引用(不是引用的副本) 是永远不会改变的。 Java的参数传递,不管是基本数据类型还是引用类型...

weixin_30265171的博客 282

MySQL连接异常:Communications link failure 解决方案

困扰一晚上的问题终于解决了。

weixin_44704776的博客 1086

PCRNet: Point Cloud Registration Network using PointNet Encoding

PCRNet算是在ModelNet40这种object-centric数据集上用deep-learning做配准最好入手的一篇文章了,整体架构涉及简洁明了,一句话描述就是简单粗暴,话不多说,直接上网络架构图: Work Flow: 首先对输入source (N×3N \times 3N×3)与template (M×3M \times 3M×3)进行PointNet操作,即MLP + max-pooling后,分别得到描述各自点云的维度为1024的global feature vector:Φ(PS).

dloading7的博客 1648

Stack Overflow上188万浏览量的提问:Java 到底是值传递还是引用传递?

在逛 Stack Overflow 的时候,发现了一些访问量像阿尔卑斯山一样高的问题,比如说这个:Java 到底是值传递还是引用传递?访问量足足有 188万+,这不得了啊!说明有很多很多...

程序员入门进阶 2088

SR-IOV 网卡虚拟化技术

目录 文章目录目录PCI 与 PCIe 设备SR-IOV在 KVM 中启用 SR-IOV 网卡手动挂载 VF 到虚拟机指令方式挂载SR-IOV 的数据包分发机制 PCI 与 PCIe 设备 PCI(Peripheral Component Interconnect,外设组件互连):符合 PCI 总线标准的设备就被称为 PCI 设备,PCI 总线架构中可以包含多个 PCI 设备。 PCIe(Per......

烟云的计算 7300

Java方法调用到底是值传递还是引用传递

Java中只有值传递,没有引用传递这个概念

CharlesYan的博客 1529

Camunda 7.x 系列【67】实战篇之撤销流程

撤销流程 即撤销当前已发起的流程实例。这是一个常见的需求,Camunda本身不提供直接的方法来撤销正在执行的流程,需要自定义处理逻辑。

记录知识、锤炼自我 1379

由ip地址和子网掩码求网络号、主机号、广播地址(超详细)

1、用二进制数表示IP地址   在进行计算之前,我们首先要学会十进制的IP地址怎么转换为二进制的IP地址。   给出一个例子: 十进制:172.16.25.3 二进制:10101100.00010000.00011001.00000011 1、如果两台主机的网络号相同,我们就说它们是同一网段 2、主机号的意义 - 1)主机号部分全变成1,即为该网段的广播地址 - 2)主机号部分全变成0,即为该网段的网路地址(网络号) 3、如果主机号部分为x位,则该网络能容纳最大主机数为: 2的x次方-2。减2

爱吃雪糕的小布丁的博客 9万+

java中的方法

方法 方法就是将一堆实现某个功能的代码封装在一起,方便重复调用 方法的创建 无参方法 public static void 方法名() { //内容 } 有参方法 public static void 方法名(参数类型 参数名) { //内容 参数可以多个 } 方法有返回值类型,void表示不需要数据返回,如果返回值类型是其他的类型,方法就必须返回一个该类型的数据,否则报错。 方法的调用直接 方法名() 即可 方法重载 同一个类中的有同名的方法,但是参数不同或者参数类型不同或者参数个数不同,

weixin_44630828的博客 845

基于Python的CT骨料图像分割与STL批量导出完整指南

本文介绍了一套完整的Python解决方案,用于CT骨料图像的分割与STL导出。针对CT图像中颗粒粘连、噪声伪影等技术难点,提出基于分水岭算法的分割策略,结合距离变换与标记控制实现颗粒分离。内容包括环境配置、数据读取与预处理、Otsu阈值分割、分水岭算法实现、表面提取与STL导出等关键步骤。教程提供详细代码及解释,帮助读者从CT体数据出发,最终生成每个颗粒的三维网格文件,便于后续定量分析和数值模拟。

huanghm88的专栏 240

java 参数 按值传递_Java的参数传递是「按值传递」还是「按引用传递」?

JAVA传递的只有值,.传递的都是栈里的的值,只是有些栈里面的是值.有的是内存地址.(原文传递的都是栈里的的值有误,局部变量在栈中,成员变量在堆中,类变量(静态变量和常量)在方法区中,可以看做本文的变量都是main方法下的变量)基本类型的栈 是它的本身. 传递时.传递的是本身的副本.所以对副本修改原响不了本身引用类型的栈 是一个内存地址.传递时..传递的是内存地址的副本..原内存地址与副本都指向同...

weixin_29300931的博客 139

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

java 参数传递 引用_Java的参数传递是「按值传递」还是「按引用传递」?

Java 编程语言中最大的困惑之一就是: java 是按值传递还是按引用传递。我在面试中经常会问面试者这个问题,但还是有很多面试者对这个问题的理解不是很正确。有很多面试者是这样理解的:如果传递类型为基础数据类型,则按值传递,如果传递类型为类,则按引用传递。这样的理解正确吗?他们甚至还可以写出示例代码来验证他们的想法,让我们来一起看一看大多数人是如何验证“基础类型按值传递,非基础类型按引用传递”这个...

weixin_42367522的博客 147

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

java是引用传递还是值传递_Java的参数传递是「按值传递」还是「按引用传递」?...

当一个对象被当作参数传递到一个方法后,在此方法内可以改变这个对象的属性,那么这里到底是「按值传递」还是「按引用传递」?  答:是按值传递。Java 语言的参数传递只有「按值传递」。当一个实例对象作为参数被传递到方法中时,参数的值就是该对象的引用的一个副本。指向同一个对象,对象的内容可以在被调用的方法内改变,但对象的引用(不是引用的副本) 是永远不会改变的。Java 的参数传递,不管是基本数据类型还...

weixin_39605463的博客 82

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Java中的参数传递,到底是值传递还是引用传递?

Java中的参数传递,到底是值传递还是引用传递? 错误理解一:值传递和引用传递,区分的条件是传递的内容,如果是个值,就是值传递。如果是个引用,就是引用传递。 错误理解二:Java是引用传递。 错误理解三:传递的参数如果是普通类型,那就是值传递,如果是对象,那就是引用传递。

iqqcode 1万+

函数中的参数如何传递?什么是按值传递和按引用传递?

然而,这种机制也引入了“副作用”(side effects)的风险,即函数的执行可能会改变程序中其他部分的状态,这可能使代码的推理和调试变得更加复杂。当传递一个指针时,传递的同样是指针变量本身的值(即内存地址)的副本。从C/C++的底层控制,到Java和Python基于对象引用的模型,再到Go的统一值传递哲学,以及Rust革命性的所有权和借用系统,每种语言都根据其设计目标在效率、安全性、简洁性和表达力之间做出了不同的权衡。:当一个变量以按引用传递的方式传递给函数时,系统传递的不是值的副本,而是该变量的。

破损的天堂鸟博客 1159

Java是“按引用传递”还是“按值传递”?

我一直认为Java是通过引用传递的 。 但是,我已经看到一些博客文章(例如this blog )声称不是。 我不认为我能理解他们的区别。 有什么解释?

asdfgh0077的博客 351

浅析按值传递与按引用传递

请看一道选择题下列关于按值传递与按引用传递的描述中,正确的是( )。A.按值传递不会改变实际参数的数值 B.按引用传递能改变实际参数的参考地址C.按引用传递能改变实际参数的内容 D.按引...

田维常 975

Java中的参数传递机制:值传递与引用传递的真相

详细介绍了Java的参数传递机制是基于值传递还是引用传递。

2201_75353178的博客 1707

Java的参数传递是按值传递还是按引用传递

Java的参数传递是按值传递还是按引用传递 当一个对象被当作参数传递到一个方法后,在此方法内可以改变这个对象的属性,那么这里到底是按值传递还是按引用传递? 答:是按值传递。 Java 语言的参数传递只有按值传递。 当一个实例对象作为参数被传递到方法中时,参数的值就是该对象的引用的一个副本。指向同一个对象,对象的内容可以在被调用的方法内改变,但对象的引用(不是引用的副本) 是永远不会改变的。 J...

jamesluozhiwei的博客 254

Java的参数传递是「值传递」还是「引用传递」?

关于Java传参时是引用传递还是值传递,一直是一个讨论比较多的话题。 有人说Java中只有值传递,也有人说值传递和引用传递都是存在的,比较容易让人产生疑问。 关于值传递和引用传递其实需要分情况看待。 一、Java数据类型 我们都知道,Java数据类型分为「基本数据类型」和「引用类型」两大类。 基本数据类型(8种) 引用类型(3种)   引用类型可分为类引用类型(类)、接口引用类型(接...

AlbenXie的博客 1320
上一篇: Elasticserach6.3.2+logstash6.3.2+kibana6.3.2
下一篇: Spring 无法获取注解Bean原因分析
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值