• Java 传值和传引用的区别


    引用别人的文章,感觉写得不错。

    首先对传值和传引用要有个基本的概念

    传值:传递的是值的副本。方法中对副本的修改,不会影响到调用方。
    传引用:传递的是引用的副本,共用一个内存,会影响到调用方。此时,形参和实参指向同一个内存地址。对引用副本本身(对象地址)的修改,如设置为null,重新指向其他对象,不会影响到调用方。
    直接上代码,更好的理解两者的区别。首先看传基本数据类型,如int、long等。

    // 基本数据类型

    // 基本数据类型
    public class ParamChangeValue {    
        public static void main(String[] args) {        
            int s = 1;        
            System.out.println("args = [" + s + "]");        
            change(s);        
            System.out.println("args = [" + s + "]");  
        }    
        private static void change(int i){ 
            i = i* 5;    
        }
    }


    输出:
    args = [1]
    args = [1]

    从输出的的结果中可以看到原本的s并没有被修改,即传值传递的是值的副本,不会影响到本身。

    再来看传对象。

    // 对象

    // 对象
    public class ObjectChangeValue {    
        public static class Score{        
            private int value; 
            
            public int getValue()  {            
                return value;  
            }  
            
            public void setValue(int value) {
                this.value = value;     
            }    
        } 
        
        public static void main(String[] args) {       
            Score score = new Score();        
            score.setValue(1);        
            System.out.println("args = [" + score.getValue() + "]");                       
            change(score);        
            System.out.println("after args = [" + score.getValue() + "]");   
        }    
       
        private static void change(Score score){  
            score.setValue(2);    
        }
    }
    

      


    输出:
    args = [1]
    after args = [2]

    从结果中我们可以看到score实例的value值被修改了,因为传引用后指向的是同一个地址,修改的实际上也就是这个地址上的值,另外要注意一点的是如果对象被重新创建或赋值为null,即new会重新指向其他对象,不影响其原对象的值。

    第三部分:传String、Integer等immutable类型。

    // String、Integer、Long等
    public class StringChangeValue {    
        public static void main(String[] args) {        
            String s = "test1";        
            System.out.println("args = [" + s + "]");        
            change(s);                
            System.out.println("args = [" + s + "]");    
        } 
        
        private static void change(String i){       
            i = i + " test value";    
        }
    }
    

      


    输出:
    args = [test1]
    args = [test1]

    只要知道String、Integer类是final类型的就明白输出的结果为什么是这样的。

    总结:基本类型(byte,short,int,long,double,float,char,boolean)为传值;对象类型(Object,数组,容器)为传引用;String、Integer、Double等immutable类型因为类的变量设为final属性,无法被修改,只能重新赋值或生成对象。当Integer作为方法参数传递时,对其赋值会导致原有的引用被指向了方法内的栈地址,失去原有的的地址指向,所以对赋值后的Integer做任何操作都不会影响原有值。
    ---------------------
    作者:编码小农
    来源:CSDN
    原文:https://blog.csdn.net/weixin_36759405/article/details/82764339
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    关于正餐智能POS6.0.1.1改版后,点击反结账进入点菜界面后无法进行加菜的FAQ
    关于正餐智能POS6.0.1.1改版后,订单模块无法进行部分退款的FAQ
    退款证书相关
    简易付主副机和打印机配置
    秒点直连操作文档
    智能POS打印配置&常见问题FAQ 12-14 后期持续更新
    ERP主副机和打印机配置FAQ
    ASP.NET没有魔法——ASP.NET MVC Controller的实例化与执行
    ASP.NET没有魔法——ASP.NET MVC 路由的匹配与处理
    ASP.NET没有魔法——ASP.NET MVC路由
  • 原文地址:https://www.cnblogs.com/linwenbin/p/11008744.html
Copyright © 2020-2023  润新知