深入理解引用与引用传递

1.引用的本质

深入理解引用与引用传递_第1张图片

比如示例代码:

深入理解引用与引用传递_第2张图片

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

(1)

Object obj=new Object();

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

深入理解引用与引用传递_第3张图片

(2)

obj=new Object();

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

综上可得:

深入理解引用与引用传递_第4张图片

2.引用传递的本质

先看一段代码:

深入理解引用与引用传递_第5张图片

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

深入理解引用与引用传递_第6张图片

调用过程分析:

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

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

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

深入理解引用与引用传递_第7张图片
深入理解引用与引用传递_第8张图片

总结:

深入理解引用与引用传递_第9张图片

3.改变对象的值

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

深入理解引用与引用传递_第10张图片
深入理解引用与引用传递_第11张图片

调用过程分析:


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


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

再另一种情况:

输出结果仍旧为Holle

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

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

再看一个案例:

深入理解引用与引用传递_第16张图片

与上面例子不同的是:

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

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

str=changeString02(str);

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

你可能感兴趣的:(深入理解引用与引用传递)