java的传参方式
传参方式
值传递
方法接收的是实参值的拷贝,会创建副本。
引用传递
方法接收的直接是实参所引用的对象在堆中的地址,不会创建副本,对形参的修改将影响到实参。
尝试证明JAVA仅存在值传递这一种传参方式
基本数据类型
public static void main(String[] args) {
int a = 129;
int b = 130;
intSwap(a, b);
System.out.println("a = " + a);
System.out.println("b = " + b);
}
public static void intSwap(int value1, int value2) {
int temp = value1;
value1 = value2;
value2 = temp;
}
// 运行结果:a = 129;b = 130;
基本数据类型的引用类型
public static void main(String[] args) {
int a = 129;
int b = 130;
intSwap(a, b);
System.out.println("a = " + a);
System.out.println("b = " + b);
}
public static void integerSwap(Integer value1, Integer value2) {
Integer temp = value1;
value1 = value2;
value2 = temp;
}
// 运行结果:a = 129;b = 130;
对象类型(与数组类型类似)
public static void main(String[] args) {
TestClass a = new TestClass("a", 129);
TestClass b = new TestClass("b", 130);
objSwap(a, b);
System.out.println(a);
System.out.println(b);
}
private static void objSwap(TestClass value1, TestClass value2) {
TestClass temp = value1;
value1 = value2;
value2 = temp;
System.out.println(value1);
System.out.println(value2);
value2.value = 0;
}
static class TestClass {
public String key;
public Integer value;
public TestClass(String key, Integer value) {
this.key = key;
this.value = value;
}
@Override
public String toString() {
return key + " = " + value;
}
}
// 运行结果:a = 0;b = 130;
结论
在上述三个示例中,我们在方法中对两个实参进行互相替换,得到的却是没有替换的结果,说明形参的修改并没有影响到实参,所以java的传参方式的是值传递。
类型时对象类型传参方式是值传递。
为什么会影响到实参?这是因为这里的值,指的是对象本身,而我在方法中的修改是修改了值本身,而不是改变了实参。(可以通过将形参指向一个新的对象后,对形参进行修改,观察实参的变化,加以证明)