java中的值传递和引用传递

public class Test3 {
    public static void change(int a){
        a=50;
    }
    public static void main(String[] args) {
        int a=10;
        System.out.println(a);
        change(a);
        System.out.println(a);
    }
}

输出的 是10,10。main方法中将a传递给change方法,change方法中会对传递过来的参数进行copy,所以change中的a是实参复制出来的一个变量。change中的a的改变与实参无关。
public class Test3 {
    public static void change(int []a){
        a[0]=50;
    }
    public static void main(String[] args) {
        int []a={10,20};
        System.out.println(a[0]);
        change(a);
        System.out.println(a[0]);
    }
}

输出结果为10   50。实际传递的是引用的地址值。形参获取到实参所指向的地址的指针。改变形参的值相当于改变实参指向地址的值,所以实参指向的值会改变。

class Emp {
    public int age;
}
public class Test {
    public static void change(Emp emp)
    {
        emp.age = 50;
        emp = new Emp();//再创建一个对象
        emp.age=100;
    }
    
    public static void main(String[] args) {
        Emp emp = new Emp();
        emp.age = 100;
        System.out.println(emp.age);
        change(emp);
        System.out.println(emp.age);
        System.out.println(emp.age);
    }
}
复制代码

输出为:100  50  50.

首先,方法中改变了对象的值,所以age为50,然后创建了一个新的对象,新的对象的指针放在了emp里。这时的emp和传递过来的emp所指向的地址不同了。最后设置age为100,是对新建的Emp对象的设置。也就是说,后来新建的emp相当于change方法中的私有变量,作用域只在change方法里。而传递过来的emp的指针是不会改变的。所以打印的emp是实参指向的空间。

原文地址:https://www.cnblogs.com/BlingSun/p/7485355.html