JAVA传参到底是传引用还是传值, JAVA可以指定传引用类型的参数吗?
最近要搞安卓开发,对我来说完全是新手,无论是Java 还是 android stuido,对于Java传参问题,网上搜索了半天,都是长篇大论,最后终于找到个能说的简单易懂的人了,算是有个结论了,这里记录一下。
-
代码转自知乎java到底是值传递还是引用传递?Intopass的回答。
-
- 如果已经入手一段时间JAVA,就会发现
Dog d;
这样的声明只会产生一个Dog对象的指针,它没有任何空间,需要使用d=new Dog();
为其划分空间后才能使用。这是对于对象。 - 如果我这样写
int a;
那么a是可以立即被使用的,它已经被划分好了空间。因为它是基本类型变量。
也就是说,当我传参传入的是int的话,其实是将值复制了一份,形参和实参它们两个只有值是一样的,而我传入的是String的话,是将String的指针复制了一份,形参和实参(都指的是指向对象的指针)指向的对象是一样的。
- 如果已经入手一段时间JAVA,就会发现
-
提问:那是不是意味着传对象就相当于传引用了呢?
没错。但你也要考虑清楚,如同上述代码第二个例子,
text="windows";
,你要理解这究竟是什么意思,它实际上是重载运算符,等价于text=new String("windows");
,说到这里你应该明白了,这只是给text指针分配了一个新的地址空间而已,原空间的str没有任何改变。 -
提问:如果我写
int[] iArray={1,3,5,7,9};
将其传入函数,为什么可以修改?很好理解,你可以按照JAVA的理解,数组也是对象,因此可以成功将引用传入函数,而由于数组元素类型都是int,不存在重载赋值运算符为new之类的操作,因此是可以修改的。
你也可以按照C语言的理解,传入的是数组首元素的地址,因此可以进行修改。
-
提问:如果我想传int引用怎么办?
实测Integer对象是无法达到传引用的目的的,因此我能想到的方法就是封装一个int类。因为目前水平有限,还不会重载运算符,因此我简单的进行了一个封装,看官明白一下意思就行了:
这样将Intege型的变量传入后,即可通过setValue方法对值进行修改。
顺带推荐个免费隧道,远程办公可用:深隧系统-内网穿透