java的存储空间和按值传递

来源:互联网 发布:做淘宝买什么电脑好 编辑:程序博客网 时间:2024/06/09 17:54
首先,java存储数据的地方有两个,一个叫做stack,一个叫做heap。

heap存储所有的对象和类变量,除了被声明为static的类变量

stack存储所有的局部变量。

java中的参数传递是按值传递的。也就是说,参数有了一个副本,这个副本与原来的参数并不一样。收到参数的方法并不能直接改变原来的参数。

public class Box {static void nothing(int a){a = 2;}public static void main(String args[]){int a = 1;nothing(a);System.out.println(a);}}

main 方法中有参数a 在其自己的stack中,并且背赋值为1。当a调用方法nothing的时候,创建方法nothing的stack,参数a按值传递,得到一个副本,执行方法nothing,把副本的值改为2。随后方法nothing结束,其stack被销毁。等于什么也没有做。



但是,当方法的参数为引用变量 的时候,情况有一点差别。

public class Box {int a = 1;static void set(Box b){b.a = 2;}public static void main(String args[]){Box mybox = new Box();set(mybox);System.out.println(mybox.a);}}

main方法中变量mybox为引用类型,指向heap中的对象Box,Box中存储着一个类变量a,等于2。

调用set方法的时候,创建set的stack,内部参数b接收变量Box,得到一个副本,同样指向对象Box,也就是和mybox指向同一个对象。参数改变Box中类变量a的值,随后方法结束,其stack被销毁,但是mybox所指向的对象的值已经改变。

如果在方法set中new 一个Box对象给b,那么就改变了b的指向,就不会改变mybox指向对象的参数。


0 0