JAVA 名词目录

JAVA值传递 & 引用传递

2018-11-05  本文已影响10人  琴匣自鸣

先解释一下分别是什么意思,

    值传递:作为参数传递时只传递了值,参数本身没有传递,如果被传递的方法改变传递后的变量参数值,原变量不会改变。在JAVA中显式的值传递参数是各类型变量例如: int double char String Integer 等都是。

    引用传递: 作为参数传递时传递的是参数本身,当被传递方法改变传递后的变量参数值,原参数也会发生改变。一般来说我们自定义的类基本都属于这种情况,那么为什么String类型变量本质也是对象但是没有出现这种情况,这个后边会详细解释。

注意:在C语言里有引用传递这种说法,但是在JAVA里虽然有类似效果但是实质上不存在任何引用传递,我们看到的类似引用传递的效果本质上还是值传递,原因下边慢慢看。

    堆 & 栈 的定义在之前已经说过,那么这里说一下,基本类型变量 int boolean char float double等这些基本类型在定义后其数据是存在栈里这里说过,那么基本类型变量传递的时候是只传递了一个值,新变量本身除了值和原型一致就没有任何其他关系,所以基本类型变量传递是值传递。(注意虽然java是面向对象编程,但是基本类型变量不是对象(数组是对象),为了解决这个问题有了封装类。)

    那么String Integer这些封装类型呢?我们将 str传递过去实际上相当于 String str=“呵呵”; String st=str;那么传递的时候这里注意了,这里传递的时“地址”这个值,所以 st=str 只是将str所指向的地址赋值给st,按理说既然是st和str公用一个地址那么当st改变时str也应该改版对吧,那么为什么原变量str无改变呢。这里涉及到String 及 Integr 等封装类的源代码,看下Stirng的源代码

    发现没,这里value是final常量不可改的,而且在源代码里没有set方法,也就意味着不能一旦定义不能修改值,那么也就意味着平时我们修改值实际上是相当于在堆里新划分出了一块空间,创建了一个新的String对象,然后修改变量的指向使其指向新对象,所以值改变了。

    但是我们平时定义类的时候很少讲成员变量定义为final并且不设定set方法,所以我们自定义类传递时传递的是堆的指向也就地址,并且成员变量是可改的那么这时效果是引用传递效果(虽然本质是值传递)。

这里有个链接也可以看下,很详细的https://blog.csdn.net/wabiaozia/article/details/52492557

上一篇下一篇

猜你喜欢

热点阅读