- 1、本文档共4页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
基本类型变量及引用类型变量
基本类型变量和引用类型变量
基本类型变量和引用类型变量分配空间类型不同。不能肯定地说基本类型变量就存储在栈空间里而引用变量就分配的是堆空间,你耐心读完这些东西,不算多,然后进入正题。
假设基本类型变量分配的是栈 (之所以这样假设个人感觉更严谨一些),如:int i= 3; String s = “nihao!” 等都是基本类型的变量,它们的值就存在栈空间里(先这么肯定的说是为了演示问题本质)。
Int i = 3;String s = “nihao!”栈空间
而 像 PassRef obj; obj = new PassRef(); obj 则是引用,引用存在栈里,而实际的对象 是存在堆空间里。
New PassRef();
Int I ;
PassRef obj 栈堆
堆
看下面的代码,根据上面的分配方式,可以这样解释:
public class PassRef {
int x,y;
public static void main(String args[]){
int m = 3;
int n = 5;
change(m,n);
System.out.println(m=+m+,n=+n);
PassRef obj = new PassRef();
obj.x = 1;
obj.y = 2;
changeObj(obj);
System.out.println(obj.x=+obj.x+,obj.y=+obj.y);
}
public static void change(int i,int j){
i = i + j;
j = i - j;
i = i - j;
}
public static void changeObj(PassRef ref){
ref.x=ref.x+ref.y;
ref.y=ref.x-ref.y;
ref.x=ref.x-ref.y;
}
}
输出结果是:
m=3,n=5
obj.x=2,obj.y=1
m和n的值经过change()方法后没有变化,原因在于调用change(int i,int j )方法时为i和j 在栈里分配了空间,调用方法仅仅是把m的值传给了i,把n的值传了j,change()在执行时就与m、n无关了,在chagne()方法内交换了i和j的值,这些值是存储在为i和j 分配的新存储空间里的,方法结束后,为i和j分配的存储空间被释放,m 、n的值依然是之前的3、5。
方法执行
调用changgeObj(PassRef ref)
m=3;n=5;
m=3;n=5;i=3j=5m=3;n=5;i=5j=3
方法执行结束双回到原始状态
m=3;n=5;
PassRef obj栈空间new PassRef();obj.x=1;obj.y=2;堆空间调用changeObj()方法
在调用changeobj(PassRef ref)方法时,情况与前者不一样,它的参数为PassRef 类型的引用,内存是这么分配的:
PassRef objPassRef ref栈空间引用指向
new PassRef();obj.x=1;obj.y=2;堆空间new PassRef();obj.x=1;obj.y=2;PassRef obj方法结束后改变x和y的值
并释放ref
经过上面的图示及执行过程中内存的动态分配,我想我不必说什么了,你应该很清晰了,希望对初学java的你有所帮助!
调用changeObj()方法时创建的是引用,传递也是引用,ref与obj指向的是同一块堆空间。方法执行时对ref指向的对象操作也就是对obj指向的对象操作,
文档评论(0)