Java值传递和引用传递

Java总是在讨论是传递还是引用传递,Java没有像C语言那样拥有指针,在看到引用传递和值传递很多的解释之后,更相信引用传递和值传递归根到底都是值传递,只不过引用传递的时候看上去很高大上,其实是把变量的地址值,注意是地址值传递过去,赋值给其他的变量。


看一个值传递的例子:

package demo_pass;

public class ValuePass {
    public static void main(String[] args) {
        ValuePass v = new ValuePass();
        int a=5;
        v.test(a);
        System.out.println("main中a的值:"+a);
    }

    public void test(int a) {
        a = 2;
        System.out.println("test中a的值:"+a);
    }
}

输出:

test中a的值:2
main中a的值:5

通过idea的debug查看各个变量的赋值情况:


在main方法中创建了一个对象,定义一个变量a并赋值5,这时候调用test方法,test方法传进去a,这时候传进去a的值是5,程序继续向下执行,

在执行到12行的时候,12行的代码还没有执行,也就是没有进行赋值操作的时候,传进来的a的值还是5,当执行完12行的时候a的值变成了2,如下图:

(这些变量的值也可以通过Expression和Watches看出)

总结出来就是,这两个值是两个互不相关的值,在程序执行到这里的时候a的值传递过来,遇到赋值语句就改变了,如果把test方法中的赋值语句注释掉,a的值还是5,他们两个值是两个独立的值,互不相关,自己负责到自己的区域。特点:传递的是值的拷贝,传递之后就互不相关。


引用传递:

package demo_pass;

public class ReferencePass {
    public static void main(String[] args) {
        ReferencePass rp = new ReferencePass();
        T t = new T();
        t.a = 4;
        rp.test(t);
        System.out.println("main方法中a的值:" + t.a);
    }

    public void test(T t) {
        t.a = 3;
        System.out.println("test方法中a的值:"+t.a);
    }
}

class T {
    public int a = 0;
}

执行结果:

test方法中a的值:3
main方法中a的值:3

看创建的对象t的地址值,以及传进test方法的地址值都是一样的,此时对象t中a的值是4

继续向下执行,我们看到在test方法中传递进去的对象t还是在main方法中创建的对象,在test方法中的小括号内只是声明了T,并没有创建对象,执行到test方法内的时候,对象t一直没有改变,在main方法中的赋值把a的值从创建对象初始化的时候的0变成了4,执行到test方法中,这个值又变成了3,也就是最开始指向4,后来把指向的内容换成了3,不再指向4,注意这个a一直是main方法中创建的对象t中的变量,所以,两个输出值都是3

只要在test方法中添加创建对象的语句,输出结果就会改变

package demo_pass;

public class ReferencePass {
    public static void main(String[] args) {
        ReferencePass rp = new ReferencePass();
        T t = new T();
        t.a = 4;
        rp.test(t);
        System.out.println("main方法中a的值:" + t.a);
    }
    public void test(T t) {
        t = new T();
        t.a = 3;
        System.out.println("test方法中a的值:"+t.a);
    }
}

class T {
    public int a = 0;
}

输出;

test方法中a的值:3
main方法中a的值:4

因为在test方法中创建了一个对象,这个对象是堆内存中一块新的区域,不是main方法中那个对象了,他们的变量没有任何的关系。


如有不对,欢迎指正!

posted @ 2017-11-10 21:29  In_new  阅读(123)  评论(0编辑  收藏  举报