Java值传递和引用传递

来源:互联网 发布:js获取自定义属性 编辑:程序博客网 时间:2024/06/06 10:49

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的值:2main中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的值:3main方法中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的值:3main方法中a的值:4

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


如有不对,欢迎指正!

原创粉丝点击