1.先浅谈java中存放的数值的方式:
第一种:将数值放到栈中
第二种:将数值放到堆中
这两种方式你可以再脑海中形成两个高楼大厦;
一座楼叫做栈,一座楼叫做堆
楼中的房子分别装着不同的数据
2.接着,讨论值传递
b=100
接着:做下面运算:
在
再看输出结果
结果为:a=100;
b=10;
分析原因:
在运算过程中,先在栈中(栈楼房)开辟空间(房间1,将a存放的栈中,然后继续在栈中(栈楼房)开辟空间(房间2,存放1的数值,让a指向1,同样,在栈中(栈楼房)中开辟一个空间(房间3),存放b,再在栈中(栈楼房)中开辟一个新空间(房间4);
房间4先是存放默认数值0,当程序执行到b=100时,将b指向的房间里的数值变成100;
然后执行到a=b的时候,将房间4的数值拷贝给a所指向的房间里,这样a所指向的房间的数值也就变成了100;但是!这时候,a还是指向房间2,b还是指向房间4;只是他们指向的房间的数值恰好相等而已,所以第一次输出的结果都为100;
但是,当程序变成
则是,a所指向的房价2的数值不变;但b所指向的房价4数值发生变换;但是这时候房间4和a没有直接关系,所以,a不会发出一个拷贝的命令,房间2的数值仍然是100;
所以,输出结果发生改变:
a=100;
b=10;
3.引用传递
zhangsan的学号:1001
lisi的学号: 1002
zhangsan的学号:1003
lisi的学号: 1003
zhangsan的学号:1004
lisi的学号: 1004
分析原因:
栈中(栈楼房):分别开辟了两个空间(房间),房间1住给了zhangsan,房间2住给了lisi
堆中(堆楼房):在使用new的关键字的时候,就开辟新的空间(房间),其中房间甲住的是一个num的变量,房间乙住的是另外一个num的变量,分别将房间1的张三指向了房价甲,房间2的指针指向了房间乙;
第一次输出:因为房间1和房间2互不相关,所以,给他们分别指向的房间里存放数值互不影响,输出了001,002
但是为什么后面两次输出结果都会变得相同了呢?
原因:在
因此在后面输出的结果,都是相同的
以上就是我对值传递与引用传递的心得,欢迎大家来一起讨论
之前写的代码有大大的问题:
错误之处:我创建了一个student1和student2,然后分别生成了两个对象,这两个对象不能相等,就像,驴和马再怎么像,也不可能相同,只能是第一头驴和第二头驴有同学的部分
纠正:去掉student2的类和对象,都创建为student1的对象,这样才可能一起引用同一个方法
第一种:将数值放到栈中
第二种:将数值放到堆中
这两种方式你可以再脑海中形成两个高楼大厦;
一座楼叫做栈,一座楼叫做堆
楼中的房子分别装着不同的数据
2.接着,讨论值传递
public class test1
{
//启动程序
public void static main(String args[]){
//定义一个变量a并赋予初始值
private int a=1;
//定义一个变量b
private int b=0;
b=100;
//将b赋值给a;
a=b;
//输出结果
System.out.println("a="+a);
System.out.println("b="+b);
}
}
结果为:a=100
b=100
接着:做下面运算:
在
//将b赋值给a;
a=b;
之后添加如下:
//重新设置b的数值
b=10;
再看输出结果
结果为:a=100;
b=10;
分析原因:
在运算过程中,先在栈中(栈楼房)开辟空间(房间1,将a存放的栈中,然后继续在栈中(栈楼房)开辟空间(房间2,存放1的数值,让a指向1,同样,在栈中(栈楼房)中开辟一个空间(房间3),存放b,再在栈中(栈楼房)中开辟一个新空间(房间4);
房间4先是存放默认数值0,当程序执行到b=100时,将b指向的房间里的数值变成100;
然后执行到a=b的时候,将房间4的数值拷贝给a所指向的房间里,这样a所指向的房间的数值也就变成了100;但是!这时候,a还是指向房间2,b还是指向房间4;只是他们指向的房间的数值恰好相等而已,所以第一次输出的结果都为100;
但是,当程序变成
b=100;
//将b赋值给a;
a=b;
b=10;
则是,a所指向的房价2的数值不变;但b所指向的房价4数值发生变换;但是这时候房间4和a没有直接关系,所以,a不会发出一个拷贝的命令,房间2的数值仍然是100;
所以,输出结果发生改变:
a=100;
b=10;
3.引用传递
//学生1的类
public class student1 {
//学生的学号;
private int num;
//传入学生的学号
public void SetNum(int num){
this.num=num;
}
//得到学生的学号
public int GetNum(){
return num;
}
}
//测试
public class test {
public static void main(String args[]){
//创建一个学生1的对象
student1 zhangsan=new student1();
//创建另一个学生1的对象
student1 lisi=new student1();
//传入学生1的学号
zhangsan.SetNum(1001);
//传入学生2的学号
lisi.SetNum(1002);
//输出结果
System.out.println("zhangsan的学号:"+zhangsan.GetNum());
System.out.println("lisi的学号: "+lisi.GetNum());
//引用传递;
zhangsan=lisi;
//lisi将学号更改一下
lisi.SetNum(1003);
//第一次检验结果
System.out.println("zhangsan的学号:"+zhangsan.GetNum());
System.out.println("lisi的学号: "+lisi.GetNum());
//zhangsan将学号变更一下
zhangsan.SetNum(1004);
//第二次查看结果
System.out.println("zhangsan的学号:"+zhangsan.GetNum());
System.out.println("lisi的学号: "+lisi.GetNum());
}
}
最后结果为:
zhangsan的学号:1001
lisi的学号: 1002
zhangsan的学号:1003
lisi的学号: 1003
zhangsan的学号:1004
lisi的学号: 1004
分析原因:
栈中(栈楼房):分别开辟了两个空间(房间),房间1住给了zhangsan,房间2住给了lisi
堆中(堆楼房):在使用new的关键字的时候,就开辟新的空间(房间),其中房间甲住的是一个num的变量,房间乙住的是另外一个num的变量,分别将房间1的张三指向了房价甲,房间2的指针指向了房间乙;
第一次输出:因为房间1和房间2互不相关,所以,给他们分别指向的房间里存放数值互不影响,输出了001,002
但是为什么后面两次输出结果都会变得相同了呢?
原因:在
//引用传递;
zhangsan=lisi;
这里面,将lisi的房间地址赋值给张三,现在他们是同一家人了;所以,这时候,在栈中,房间1和房间2都指向房间乙了,无论给zhangsan赋值还是给lisi赋值,其性质都是在改变堆中房间乙的数值,而房间甲就没有人理会了;
因此在后面输出的结果,都是相同的
以上就是我对值传递与引用传递的心得,欢迎大家来一起讨论
之前写的代码有大大的问题:
错误之处:我创建了一个student1和student2,然后分别生成了两个对象,这两个对象不能相等,就像,驴和马再怎么像,也不可能相同,只能是第一头驴和第二头驴有同学的部分
纠正:去掉student2的类和对象,都创建为student1的对象,这样才可能一起引用同一个方法