zoukankan      html  css  js  c++  java
  • 引用传递与值传递

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

    奇怪的事情

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

    不积跬步无以至千里
  • 相关阅读:
    跨站的艺术-XSS Fuzzing 的技巧
    腾讯云数据库团队:PostgreSQL TOAST技术理解
    Git commit message和工作流规范
    前端识别验证码思路分析
    Akamai在内容分发网络中的算法研究(翻译总结)
    Nginx网站使用CDN之后禁止用户真实IP访问的方法
    常用机器性能评估工具
    解决关于ArcGIS10.2服务手动启动的问题
    林业通用平台上线
    土地承包经营权地块示意图打印
  • 原文地址:https://www.cnblogs.com/jinxiuze/p/7806112.html
Copyright © 2011-2022 走看看