最近有同学问我关于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为何只有值传递的更多相关文章

  1. Java中只有值传递,(及值传递与引用传递详解)

    首先呢,我们来说一下值传递与引用传递的区别(这两个玩意儿实在调用函数的时候提到的) 比如说 code( a) code( int a ) code(a)是调用函数,a是我们原本函数的一个值类型,然后使 ...

  2. Java 参数的值传递和引用传递

    在Java中,方法的参数的传递分为值传递(基本数据)和引用传递(引用数据:对象.字符串),这是最容易接受的.如果你能知道有这两种情况存在,那么,在遇到调用方法时,你可以避免很多问题的产生.但是,仔细查 ...

  3. 【转】彻底弄懂Java中的equals()方法以及与"=="的区别

    彻底弄懂Java中的equals()方法以及与"=="的区别 一.问题描述:今天在用Java实现需求的时候,发现equals()和“==”的功能傻傻分不清,导致结果产生巨大的偏差. ...

  4. 死磕面试系列,Java到底是值传递还是引用传递?

    Java到底是值传递还是引用传递? 这虽然是一个老生常谈的问题,但是对于没有深入研究过这块,或者Java基础不牢的同学,还是很难回答得让人满意. 可能很多同学能够很轻松的背出JVM.分布式事务.高并发 ...

  5. Java 中的值传递和参数传递

    Java中没有指针,所以也没有引用传递了,仅仅有值传递不过可以通过对象的方式来实现引用传递 类似java没有多继承 但可以用多次implements 接口实现多继承的功能 值传递:方法调用时,实际参数 ...

  6. Java中的值传递和引用传递

    这几天一直再纠结这个问题,今天看了这篇文章有点思路了,这跟C++里函数参数为引用.指针还是有很大区别. 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里 ...

  7. java是通过值传递,也就是通过拷贝传递——通过方法操作不同类型的变量加深理解(勿删)

    head first java里写到“java是通过值传递的,也就是通过拷贝传递”,由此得出结论,方法无法改变调用方传入的参数.该怎么理解呢? 看例子: public class Test1 { pu ...

  8. Java中的值传递

    1.先比较下字符串的比较 == 代表全等于 值和地址(存放地址) 全部相等于. equals 值等于== 和 equals的区别 列如下面的 如果name1==name2是等于的 然而name1==n ...

  9. 为什么说Java中只有值传递

    本文转载自公众号 Hollis 对于初学者来说,要想把这个问题回答正确,是比较难的.在第二天整理答案的时候,我发现我竟然无法通过简单的语言把这个事情描述的很容易理解,遗憾的是,我也没有在网上找到哪篇文 ...

随机推荐

  1. 【JS档案揭秘】第二集 Event loop与执行栈

    我时常在思考关于JS的很多知识在工作中有什么用?是否只能存在于面试这种理论性的东西中,对于我们的业务和工作,它们又能扮演怎样的角色.以后在JS档案揭秘的每一期里,都会加入我对于业务的思考,让这些知识不 ...

  2. python(自用手册)三

    第三章 基础 3.1编码初识 ascii 256字母没有中文 一个字节 8位 gbk 中国 中文2字节 16位 英文1字节8位 unicode 万国码 前期 2字节 8位 后期变成4个字节 32位 u ...

  3. 开源音乐下载神器XMusicDownloader更新,支持歌单一键下载,支持无损音乐

    开源音乐下载神器XMusicDownloader更新啦,新增网易.腾讯音乐歌单歌曲.歌手歌曲.专辑歌曲一键下载,同时支持下载flac无损音乐. 功能 V1.0 功能开源工具软件XMusicDownlo ...

  4. Cat应用告警实战

    1. Cat应用告警实战 1.1. 前言 好像是中间件设计者的通病,文档写的都是面向有一定使用各种中间件经验的人,告警模块中每个参数其实都可以详细解释一下,要不然我们理解起来真的很吃力还容易采坑 1. ...

  5. Spring学习之旅(十四)--缓存

    数据库的读写并发一直都是应用性能的瓶颈所在之一,针对改动频率很小的数据我们应该将他存放到缓存中,减少与数据库的交互. 启用对缓存的支持 Spring 对缓存的支持有两种方式: 注解驱动的缓存 XML ...

  6. Leetcode之深度优先搜索(DFS)专题-515. 在每个树行中找最大值(Find Largest Value in Each Tree Row)

    Leetcode之深度优先搜索(DFS)专题-515. 在每个树行中找最大值(Find Largest Value in Each Tree Row) 深度优先搜索的解题详细介绍,点击 您需要在二叉树 ...

  7. flutter无线调试与打包

    1.WIFI连接设备 设备打开开发者选项 -> 点击WIFI调试 ->  项目目录下输入终端命令: adb connect   设备ip地址:[端口号(一般是5555)] 2.apk打包 ...

  8. NLP(十四) 情感分析

    情感在自然语言中的表达方式 例句 解释 I am very happy 开心的情感 She is so :( 表达悲伤的图标 import nltk import nltk.sentiment.sen ...

  9. 基于Python的Appium环境搭建合集

    自动化一直是测试圈中的热聊,也是大家追求的技术方向.在测试中,往往回归测试也是测试人员的“痛点”.对于迭代慢.变更少的功能,就能用上自动化来替代人工回归,减轻工作量. 问题 在分享环境搭建之前,先抛出 ...

  10. HDU - 2255 奔小康赚大钱 KM算法 模板题

    HDU - 2255 题意: 分配n所房子给n个家庭,不同家庭对一所房子所需缴纳的钱是不一样的,问你应当怎么分配房子,使得最后收到的钱最多. 思路: KM算法裸题.上模板 #include <i ...