Java传值和传引用的区别

版权声明:转载请标明出处 https://blog.csdn.net/weixin_36759405/article/details/82764339

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

  • 传值:传递的是值的副本。方法中对副本的修改,不会影响到调用方。
  • 传引用:传递的是引用的副本,共用一个内存,会影响到调用方。此时,形参和实参指向同一个内存地址。对引用副本本身(对象地址)的修改,如设置为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做任何操作都不会影响原有值。

猜你喜欢

转载自blog.csdn.net/weixin_36759405/article/details/82764339