在java中,对于方法参数传递,不论传递的是原生数据类型还是引用类型,统一都是值传递(pass by values)。引用类型传递的是地址,传完之后两个引用指向同一个对象,若其中一个引用改变了对象的属性,那么这中改变也将会反映到其他的引用中。原生数据传递的是变量的数值,传完之后你是你,我是我,你的改变不会影响到我。这么说很抽象,不容易理解,下面的代码或许对理解有帮助。
public class ParamTest { int i = 10; public static void main (String[] args) { ParamTest param = new ParamTest(); Person person = new Person(); person.change(param); System.out.println (param.i); } } class Person { public void change(ParamTest param1) { param1.i = 20; } }
输出的结果i的值为20.我们先来看看main函数:
第一行,创建了ParamTest类的一个对象,并且把对象的地址覆给了引用变量param。当执行到Person类中的change方法时,change方法创建了一个ParamTest类的引用param1,将main方法中的param中的地址值传递给了形参param1,两个引用变量指向同一个对象。change方法利用param1这个引用变量,改变了对象的属性值,而打印输出param.i的时候,输出已改变了的值。这说明两个引用变量指向同一个对象。若一个引用变量改变了对象的属性,实际上改变了对象本身,因此这种改变也会反映到其他引用变量上。
public class ParamTest { int i = 10; public static void main (String[] args) { /* ParamTest param = new ParamTest(); Person person = new Person(); person.change(param); */ int i = 10; person.change(i); System.out.println (i); // System.out.println(param.i); } } class Person { public void change(ParamTest param1) { param1.i = 20; } public void change (int age) { age = 40; } }
以上代码中在Person类中又定义了一个change方法,它接收的参数是int型。在main函数中,我调用了第二个change方法,执行这个方法的时候,是将i的值赋给了age,之后change方法并不会改变i的值了,因此i的值打印输出为10