java函数的参数是按值传递的,就是通过复制的方式传递。(js也是这样)
三个例子来说明:
基本数据类型的传递。
public class Test1{ public static int add(int x){ x += 10; return x; } public static void main(String[] args) { int y = 1; int result = add(y); System.out.println(y); //1 System.out.println(result); //11 } }
函数内的改变不引响函数外的改变。所以按值传递。
对于引用类型的变量,这里使用两个例子作为比较说明。
public class Test1{ public static void add(TestClass x){ x.sign += 10; } public static void main(String[] args) { TestClass y = new TestClass(); add(y); System.out.println(y.sign); //11 } } class TestClass{ int sign = 1; }
类TestClass的对象在传入add函数后其成员变量值被改变,因为函数中的x的值与y相同,即引用同一个对象。
public class Test1{ public static void add(TestClass x){ x.sign += 10; x = new TestClass(); //增加的部分 x.sign = 5; //增加的部分 } public static void main(String[] args) { TestClass y = new TestClass(); add(y); System.out.println(y.sign); //11 } } class TestClass{ int sign = 1; }
在main方法中的输出仍然为11,因为y将其值复制给了x,x拥有了与y相同的引用,但x与y是不同的变量,x只是一个局部变量,在函数结束后就会被销毁。x中的值的改变不会影响到y。但是x与y引用相同时,可以操作同一个引用的对象,使得y的值成员变量值发生改变。