2019独角兽企业重金招聘Python工程师标准>>>
Java的方法参数传递是值传递还是引用传递?对于基本类型和对象来说,都会发生什么情况?
答案是Java只有值传递,因为Java只有值传递,因此在改变形参的值的时候,实参是不会因此而改变的。这一点从下面这个小程序可以很明显的看出来。
public class Main {public static void main(String[] args){int a = 2;Object object = new Object();System.out.println(a + ":" + object);change(a, object);System.out.println(a + ":" + object);}public static void change(int a,Object object){a = 1;object = new Object();} } |
我们在方法当中改变形参的值,之后再次输出两个实参的值,会发现它们无任何变化。
这就足以说明Java只有值传递了,无论是对象还是基本类型,改变形参的值不会反应到实参上面去,这也正是值传递的奥义所在。
对于基本类型来说,这一点比较明显,不过对于对象来讲,很多猿友会有误解。认为我们在方法里改变形参对象属性的值,是会反映到实参上面去的,因此部分猿友认为这就是引用传递。
首先LZ要强调的是,上面也说了,我们只是改变形参对象属性的值,反映到实参上面去的,而不是真的改变了实参的值,也就是说实参引用的对象依然是原来的对象,只不过对象里的属性值改变了而已。
针对上面这一点,我们使用下面这个程序来说明。
public class Main {public static void main(String[] args){int a = 2;Entity entity = new Entity();entity.a = 100;System.out.println(a + ":" + entity);System.out.println(entity.a);change(a, entity);System.out.println(a + ":" + entity);System.out.println(entity.a);}public static void change(int a,Entity entity){a = 1;entity.a = 200;} } class Entity{int a; } |
我们在方法里改变了entity对象的属性值为200,我们来看一下结果。
可以看到,实参对象的值依然没有改变,只是属性值变了而已,因此这依旧是值传递的范围。为了说明这个区别,我们来看下真正的引用传递。由于Java当中不存在引用传递,因此LZ借用C/C++来让各位看下真正的引用传递是什么效果。
#include <stdio.h> class Entity{ public: int a; Entity(){}; }; void change(int &a,Entity *&entity);int main(){int a = 2;Entity *entity = new Entity();printf("%d:%p\n",a,entity);change(a, entity);printf("%d:%p\n",a,entity); }void change(int &a,Entity *&entity){a = 1;entity = new Entity(); } |
尽量保持和Java的第一个程序是一样的结构,只不过C/C++中没有现成的Object对象,因此这里使用Entity对象代替,这样便于各位理解。我们来看下结果,结果会发现引用传递的时候,在方法里改变形参的值会直接反应到实参上面去。
原文作者(左潇龙)链接:https://blog.csdn.net/zuoxiaolong8810/article/details/65441606