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
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