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方法中那个对象了,他们的变量没有任何的关系。
如有不对,欢迎指正!