引用传递与值传递

值传递:传值,把原来的数据直接拷贝一份传给新的变量
引用传递:传地址,使原来的引用变量指向新的地址中的内容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 "引用传递与值传递"

相关文章
相关标签/搜索