弄懂Java为何只有值传递
最近有同学问我关于Java中值传递与引用传递的问题,在此小结一下
值传递是指在函数调用时将实参内容复制一份传递给形参,这样在函数中改变该参数不会对原参数产生影响。
引用传递是指将对象地址的引用传递给该函数,这样在函数中改变该参数会对原参数产生影响。
两者的主要区别在于:是否将实参内容复制一份传递给了形参!
举个最简单的例子:
public class test {
public static void main(String[] args) {
int num = 10;
changeNum(num);
System.out.println(num);
}
public static void changeNum(int num){
System.out.println(num);
num = 20;
System.out.println(num);
}
}
运行结果如下: 都知道这是值传递,将实参内容10复制一份传递给了该函数,对原参数不产生影响。

这个例子开始犯迷糊,以为是传递该地址过去
public class test {
public static void main(String[] args) {
Person p1 = new Person();
p1.setName("张三");
p1.setSex("男");
changePerson(p1);
System.out.println(p1);
}
public static void changePerson(Person person){
person.setName("小花");
person.setSex("女");
}
}
public class Person {
private String name;
private String sex;
//省略了getter/setter/toString
}
运行结果如下:我同学在这里犯的迷糊,跟我说是引用传递

将test类的代码稍加修改加两行代码:
public class test {
public static void main(String[] args) {
Person p1 = new Person();
p1.setName("张三");
p1.setSex("男");
changePerson(p1);
System.out.println(p1);
}
public static void changePerson(Person person){
person = new Person();
person.setName("小花");
person.setSex("女");
System.out.println(person);
}
}
运行结果如下:可见并不是引用传递,如果是引用传递则两次输出结果都改为name=小花,sex=女了。

