Java的参数传递
创始人
2025-05-31 00:35:35

最近一直疑惑一个问题,Java函数传递的形参会影响实参的值吗,听到网上很多说法,有的说java只有值传递,有的说java有值传递和引用传递,很迷糊。其实没有这么复杂,值传递、址传递、引用传递这些是c/c++中的概念,Java中甚至不用考虑这些专属名词。

比较重要的就是了解JVM的内存机制,基本数据类型是存放到栈中的,引用数据类型是存在栈中的引用,指向存在堆中的实际对象(引用就是堆中对象的地址)。

1.基本数据类型作为参数传递

参数传递基本数据类型时,形参不会改变实参,因为不同的函数在栈中存放的地址不同,形参是栈中对实参的拷贝,所以不会改变值。这个比较简单就不谈了。
直接上代码进行测试:

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

运行结果为:

changNum方法调用之前的num值1
changNum方法中的num值2
changNum方法调用之后的num值1

显然实参和形参是两个不一样的东西,而且方法内形参的改变没有影响实参。
如图所示:基本数据类型是不存放在堆里的,实参传递给形参是弄一个新的副本给changeNum函数所在栈的区域,两个不同栈地址的num当然不会相互影响
在这里插入图片描述

2.引用数据类型作为参数传递

上面说到了引用数据类型是栈里的一个引用指向堆中的地址,我们以字符串为例子:

String abc = new String(“abc”);

在内存中的情况大概就是:
在这里插入图片描述

引用类型作为参数传递时,因为是栈中的两个方法,所以传递的引用也处于栈的不同位置,但是他们记录的堆中的地址是同一个,上代码:

public class text {public static void main(String[] args) {User user = new User();user.age = 1;System.out.println("change方法调用前user的age值为"+user.age);change(user);System.out.println("change方法调用后user的age值为"+user.age);}public  static   void change (User user){user.age =2;System.out.println("change方法中user的age值为"+user.age);}
}class User{public int age;User(){}User(int a){this.age =a;}
}

运行结果为:

change方法调用前user的age值为1
change方法中user的age值为2
change方法调用后user的age值为2

此时user对象中的age已经变了,内存情况大概是这样:

在这里插入图片描述
因为两个引用指向的是一个堆中的对象,所以当然值就发生改变了。
如果此时,在change方法中,把形参这个引用再指向一个新new的User对象呢,能影响实参的User吗?

public  static   void change (User user){user = new User(2)System.out.println("change方法中user的age值为"+user.age);}

运行结果:

change方法调用前user的age值为1
change方法中user的age值为2
change方法调用后user的age值为1

因为此时指向的堆中的对象,已经不是同一个了:
在这里插入图片描述

所以当然没有影响实参

最后声明下,图里的地址都是我瞎编的哈,知道他们不一样就行了。

相关内容

热门资讯

【微服务】—— Nacos设计... 文章目录一、简介Nacos起源Nacos 定位Nacos 优势二、Nacos 总体设计1࿰...
axios 请求其他服务器地址... 场景还原: Vue2项目中在生产环境调用其他服务器请求地址时候会在请求地址默认加上一串当前浏览器域...
一斤便宜10元还要降?榴莲可以... 最近几年,各种知名水果的价格可以说都出现了比较大的变化,特别是最近榴莲的价格持续下降,甚至还有降价的...
图解redis对象(hash ... 哈希表 哈希对象的编码可以是ziplist或者hashtable 条件 ·哈希对象保存的所有键值对的...
C语言再学习 -- C 标准库... 参看:C 标准库 - stdlib.h C 标准库 - 简介 stdlib .h 头...
欧佩克+连续第三次大幅增产,油... 欧佩克连续第三次大幅增产,这一举措无疑给油价带来了巨大压力,恐使其承压下跌。欧佩克作为全球重要的石油...
python 安装包相关命令 查看匹配的版本(大小写敏感)pip -V 查询已经安装了的包,并可以显示相应的版本&...
“2025外贸优品中华行——天... 中新网天津5月31日电 (记者 王君妍)31日,“2025外贸优品中华行—天津站”活动正式启幕。本次...
基于SpringBoot+Vu... 您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦。 &#...
网络技巧|远程桌面连接不上的多... 写在前面的话专注于网络各种技巧和实用工具的分享,都是日常工作中遇到的大大小小问题记录下...
IM即时通讯软件系统源码安卓、... demo软件园每日更新资源,请看到最后就能获取你想要的: ​ 1.《计算机系统结构:解...
讲解一下关于MySQL数据库的... 对于数据库,市面上有着不少的数据库!比如:Oracle数据...
3.1.2数据库体系结构:分布... 3.1.2数据库体系结构:分布式数据库、分布式数据库特点、分布式数据库结构、数据分片、...
学习streamlit-6 系列目录 学习streamlit-1,简介学习streamlit-2,s...
冒泡 VS 插入 VS 选择—... 文章目录什么样的“排序算法”更加优质?排序算法的执行效率排序算法的内存消耗排序算法的稳...
Python 多线程 文章目录一、简介1.1 多线程的特性1.2 GIL二、线程1.2 单线程1.3 多线程三、线程池3....
基于树莓派实现超声波测距 目录 一,写在前面 二,超声波模块说明 ● 模块基本参数 ● IO口接线...
Linux(网络基础---数据... 文章目录0. 前言1. 以太网的帧格式2. 再谈局域网原理3. 汇总整体通信流程,补全...
瑞萨Renesas RA2L1... 前言(1)首先感谢 李肯前辈的活动,从而申请到了RA2L1...
在 Python 中如何删除指... 文章目录删除字符后的所有内容,保留分隔符删除最后一次出现的字符后的所有内容删除最后一次...
如何将字符串反转? 参考答案 使用 StringBuilder 或 StringBuffer 的 reverse 方法&...
初级指针的简单介绍 目录 1.什么是指针? 2.指针和指针类型 2.1指针+-整数 2.2指针的解...
常见的CMS后台getshel... 目录 WordPress dedecms aspcms 南方数据企业系统 phpmyadmin日志 ...
CVPR 2023 | 旷视研... 近日,CVPR 2023 论文接收结果出炉。近年来,CVPR 的投稿数量...
【Linux】进程的概念--程... 语言级别的地址以前我们在学习C语言指针的时候,会打印地址,会有内存级别的...
ChatGPT重量级对手产品:... 什么是ClaudeClaude是下一代人工智能助手,基于 Anthropic 对训练有...
全球与中国乳胶防水涂料市场规模... 全球与中国乳胶防水涂料市场规模预测及未来动向前瞻报告2025-2031年 【全新修订】:2025年...
外国剁手党们,催着中国电商集体... 文 | 潮汐商业评论 同欧美的朋友喜欢催更新中国霸道总裁等短剧一样,海外的剁手党们也爱装满来自中国...
nginx快速入门.跟学B站n... nginx快速入门.跟学B站nginx一小时精讲课程笔记nginx简介及环境准备nginx简介环境准...
C++ static静态成员变... 对象的内存中包含了成员变量,不同的对象占用不同的内存,这使得不同对象的成...