引用传递与值传递

   值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
   引用传递(pass by reference)是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
   JAVA中只有值传递,没有引用传递。地址值也是值,传递地址值不一定就是引用传递。值传递和引用传递的区别并不是传递的内容。而是实参到底有没有被复制一份给形参。在C语言里有引用传递这种说法,但是在JAVA里虽然有类似效果但是实质上不存在任何引用传递,我们看到的类似引用传递的效果本质上还是值传递。
   基本类型变量 int boolean char float double等这些基本类型在定义后其数据是存在栈里,那么基本类型变量传递的时候是只传递了一个值,新变量本身除了值和原型一致就没有任何其他关系,所以基本类型变量传递是值传递。
  对于String Integer这些封装类型,将 str传递过去实际上相当于

String str=“hello”;
String st=str;

这里传递的是“地址”这个值,所以 st=str 只是将str所指向的地址赋值给st,按理说既然是st和str公用一个地址那么当st改变时str也应该改变,那么为什么原变量str无改变呢。这里涉及到String 及 Integr 等封装类的源代码,看下Stirng的底层实现是

private final char value[];  

value是final常量不可改的,而且在源代码里没有set方法,也就意味着一旦定义不能修改值,那么也就意味着平时我们修改值实际上是相当于在堆里新划分出了一块空间,创建了一个新的String对象,然后修改变量的指向使其指向新对象,所以值改变了。
  但是平时定义类的时候很少将成员变量定义为final并且不设定set方法,所以自定义类传递时传递的是堆的指向也就是地址,并且成员变量是可改的那么这时效果是引用传递效果(虽然本质是值传递)。

java只有值传递的。
如果是基本数据类型,传递的就是实际的值。
如果是引用数据类型,传递的就是该引用的地址值。
发布了162 篇原创文章 · 获赞 58 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/ThreeAspects/article/details/105615118
今日推荐