值传递:传值,把原来的数据直接拷贝一份传给新的变量
引用传递:传地址,使原来的引用变量指向新的地址中的内容app
奇怪的事情函数
String str = "aaa"; change(str); System.out.println(str);
public void change(String str){ str += "aaa"; }
输出结果依然是aaa , 而不是aaaaaaui
出现这种状况是,在主函数中的str与调用函数中定义的str是两个不一样的引用,而且他们确实是指向了同一个地址,可是由于String是不可变的,因此在执行语句str+="aaa"的时候实际是建立了一个新的对象,使的调用函数中的引用指向了新的对象,因此主函数中的str不会有任何的影响。
若是调用函数中的变量类型不是String,而是可变的StringBuilder类型,那么实际状况分为两种,若是是str.append("aaa");那么主函数中的str是会改变的,若是是str = new StringBuilder("ccc");那么主函数中的值依然不会受到影响。
主要的缘由是在与赋值操做“=”。若是是复制操做,则标识把调用函数中的str指向一个新的内存空间,那么与原来的引用失去关联,原来的很明显不会受到印象,若是是append操做,只是在原来的内存地址上改变内存中的内容,可是此时无论是主函数中的str仍是调用函数中的str,指向的都是被改变后的内存,很天然的值会受到影响。
**********************************************************************************************************
实际的参数传递中会遇到4中状况:code
基本类型对象
毫无疑问的传值操做,调用函数与主函数中的变量不存在任何的联系内存
int a =10; change(a); System.out.println(a); public void change(int a){ a++; }输出结果为10get
不提供改变自身方法的引用类型io
是传递的是引用,可是没法对共同指向的对象进行改变操做,只能建立一个新的对象,调用函数中的引用指向他,不影响主函数中的值class
String a = "aaa"; change(a); System.out.println(a); public void change(String a){ a += "aaa"; }输出的结果是aaa变量
提供改变自身方法的引用类型,而且使用该方法
StringBuilder a = new StringBuilder("aaa"); change(a); System.out.println(a); public void change(StringBuilder a){ a.appned("aaa"); }输出结果为aaaaaa
提供改变自身方法的引用类型,可是不使用该方法,而是使用赋值操做
StringBuilder a = new StringBuilder("aaa"); change(a); System.out.println(a); public void change(StringBuilder a){ a = new StringBuilder("bbb"); }输出结果为aaa
参考材料:[知乎:引用传递仍是值传递][知乎]
[知乎]: https://www.zhihu.com/question/31203609 "引用传递与值传递"