Java里面本质都是值传递——别人写的表达不清楚,所以我写了下,方便初学者福利 也方便C语言思维的人理解。
2016-09-13 16:05
435 查看
为什么说Java里面都是值传递。
一:首先什么是值传递?
值传递就是不影响原来的值,临时copy一份拿来用。 在方法里也就是栈内存里。
二:不是说Java还有引用传递嘛?
且听我慢慢道来。
都是值传递这个说法确实是都是如此啊,
首先:
普通类型:copy一份内存里的数值,然后拿copy的去用。大家互不影响
引用类型变量:copy一份内存里的数值,然后拿copy的去用。大家互不影响
但是!!!!
引用类型copy的是什么?
copy的是引用信息,也就是它指向的那个堆得内存首地址。别人拿到了这个首地址。但是这个首地址可不简单呢,隐藏了一个福利啊。
举个例子:
就是引用传递,传递的其实也是copy一份值,但是特殊在这个值很特殊的东西,这是一个指向堆内存的地址值,好比也就是你把你家保险箱密码copy一份给人家,那么人家有了密码,人家得到的可是你的密码唉,这个密码拿去就能操作堆内存了,虽然你改变不了他手里的密码,但是你可以改变密码对应的保险箱的东西啊。
所以引用类型特殊:就是得到这个值之后还得到了这个值后面的隐藏的福利,隐藏了一个控制权的福利。也就是copy得到了那个指向的堆的控制权。
而普通变量传递的是值本身的内容。好比作业,那么copy一份就是一份。虽然都是操作,但是各自互不影响。但是作业后面没隐藏福利啊,就是一堆作业内容。
——————————————————————————————————————————
C语言习惯是值传递和地址传递。是很清楚的。但是Java是引用,稍稍有点啰嗦。
【补充】
Java里string是值传递,是内容copy一份临时的值。原来的不便变。两个仓库而已。
数组是地址传递,是copy了一份堆的首地址,也就是别人也得到了对象的管理权,有了两个遥控器。都指向堆。
new 出的String 是对象,本应是传递引用,但String 是不可变对象,所以在其值创建后,无法对其值做修改,所以跟值传递一个效果。传递的就是堆里的内容,
顺便说一下,8个基础类型对应的包装类型全部都是不可变对象,都是值传递。
值传递那么就是来一次内容的copy。原来值得内容你不能改,没控制权。
引用传递是里面存的首地址的copy。原来引用变量里的的对象你不能改,但是他指向的堆对象你可以改啊。
一:首先什么是值传递?
值传递就是不影响原来的值,临时copy一份拿来用。 在方法里也就是栈内存里。
二:不是说Java还有引用传递嘛?
且听我慢慢道来。
都是值传递这个说法确实是都是如此啊,
首先:
普通类型:copy一份内存里的数值,然后拿copy的去用。大家互不影响
引用类型变量:copy一份内存里的数值,然后拿copy的去用。大家互不影响
但是!!!!
引用类型copy的是什么?
copy的是引用信息,也就是它指向的那个堆得内存首地址。别人拿到了这个首地址。但是这个首地址可不简单呢,隐藏了一个福利啊。
举个例子:
就是引用传递,传递的其实也是copy一份值,但是特殊在这个值很特殊的东西,这是一个指向堆内存的地址值,好比也就是你把你家保险箱密码copy一份给人家,那么人家有了密码,人家得到的可是你的密码唉,这个密码拿去就能操作堆内存了,虽然你改变不了他手里的密码,但是你可以改变密码对应的保险箱的东西啊。
所以引用类型特殊:就是得到这个值之后还得到了这个值后面的隐藏的福利,隐藏了一个控制权的福利。也就是copy得到了那个指向的堆的控制权。
而普通变量传递的是值本身的内容。好比作业,那么copy一份就是一份。虽然都是操作,但是各自互不影响。但是作业后面没隐藏福利啊,就是一堆作业内容。
——————————————————————————————————————————
C语言习惯是值传递和地址传递。是很清楚的。但是Java是引用,稍稍有点啰嗦。
【补充】
Java里string是值传递,是内容copy一份临时的值。原来的不便变。两个仓库而已。
数组是地址传递,是copy了一份堆的首地址,也就是别人也得到了对象的管理权,有了两个遥控器。都指向堆。
new 出的String 是对象,本应是传递引用,但String 是不可变对象,所以在其值创建后,无法对其值做修改,所以跟值传递一个效果。传递的就是堆里的内容,
顺便说一下,8个基础类型对应的包装类型全部都是不可变对象,都是值传递。
值传递那么就是来一次内容的copy。原来值得内容你不能改,没控制权。
引用传递是里面存的首地址的copy。原来引用变量里的的对象你不能改,但是他指向的堆对象你可以改啊。
相关文章推荐
- Java里面本质都是值传递——别人写的表达不清楚,所以我写了下,方便初学者福利 也方便C语言思维的人理解。
- typedef使用大全(转) 一、数组 typedef到处都是,但是能够真正懂得typedef使用的不算太多。对于初学者而言,看别人的源码时对到处充斥的typedef往往不知所错,而参考书又很少,所以在此给出一个源码,供大家参考 #include #
- 理解JAVA里的所有参数传递都是值传递
- 我的理解:Java 中方法的参数全部都是按“值”传递的
- java方法调用都是值传递的理解
- 在Java里面参数传递都是按值传递
- Java初学者必须理解的六个大问题
- 用"堆栈区数据复制"理解Java赋值和参数传递?机制的心得
- Java初学者都必须理解的六大问题
- Java初学者都必须理解的问题
- 用”堆栈区数据复制”理解Java赋值和参数传递机制的心得
- Java初学者都必须理解的六大问题
- Java初学者都必须理解的六大问题
- Java初学者都必须理解的问题
- Java教程 J2EE初学者需要理解的五个问题
- Java初学者都必须理解的六大问题(转载)
- Java初学者都必须理解的六大问题
- Java初学者都必须理解的六大问题
- Java初学者都必须理解的六大问题
- 用"堆栈区数据复制"理解Java赋值和参数传递机制的心得