还是前面所说:两者的主要区别在于:是否将实参内容复制一份传递给了形参!
此处还是值传递,复制了实参内容,只不过实参内容是该对象的地址值,注意地址值也是值!
举个例子:你把你家的钥匙刻了一把给B,B拿着刻印的钥匙去你家打扫卫生,等你回来时发现家里变干净了,你家受到了影响,但你的钥匙并没有受到影响。
另一个容易对Java值/引用传递犯迷糊的例子:运行结果为:“abc”
public class test {
public static void main(String[] args) {
String s1 = "a"+"b"+"c";
changeStr(s1);
System.out.println(s1);
}
public static void changeStr(String str){
str+="d";
}
}
关于String类有一点特殊,它是不可变类,建议了解下我之前小结的搞定Java String面试题
关于字符串中的"+"号:Java有这么一串话:
java语言提供了字符串串联运算符特殊支持( + ),和其他对象转换为字符串。字符串连接是通过
StringBuilder实施(或StringBuffer)类及其append方法。字符串的转换是通过方法toString实施,由Object和继承的所有类的java。
所以该str+="d"等于String str = new StringBuffer(str).append("d").toString();
所以此处相当于新建了一个String对象。
弄懂Java为何只有值传递的更多相关文章
- Java中只有值传递,(及值传递与引用传递详解)
首先呢,我们来说一下值传递与引用传递的区别(这两个玩意儿实在调用函数的时候提到的) 比如说 code( a) code( int a ) code(a)是调用函数,a是我们原本函数的一个值类型,然后使 ...
- Java 参数的值传递和引用传递
在Java中,方法的参数的传递分为值传递(基本数据)和引用传递(引用数据:对象.字符串),这是最容易接受的.如果你能知道有这两种情况存在,那么,在遇到调用方法时,你可以避免很多问题的产生.但是,仔细查 ...
- 【转】彻底弄懂Java中的equals()方法以及与"=="的区别
彻底弄懂Java中的equals()方法以及与"=="的区别 一.问题描述:今天在用Java实现需求的时候,发现equals()和“==”的功能傻傻分不清,导致结果产生巨大的偏差. ...
- 死磕面试系列,Java到底是值传递还是引用传递?
Java到底是值传递还是引用传递? 这虽然是一个老生常谈的问题,但是对于没有深入研究过这块,或者Java基础不牢的同学,还是很难回答得让人满意. 可能很多同学能够很轻松的背出JVM.分布式事务.高并发 ...
- Java 中的值传递和参数传递
Java中没有指针,所以也没有引用传递了,仅仅有值传递不过可以通过对象的方式来实现引用传递 类似java没有多继承 但可以用多次implements 接口实现多继承的功能 值传递:方法调用时,实际参数 ...
- Java中的值传递和引用传递
这几天一直再纠结这个问题,今天看了这篇文章有点思路了,这跟C++里函数参数为引用.指针还是有很大区别. 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里 ...
- java是通过值传递,也就是通过拷贝传递——通过方法操作不同类型的变量加深理解(勿删)
head first java里写到“java是通过值传递的,也就是通过拷贝传递”,由此得出结论,方法无法改变调用方传入的参数.该怎么理解呢? 看例子: public class Test1 { pu ...
- Java中的值传递
1.先比较下字符串的比较 == 代表全等于 值和地址(存放地址) 全部相等于. equals 值等于== 和 equals的区别 列如下面的 如果name1==name2是等于的 然而name1==n ...
- 为什么说Java中只有值传递
本文转载自公众号 Hollis 对于初学者来说,要想把这个问题回答正确,是比较难的.在第二天整理答案的时候,我发现我竟然无法通过简单的语言把这个事情描述的很容易理解,遗憾的是,我也没有在网上找到哪篇文 ...
随机推荐
- Linux 下用C语言连接 sqlite
1.在 /home/ 新建一个文件夹名为 sqlite #cd /home #mkdir sqlite 2.编写C语言代码,名称为 sql.c,代码如下 // name: sql.c // This ...
- Python 竟能绘制如此酷炫的三维图
通常我们用 Python 绘制的都是二维平面图,但有时也需要绘制三维场景图,比如像下面这样的: 这些图怎么做出来呢?今天就来分享下如何一步步绘制出三维矢量(SVG)图. 八面体 我们先以下面这个八面体 ...
- powerdesigner16.6版本resource的重复使用
今天早上遇到想要重复使用resource ,但是发现powerdesigner16.6版本跟16.5版本有关重复使用name的设置已经不一样了,网上找了好久没找到,软件上找了好久也没找到相应的设置. ...
- 快速了解Python并发编程的工程实现(上)
关于我 一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android.Python.Java和Go,这个也是我们团队的主要技术栈. Github:https:/ ...
- idea打包失败时,强行打包
set target_jar="E:\handSight\fras\Jars" cd Jars del fras-.jar rem 拉取最新代码 call git pull ech ...
- vue-cli报错:Class constructor FileManager cannot be invoked without 'new'
bug:vue-cli3开发的项目,今天项目重新下载依赖启动项目的时候出现错误:Class constructor FileManager cannot be invoked without 'new ...
- PythonI/O进阶学习笔记_1.抽象、面向对象、class/object/type
前言: 是自己在学习python进阶IO学习视频的时候的理解和笔记,因为很多都是本菜鸟学习时候的自己的理解,有可能理解有误. Content: - 抽象的概念和面向对象的概念?想要大概了解python ...
- hdfs运行机制
hdfs:分布式文件系统 hdfs有着文件系统共同的特征: 1.有目录结构,顶层目录是: / 2.系统中存放的就是文件 3.系统可以提供对文件的:创建.删除.修改.查看.移动等功能 hdfs跟普通的 ...
- [Python] 数据结构--实现顺序表、链表、栈和队列
说明: 本文主要展示Python实现的几种常用数据结构:顺序表.链表.栈和队列. 附有实现代码. 来源主要参考网络文章. 一.顺序表 1.顺序表的结构 一个顺序表的完整信息包括两部分,一部分是表中元素 ...
- C#开发BIMFACE系列8 服务端API之获取文件上传状态信息
系列目录 [已更新最新开发文章,点击查看详细] 在BIMFACE控制台上传文件,上传过程及结束后它会自动告诉你文件的上传状态,目前有三种状态:uploading,success,failure ...