Java 是值传递还是引用传递,又是怎么体现的?

embedded/2024/12/22 9:37:09/

一、基本概念

值传递是指在方法调用时,将实际参数的值复制一份传递给方法的形式参数。对形式参数的修改不会影响实际参数的值。

引用传递则是将实际参数的引用(内存地址)传递给方法的形式参数,在方法中对形式参数所指向的对象进行修改会影响到实际参数所指向的对象。

二、Java 中的体现

  1. 基本数据类型参数传递
    • 当把一个基本数据类型(如 int、double、char 等)作为参数传递给方法时,是值传递。
    • 例如:

java

     public class ValuePassingExample {public static void main(String[] args) {int num = 10;changeValue(num);System.out.println(num); // 输出仍然是 10}public static void changeValue(int value) {value = 20;}}

  • 在这个例子中,把 num 的值 10 传递给了 changeValue 方法的参数 value。在 changeValue 方法中,虽然将 value 的值改为了 20,但这并不会影响到 main 方法中的 num。因为这里只是将 num 的值复制了一份传递给了 value,对 value 的修改不会影响到 num
  1. 引用数据类型参数传递
    • 当把一个引用数据类型(如对象、数组等)作为参数传递给方法时,实际上传递的是对象的引用(内存地址)的值。但从本质上来说,仍然是值传递。
    • 例如:

java

     class Person {String name;public Person(String name) {this.name = name;}}public class ReferencePassingExample {public static void main(String[] args) {Person person = new Person("Alice");changePerson(person);System.out.println(person.name); // 输出可能是 Bob}public static void changePerson(Person p) {p.name = "Bob";}}

  • 在这个例子中,把 Person 对象的引用传递给了 changePerson 方法的参数 p。在 changePerson 方法中,通过 p 引用修改了对象的 name 属性。在 main 方法中输出 person.name 时,发现其值被改变了。这并不是因为引用传递,而是因为两个引用(person 和 p)指向了同一个对象。在方法中通过引用修改了对象的内容,但如果在方法中重新给引用赋值,指向一个新的对象,那么原引用(在 main 方法中的引用)不会受到影响。
  • 例如:

java

     class Person {String name;public Person(String name) {this.name = name;}}public class ReferencePassingExample {public static void main(String[] args) {Person person = new Person("Alice");changePerson(person);System.out.println(person.name); // 输出仍然是 Alice}public static void changePerson(Person p) {p = new Person("Bob");}}

  • 在这个修改后的例子中,在 changePerson 方法中重新给 p 赋值为一个新的 Person 对象,但这并不会影响到 main 方法中的 person 引用。因为这里只是把 p 指向了一个新的对象,而 person 仍然指向原来的对象。

综上所述,Java 中只有值传递,无论是基本数据类型还是引用数据类型,都是将实际参数的值复制一份传递给方法的形式参数。对于引用数据类型,虽然传递的是对象的引用,但对引用的操作本质上还是值传递的体现。


http://www.ppmy.cn/embedded/111632.html

相关文章

PhpStudy下载安装使用学习

一、官网下载 官网地址:Windows版phpstudy下载 - 小皮面板(phpstudy)https://old.xp.cn/download.html 【首页】选择Windows版,进行下载 下载完成是一个压缩包的形式,解压得到一个.exe的执行文件,点击执行安装程序(注…

【中国国际航空-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 1. 暴力破解密码,造成用户信息泄露 2. 短信盗刷的安全问题,影响业务及导致用户投诉 3. 带来经济损失,尤其是后付费客户,风险巨大,造…

94 、k8s之rbac

一、rbac----安全机制 赋权机制 集群是按照用户名进行登录,按照项目名称进行命名空间的分类。 配电云主站------62天 8个人 高温补贴 一主2从 user pdyzz pdyzz -n pdyzz 资源空间 pod数量 1.1、k8s的安全机制: apiserver------>集群内和外…

学习Vue3的第五天

目录 API对比 shallowRef 与 shallowReactive 对比总结 使用场景 总结 readonly 与 shallowReadonly 对比总结 使用场景 总结 toRaw 与 markRaw 对比总结 使用场景 总结 customRef 应用场景 总结 示例:异步数据获取 Vue3新组件 Teleport Suspen…

【基础算法总结】前缀和

目录 一,前缀和算法介绍二,算法原理和代码实现【模板】前缀和【模板】二维前缀和724.寻找数组的中心下标238.除自身以外数组的乘积560.和为k的子数组974.和可被k整除的子数组525.连续数组1314.矩阵区域和 三,算法总结 一,前缀和算…

如何利用 CSS 渐变实现多样化背景效果

前言 总在平常看到像这样的图片 背景是如何实现的呢 背景效果的多样性和美观性直接影响用户体验。CSS 渐变为设计师提供了一种强大且灵活的方法来创建引人注目的背景。渐变是颜色之间平滑过渡的效果,通过调整渐变类型和设置,你可以轻松实现从简单到复杂…

Javascript 如何检查两个给定的线段是否相交(How to check if two given line segments intersect)

给定两条线段(p1, q1)和(p2, q2),判断给定的线段是否相交。 在讨论解决方案之前,让我们先定义方向的概念。平面中有序点三元组的方向可以是 –逆时针 –顺时针 –共线 下图显示了(a,b,c) 的不同可能方…

[杂项]pugi::xml获取xml中的注释节点

前言 想到学习xml时的一句话&#xff0c;xml中注释也会被算作一个节点。那么我们就可以通过 pugixml 把注释节点获取出来&#xff0c; <?xml version"1.0"?> <mesh name"mesh_root"><!--这是一个注释节点-->some text<![CDATA[so…