在以后的工作中,如果没有很好的掌握这两种传递方式,那么就会带了一些意想不到的问题.
如果要很好的掌握他们的,必须要对其内部的结构,也就是内存存储位置有一个比较清晰的印象
那么以后再写程序,不管遇到什么的程序,表现虽然不一样,但是内部结构(内存)的位置基本上
不会有太多的变化.好了.废话不说了:
第一种:值传递方式: 举个简单的程序
- public class InitDataTest {
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- int a=5;
- int b;
- b=a;
- b=6;
- trace(a,b);
- }
- static void trace(int a,int b){
- System.out.println("a的值为:"+a+"\nb的值为"+b);
- }
- }
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
以下是个人见解:
基本数据类型中变量值是直接存入栈中的,所以栈中的值只有操作当前变量名才能改变。
引用数据类型在栈中存的是地址,变量值在堆中,所以两个相同地址值的引用变量操作的是同一个变量值,改变一个变量的值时,另一个也跟着改变。