Java传参:值传递 or 引用传递 ?
刚开始学Java的时候一度以为:基本数据类型是值传递,引用类型是引用传递。新人很容易在这两个概念上面被搞糊涂,后来看了Hollis的文章才明白了Java中只有值传递。
接下来我能用简单明了的方式来说明这一问题,希望能对刚学习Java的朋友有点帮助。
1.概念
值传递:值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
引用传递:在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
值传递的概念没啥说的,修改复制文件不会影响到源文件,最容易产生歧义的就在这个引用传递上。理解上面两句话的关键在于两句话的前半段中是否有复制。
可以理解为有复制的就是值传递,无论复制的是值还是地址值。接下来我们依次探讨Java中传递基本类型和应用类型的过程。
2.传递基本数据类型
代码:
public static void main(String[] args) {
int i = 2;
add(i);
System.out.println("i = "+i);
}
public static void add(int x){
x += 1;
System.out.println("x = "+x);
}

通过代码和输出结果可以看出来,这就是值传递。

i 把值复制一份给了 x ,再修改x的值无法影响 i 的值
3.传递引用类型
代码:
public static void main(String[] args) {
Person p1 = new Person("张三", 18);
change(p1);
System.out.println("p1地址:"+p1);
System.out.println("p1姓名:"+p1.getName());
System.out.println("p1年龄:"+p1.getAge());
}
public static void change(Person p2){
p2.setAge(28);
System.out.println("p2地址:"+p2);
System.out.println("p2姓名:"+p2.getName());
System.out.println("p2年龄:"+p2.getAge());
}
结果:

单从结果来看,可能就会有人误以为这是引用传递。
我们再来详细说说堆栈中是如何运作的:

我们再来看一个案例:
public static void main(String[] args) {
Person p1 = new Person("张三", 18);
change(p1);
System.out.println("p1地址:"+p1);
System.out.println("p1姓名:"+p1.getName());
System.out.println("p1年龄:"+p1.getAge());
}
public static void change(Person p2){
p2 = new Person("李四",20);
System.out.println("p2地址:"+p2);
System.out.println("p2姓名:"+p2.getName());
System.out.println("p2年龄:"+p2.getAge());
}
结果:

此时p1的值就没有受到change方法的影响

由此可见,虽然对象中的数据可变,但是p1存的地址值是不会被change方法更改,即使传递引用对象,仍然是值传递。
如有错误欢迎指正!
Java传参:值传递 or 引用传递 ?的更多相关文章
- Java传参-基本数据类型和引用数据类型作为参数的区别(值传递)
java中的方法可以传递参数,参数的传递方法就是值传递. 参数有形参和实参,定义方法时写的参数叫形参,真正调用方法时,传递的参数叫实参. 调用方法时,会把实参传递给形参,方法内部其实是在使用形参. 所 ...
- JAVA不可变类与可变类、值传递与引用传递深入理解
一个由try...catch...finally引出的思考,在前面已经初步了解过不可变与可变.值传递与引用传递,在这里再次深入理解. 1.先看下面一个try..catch..finally的例子: P ...
- java 传参方式--值传递还是引用传递
java 传参方式--值传递还是引用传递 参数是按值而不是按引用传递的说明 Java 应用程序有且仅有的一种参数传递机制,即按值传递.写它是为了揭穿普遍存在的一种神话,即认为 Java 应用程序按引用 ...
- 对象引用 方法传参 值传递 引用传递 易错点 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 理解java值传递与引用传递
1.基本类型和引用类型在内存中的保存 Java中数据类型分为两大类,基本类型和对象类型.相应的,变量也有两种类型:基本类型和引用类型.基本类型的变量保存原始值,即它代表的值就是数值本身:而引用类型的变 ...
- Java调用函数传递参数到底是值传递还是引用传递
今天翻看微信上有关Java技术的公众号时,看到了一篇关于Java中值传递的问题,文章讨论了在Java中调用函数进行传参的时候到底是值传递还是引用传递这个面试时会问到的问题.之前也接触过类似的问题,但只 ...
- java中的值传递和引用传递区别
值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响 ...
- Java中到底是值传递还是引用传递?
Java中到底是值传递还是引用传递? 我们先回顾一下基本概念 实参和形参 参数在编程语言中是执行程序需要的数据,这个数据一般保存在变量中.在Java中定义一个方法时,可以定义一些参数, 举个例子: p ...
- 188W+程序员关注过的问题:Java到底是值传递还是引用传递?
在逛 Stack Overflow 的时候,发现了一些访问量像阿尔卑斯山一样高的问题,比如说这个:Java 到底是值传递还是引用传递?访问量足足有 188万+,这不得了啊!说明有很多很多的程序员被这个 ...
- Java只有值传递(Java值传递还是引用传递?)
转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10830521.html 一:区分Java数据类型.变量类型 Java数据类型分两种:基本数据类型.引用类型. ...
随机推荐
- 通过修改etcd来设置或修改节点flannel子网信息
在首次启动flannel服务的时候可以手动指定subnet.env文件,配置所在节点的flannel子网网段,如果不指定配置文件,flannel将自动分配一个子网网段并生成配置文件 /var/run/ ...
- Gitlab 快速部署及日常维护 (一)
一.GitLab简介GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务 二.GitLab系统架构git用户的主目录通常是/home/git(~ ...
- Spring框架整合Mybatis项目
第一步:导入相关依赖jar包 <dependency> <groupId>org.mybatis</groupId> <artifactId>mybat ...
- Steam 钓鱼模拟器
Steam 钓鱼模拟器 Fishing Planet Fishing Planet 是一个独特和高度现实的在线第一人称多人钓鱼模拟器,由狂热的钓鱼爱好者钓鱼给你带来实际钓鱼充分刺激开发! 选择你的诱饵 ...
- vue watch route params change
vue watch route params change watch: { '$route.params.menuKey' (val, oldVal) { console.log('new rout ...
- 2020 Google 开发者大会
2020 Google 开发者大会 Google Developer Summit https://developersummit.googlecnapps.cn/ Flutter | Web | M ...
- bash shell cli tools
bash shell cli tools before # create files $ mkdir app-component $ cd app-component $ touch index.ht ...
- WEB 用视频替换GIF动画
原文 download ffmpeg gif to video 转化后文件大小大大降低 $ ffmpeg -i my-animation.gif -b:v 0 -crf 25 -f mp4 -vcod ...
- 以NGK 呼叫河马为例分析智能合约漏洞在哪?
合约交易是指买方和卖方根据约定,在未来某一时刻,以指定价格接受某一资产的协议. 合约是买卖双方之间权利义务的表现形式.合约交易是一种金融衍生工具,与现货市场相比,用户通过判断期货合约交易的涨跌,选择买 ...
- TERSUS无代码开发(笔记06)-简单实例手机端页面设计
手机端的设计 1.页面说明 2.默认页面===>提交请假单(上面页面双击进入,页面主要编辑区) 2.1默认页面===>提交请假单===>头部区(页面部份主要编辑区01) 2.1.1默 ...