这样的话:
int a = 3;
int b = 3;
编译器先处理int a = 3;首先它会在栈中创建一个变量为a的引用,然后查找栈中是否有3这个值,如果没找到,就将3存放进来,然后将a指向3。接着处理int b = 3;在创建完b的引用变量后,因为在栈中已经有3这个值,便将b直接指向3。这样,就出现了a与b同时均指向3的情况。这时,如果再令a=4;那么编译器会重新搜索栈中是否有4值,如果没有,则将4存放进来,并令a指向4;如果已经有了,则直接将a指向这个地址。因此a值的改变不会影响到b的值。要注意这种数据的共享与两个对象的引用同时指向一个对象的这种共享是不同的,因为这种情况a的修改并不会影响到b, 它是由编译器完成的,它有利于节省空间。而一个对象引用变量修改了这个对象的内部状态,会影响到另一个对象引用变量。
那么:
int a=3;
int b=a;
是怎样一个过程呢...
int a=3;
a去找一个值为3的变量存放地址,并把这个地址交给a。
int b=a;
a直接将这个地址交给b;
[quote]
那这样的话a b 指向同一地址么.. 接下啦 我改变a的值 b也会改变吗? [/quote]
你说呢,a存放的是地址
[quote]
栈里面存放的对象的引用应该也占内存吧。。他是怎么被销毁的..gc应该不会去管理他吧..
[/quote]
栈里的数据应该是不用gc管理的,就算是在c语言里它也能自动销毁的,我想java应该跟c在这上面是一致的。栈就像一个数据结构栈一样存放数据,对应的变量是有作用范围的,超出了作用范围就会被出栈,这时候对应的内存已经不是管理(被保护)的内存了,即已经是释放了。