深入理解引用与引用传递

1.引用的本质

比如示例代码:

该代码内存及引用创建过程

(1)

Object obj=new Object();

在堆内存创建object对象,对象地址为40f1。然后在栈内存创建引用,引用也是有地址的,该地址所在堆内存存储的数据被赋予为40f1,指向创建的object。

(2)

obj=new Object();

由于new关键字,在堆内存中创建新的object对象,对象地址为40fb。然后把引用存储的数据重新赋予为新的object地址

综上可得:


2.引用传递的本质

先看一段代码:

注意:输出结果为 :Hello而不是World

调用过程分析:

  • (1)在栈内存中为testString()分配一段内存空间,然后再在堆内存中创建Holle字符串,地址为5A1c,接在来在栈内存中穿件String类型的引用,值为5A1C,指向holle字符串。
  • (2)调用changeString函数,然后为形参引用开辟内存空间将实参的值传递给形参,这样形参的引用也指向了堆内存中的Holle字符串。(注意在栈内存中实参和形参两个引用str的地址是不同的)
  • (3)在堆内存中为字符串“World”新开创内存空间地址为5AB6,并把changeString函数中的形参引用str指向新的字符串。此时形参str的值变为5AB5。

完成了changeString函数后,形参引用被栈内存回收了,响应的指向也被回收了。Wolrd也因为没有引用指向它,所以也会被响应地被垃圾回收器回收掉。
最后只有原来的引用还在所以打印结果为:Holle

其他引用类型传递以此类推:
例如:输出结果AAA

总结:


3.改变对象的值

另一种情况(输出结果为BBB)

调用过程分析:


  • (1)在栈内存中为testPerson()分配一段内存空间,然后再在堆内存中创建person对象,地址为5B1c,同时也创建字符串类型对象name,地址为5A8F,接在来在栈内存中穿件person类型的引用P,值为5B1C,指向创建person对象。
  • (2)调用changePerson函数,然后为形参引用开辟内存空间将实参的值传递给形参,这样形参的引用p也指向了堆内存中的Person对象。(注意在栈内存中实参和形参两个引用p的地址是不同的)


  • (3)在堆内存中为字符串“BBB”新开创内存空间地址为5B46,并把changePerson函数中的形参引用str中的name引用指向新的字符串。person中name引用的值变为5B46,指向 。
    完成了changePerson函数后,相应的引用指向还在testPerson()方法里。所以并不会被垃圾回收器回收掉。
    所以打印结果为:“BBB”

再另一种情况:

输出结果仍旧为Holle

  • (1)在栈内存中为testString01()分配一段内存空间,然后再在堆内存中创建Holle字符串,地址为5A1c,接在来在栈内存中穿件String类型的引用,值为5A1C,指向holle字符串。
  • (2)调用changeString01函数,然后为形参引用开辟内存空间将实参的值传递给形参,这样形参的引用也指向了堆内存中的Holle字符串。(注意在栈内存中实参和形参两个引用str的地址是不同的)
  • (3)调用replaceall方法在堆内存中为字符串“World”新开创内存空间地址为5A39,然而并没有引用指向它。

完成了changeString01函数后,形参引用被栈内存回收了,响应的指向也被回收了。Wolrd也因为没有有引用指向它,所以也会被响应地被垃圾回收器回收掉。
最后只有原来的引用还在所以打印结果为:Holle

再看一个案例:

与上面例子不同的是:

str=str.replaceAll("Hello", "World");

在这里由于等于号的存在,将形参指向World,形参值为5A39,changeString02完成后形参引用被回收,引用指向消失,但对world的引用被函数返回了,由于

str=changeString02(str);

的存在,TestString02中的str引用重新指向5A39,所以输出为world

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • iOS面试小贴士 ———————————————回答好下面的足够了------------------------...
    不言不爱阅读 6,457评论 0 7
  • __block和__weak修饰符的区别其实是挺明显的:1.__block不管是ARC还是MRC模式下都可以使用,...
    LZM轮回阅读 8,757评论 0 6
  • 史上最全的iOS面试题及答案 iOS面试小贴士———————————————回答好下面的足够了----------...
    Style_伟阅读 7,136评论 0 35
  • 最近室友在搞代购,天天朋友圈里面各种攻略。说实话,有这样一个朋友,是件可喜可悲的事情。每天被各种饱含干货的代购小知...
    翻滚的潘潘阅读 2,472评论 0 2
  • 春风秋月尽是花 离人妄想寻天涯 近在咫尺不得见 隔人隔心万重山
    草蝶阅读 1,679评论 0 1

友情链接更多精彩内容