引用传递与值传递

值传递:传值,把原来的数据直接拷贝一份传给新的变量
引用传递:传地址,使原来的引用变量指向新的地址中的内容

奇怪的事情

	String str = "aaa";
	change(str);
	System.out.println(str);

	public void change(String str){
		str += "aaa";
	} 

输出结果依然是aaa , 而不是aaaaaa

出现这种情况是,在主函数中的str与调用函数中定义的str是两个不同的引用,并且他们确实是指向了同一个地址,但是因为String是不可变的,所以在执行语句str+="aaa"的时候实际是创建了一个新的对象,使的调用函数中的引用指向了新的对象,所以主函数中的str不会有任何的影响。
如果调用函数中的变量类型不是String,而是可变的StringBuilder类型,那么实际情况分为两种,如果是str.append("aaa");那么主函数中的str是会改变的,如果是str = new StringBuilder("ccc");那么主函数中的值依然不会受到影响。
主要的原因是在与赋值操作“=”。如果是复制操作,则标识把调用函数中的str指向一个新的内存空间,那么与原来的引用失去关联,原来的很明显不会受到印象,如果是append操作,只是在原来的内存地址上改变内存中的内容,但是此时不管是主函数中的str还是调用函数中的str,指向的都是被改变后的内存,很自然的值会受到影响。


实际的参数传递中会遇到4中情况:

  • 基本类型

毫无疑问的传值操作,调用函数与主函数中的变量不存在任何的联系

    int a =10;
    change(a);
    System.out.println(a);
    public void change(int a){
        
       a++;
    }

输出结果为10

  • 不提供改变自身方法的引用类型

是传递的是引用,但是无法对共同指向的对象进行改变操作,只能创建一个新的对象,调用函数中的引用指向他,不影响主函数中的值

 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 "引用传递与值传递"

posted @ 2017-11-08 20:49  别离的岁月  阅读(219)  评论(1编辑  收藏  举报