美文网首页
深入理解引用与引用传递

深入理解引用与引用传递

作者: 少冰三hun甜 | 来源:发表于2016-10-07 08:51 被阅读624次

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

相关文章

  • 深入理解引用与引用传递

    1.引用的本质 比如示例代码: 该代码内存及引用创建过程 (1) 在堆内存创建object对象,对象地址为40f1...

  • C++基础

    C++ 值传递、指针传递、引用传递详解C++中引用传递与指针传递区别 引用传递和指针传递的区别 引用的规则:(1)...

  • java中参数传递,是值传递

    错误理解 错误理解一:值传递和引用传递,区分的条件是传递的内容,如果是个值,就是值传递。 如果是个引用,就是引用传...

  • Java中的参数传递

    为了便于理解,会将参数传递分为按值传递和按引用传递。按值传递是传递的值的拷贝,按引用传递传递的是引用的地址值,所以...

  • 35-类关联结构

        引用传递是整个Java开发与设计过程之中最为重要的技术组成,对于引用传递也与实际的生活密切相关。引用引用分...

  • Day12-Java

    值传递和引用传递 值传递是值的拷贝, 引用传递是引用的拷贝 String 类型是引用类型, new String ...

  • 理解Go 值类型、引用类型、引用传递、值传递

    值类型: 可以理解成基础类型。int、float、bool、array、sturct等 引用类型: 可以理解成值类...

  • C++ 引用传递的学习

    C++ 引用与引用作为函数的参数C++函数的三种传递方式为:值传递、指针传递和引用传递 C++ 上课习题 刘月林2...

  • 引用传递与值传递

    访问变量分引用传递和值传递 值传递 基本数据类型值的传递,就是将变量的值复制给另一个变量。这两个变量是完全独立的。...

  • 值传递与引用传递

    一般数据类型(byte,char,int,float,double,long,String,Integer,Lon...

网友评论

      本文标题:深入理解引用与引用传递

      本文链接:https://www.haomeiwen.com/subject/swgeyttx.html