java 值传递跟引用传递在内存中怎么分配的

在以后的工作中,如果没有很好的掌握这两种传递方式,那么就会带了一些意想不到的问题.

如果要很好的掌握他们的,必须要对其内部的结构,也就是内存存储位置有一个比较清晰的印象

那么以后再写程序,不管遇到什么的程序,表现虽然不一样,但是内部结构(内存)的位置基本上

不会有太多的变化.好了.废话不说了:


第一种:值传递方式: 举个简单的程序

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public class InitDataTest {  
  2.   
  3. public static void main(String[] args) {  
  4. // TODO Auto-generated method stub  
  5. int a=5;       
  6. int b;  
  7. b=a;  
  8. b=6;  
  9. trace(a,b);  
  10. }  
  11. static void trace(int a,int b){  
  12. System.out.println("a的值为:"+a+"\nb的值为"+b);  
  13. }  
  14. }  


trace(a,b);
}
static void trace(int a,int b){
System.out.println("a的值为:"+a+"\nb的值为"+b);
}
}

[结果如下]

a的值为:5
b的值为6

内存结构图如下:


上面的图对应的程序的执行顺序以及内存是怎么发生变化的.相信大家都能看的懂不.

第二种:引用传递 例子如下:



public class Number {
public static void main(String[] args) {
Test n1=new Test();
Test n2=new Test();
n1.i=9;
n2.i=47;
System.out.println("n1.1="+n1.i+"\n"+"n2.i="+n2.i);
n1=n2;
System.out.println("n1.1="+n1.i+"\n"+"n2.i="+n2.i);
n1.i=27;
System.out.println("n1.1="+n1.i+"\n"+"n2.i="+n2.i);
}
}
class Test{
int i;
}

内存变化图如下:



到此时堆中的没有引用的那块区域 等待垃圾回收器处理 此时他们2个指向了同一块内存空间. 

输出结果大家应该能想到的:

n1.1=9n2.i=47
n1.1=47n2.i=47


以下是个人见解:

基本数据类型中变量值是直接存入栈中的,所以栈中的值只有操作当前变量名才能改变。

引用数据类型在栈中存的是地址,变量值在堆中,所以两个相同地址值的引用变量操作的是同一个变量值,改变一个变量的值时,另一个也跟着改变。

猜你喜欢

转载自blog.csdn.net/qq_36838191/article/details/80248797