深入理解引用与引用传递

2016-10-07  本文已影响624人  少冰三hun甜

1.引用的本质

比如示例代码:

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

(1)

Object obj=new Object();

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

(2)

obj=new Object();

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

综上可得:


2.引用传递的本质

先看一段代码:

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

调用过程分析:

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

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

总结:


3.改变对象的值

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

调用过程分析:


  • (1)在栈内存中为testPerson()分配一段内存空间,然后再在堆内存中创建person对象,地址为5B1c,同时也创建字符串类型对象name,地址为5A8F,接在来在栈内存中穿件person类型的引用P,值为5B1C,指向创建person对象。
  • (3)在堆内存中为字符串“BBB”新开创内存空间地址为5B46,并把changePerson函数中的形参引用str中的name引用指向新的字符串。person中name引用的值变为5B46,指向 。
    完成了changePerson函数后,相应的引用指向还在testPerson()方法里。所以并不会被垃圾回收器回收掉。
    所以打印结果为:“BBB”

再另一种情况:

输出结果仍旧为Holle

  • (1)在栈内存中为testString01()分配一段内存空间,然后再在堆内存中创建Holle字符串,地址为5A1c,接在来在栈内存中穿件String类型的引用,值为5A1C,指向holle字符串。

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

再看一个案例:

与上面例子不同的是:

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

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

str=changeString02(str);

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

上一篇 下一篇

猜你喜欢

热点阅读