把一个变量带进一个方法,该方法执行结束后,它的值有时会改变,有时不会改变。一开始会觉得--“好神奇呀”。当我们了解java内存分析的知识后,一切都是那么简单明了了--“不过如此”。但是今天的实验课,对于引用变量,我犯了一个错误,下面是代码的简化--
void method(int a[]) { int temp[]={1,2,3,4}; a[0]=5; a=temp; }
在这里,我试图把临时数组变量的值赋给a,从而改变实参的值。如果你觉得是不可以的,那么就没有看下去的必要的。事实上当然是不可以的。
方法传参,分传值和传址,基本数据类型变量的传参传的是值;引用变量传参传的是地址。传入的参数,实际是实参的一份拷贝。因为,当我们调用一个方法时,逻辑上,jvm会开辟一个我们称之为栈区的内存,当方法运行结束后,这段内存也就被释放了。我们传入的实参的拷贝的生命也仅限于这段栈区,这便是局部变量的宿命。对于基本数据变量,由于它的值是存在栈区的,且与调用该方法的函数的栈内存是独立的,所以影响不到该函数。引用变量的值是地址,它指向堆区的某个地址,这是一个被共享的内存。我们对其的操作就是操作堆区的数据(继续看下文,这句话是不严谨的)。
这是之前我对传参的理解。用它来理解今天的问题,也是没有问题的。但却忽略了一个问题。
既然传入引用变量是传址的,那么上面的代码为什么不能如愿改变它的值呢?
当我们注意到上文说,传参实际是实参的一份拷贝,而且,引用变量也是存在栈区的。那么,我的“a=temp”是在栈区上改变数据(他们的值仅是地址,不能影响堆内存的对象),是拷贝而来的数据。方法执行结束,它也就毫无意义了。
于是:被调用的方法,在堆内存的操作在方法执行结束后才是有效的。对于引用变量,重在它指向的对象,而不是它本身。
价值不高,重在记录。
时间: 2024-10-09 11:57:37