弄懂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 对于初学者来说,要想把这个问题回答正确,是比较难的.在第二天整理答案的时候,我发现我竟然无法通过简单的语言把这个事情描述的很容易理解,遗憾的是,我也没有在网上找到哪篇文 ...
随机推荐
- Python模块之pysnooper
一.简介 调试程序时,很多人喜欢直接用print来代替断点调试,而pysnooper模块比print更方便,以装饰器的形式存在 二.实验环境 操作系统:win10 python版本:python3.6 ...
- luoguP2444_[POI2000]病毒
题意 给定多个01模式串,问是否存在一个无限长的字符串不包含任何一个模式串. 分析 好像数据有点水,网上一大堆题解连样例都没过??? 多模式串,先把AC自动机建出来再说. 反向考虑,若存在一个无限长的 ...
- Luogu P1462 && P1951
首先有两个最短路,可以考虑把一个东西拿出来二分,也就是可以二分最小值,但是注意不要用SPFA他死了,可以用Dij跑最短路,再二分,效率会大大提高 1.SPFA #include<bits/std ...
- .NET Core C#中级篇2-5 常见实用类
.NETCore CSharp 中级篇2-5 本节内容为常见实用类和方法的使用 String.Format string.format方法是一个字符串格式化类,它里面的一些写法是对字符串进行指定格式的 ...
- Oracle笔记_基础
1 登录启动 sqlplus / as sysdba #以管理员方式登录 sqlplus 用户名/密码 #本地登录 sqlplus 用户名/密码@//主机IP/实例名(默认orcl) #远程登录 sq ...
- Comupter Tools 清单------包含但不限于此
- Java之Exception
Exception这个东西,程序中必须会有的,尽管我们很不乐意看到它,可是从另一个角度考虑,有异常则说明程序有问题,有助于我们及时改正.有的时候程序出错的原因有很多,比如不合法的输入.类型.空指针甚至 ...
- 关于post和get的区别
首先,get和post并没有本质上的区别,都只是 HTTP 协议中两种请求方式,用的都是同一个传输层协议,在传输上并没有什么不同. 1.get和post报文上的区别 GET 和 POST 只是 ...
- 安装Python及各种包/库——没有网络的电脑上
我们做项目时可能会遇到,一些电脑只能联内网或者无法联网,这种情况怎样在电脑上安装Python及各种第三方包/库呢? 1.首先,在有网络的电脑上在python官网下载好python安装包,地址:http ...
- Android Studio安卓学习笔记(一)安卓与Android Studio运行第一个项目
一:什么是安卓 1.Android是一种基于Linux的自由及开放源代码的操作系统. 2.Android操作系统最初由AndyRubin开发,主要支持手机. 3.Android一词的本义指“机器人”, ...