java值传递和引用传递

我们两清 提交于 2019-12-05 00:08:23

先写三个例子把。

1、这个例子很简单,估计都知道,是值类型,按照值类型传递,传递是副本。所以结果依旧是20。

static void change(int age) {
    age = 10;
}

public static void main(String[] args) {
    int age = 20;
    change(age);
    System.out.println(age);
}

2、这个一看是引用类型,按照引用类型传递,传递“址”,那么结果就是10,嗯,对,确实是10。

public class UserPo {
    private int age;
    public int getAge() {return age;}
    public void setAge(int age) {this.age = age;}
    UserPo(int age) {this.age = age;}

    static void change(UserPo user) {
        user.setAge(10);
    }
    public static void main(String[] args) {
        UserPo user = new UserPo(20);
        change(user);
        System.out.println(user.getAge());
    }
}

3、再来看看这个,也是引用类型,引用传递,输出结果是10吗?NO,是20,不是都说是引用类型传递的是引用么?为什么还是20?

解释:其实把,不能说是引用类型传递的就是引用,其实不管值类型,还是引用类型传递的都是一个副本,记住是副本。值类型副本就不解释了,引用类型的副本就是引用地址的副本,结合下面这个例子,假设我们在new UserPo(20);的时候,引用是A,那么传递进去change方法中就变成A的副本,两个引用指向同一处堆空间,所以在上边例子你依然可以改掉值。但在这个例子中,由于又new UserPo(10);生成了新的引用地址指向age是10的堆空间。引用地址已经不是原来20的地址了。执行完这个change方法就进入回收了。那么原来的20还是原来的20没有发生改变。

记住传递是“副本”。

public class UserPo {
    private int age;
    public int getAge() {return age;}
    public void setAge(int age) {this.age = age;}
    UserPo(int age) {this.age = age;}

    static void change(UserPo user) {
        user = new UserPo(10);
    }
    public static void main(String[] args) {
        UserPo user = new UserPo(20);
        change(user);
        System.out.println(user.getAge());
    }
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!