Java传值与传引用

定义

传值

传递的是值的副本。方法中对副本的修改,不会影响到调用方

传引用:

传递的是引用的副本,共用一个内存,会影响到调用方。
此时,形参和实参指向同一个内存地址。

注意: 对引用副本本身(对象地址)的修改,如设置为null,重新指向其他对象,不会影响到调用方。
基本数据类型
/**
 * @author Wgs
 * @version 1.0
 * @create:2018/10/27
 */
public class ParamChangeValue {
    public static void main(String[] args) {
        int i = 5;
        System.out.println("args = [" + i + "]");
        change(i);
        System.out.println("args = [" + i + "]");
    }

    private static void change(int i) {
        i = 1 + 5;
    }
}
输出
args = [5]
args = [5]


对象
/**
 * @author Wgs
 * @version 1.0
 * @create:2018/10/27
 */
public class ObjectChangeValue {
    private int age;
    private String name;

  
    @Override
    public String toString() {
        return "ObjectChangeValue{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }

    public static void main(String [] args){
        ObjectChangeValue objectChangeValue = new ObjectChangeValue();
        objectChangeValue.setAge(2);
        objectChangeValue.setName("tom");
        System.out.println(objectChangeValue);

        change(objectChangeValue);

        System.out.println(objectChangeValue);
    }

    private static void change(ObjectChangeValue objectChangeValue) {
            objectChangeValue.setName("jack");
            objectChangeValue.setAge(23);
    }
}

输出
ObjectChangeValue{age=2, name='tom'}
ObjectChangeValue{age=23, name='jack'}
注:如果对象被重新创建或赋值为null,即new则会重新指向其他对象,不影响其远对象的值
/**
 * @author Wgs
 * @version 1.0
 * @create:2018/10/27
 */
public class ObjectChangeValueNew {
    private int age;
    private String name;


    @Override
    public String toString() {
        return "ObjectChangeValue{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }

    public static void main(String[] args) {
        ObjectChangeValueNew objectChangeValue = new ObjectChangeValueNew();
        objectChangeValue.setAge(2);
        objectChangeValue.setName("tom");
        System.out.println("args = [" + objectChangeValue + "]");
        change(objectChangeValue);
        System.out.println("after args = [" + objectChangeValue + "]");

    }

    private static void change(ObjectChangeValueNew objectChangeValue) {
        objectChangeValue = new ObjectChangeValueNew();
        objectChangeValue.setName("jack");
        objectChangeValue.setAge(23);

        System.out.println(objectChangeValue);
    }
}

输出
args = [ObjectChangeValue{age=2, name='tom'}]
ObjectChangeValue{age=23, name='jack'}
after args = [ObjectChangeValue{age=2, name='tom'}]


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]
总结

基本类型(byte,short,int,long,double,float,char,boolean)为传值

对象类型(Object,数组,容器)为传引用

String、Integer、Double等immutable类型因为类的变量设为final属性,无法被修改,只能重新赋值或生成对象。

当Integer作为方法参数传递时,对其赋值会导致原有的引用被指向了方法内的栈地址,失去原有的的地址指向,所以对赋值后的Integer做任何操作都不会影响原有值。

你可能感兴趣的:(Java传值与传引用)