1.当使用基本数据类型作为参数传递时,形参变量的改变不会影响到实参的数值;
即如果形参是基本类型或者String,则实参不会变(传的是值)
public class Test {
public static void main(String[] args) {
String test= "test";
update(test);
System.out.println(test);
int a=1;
update(a);
System.out.println(a);
}
public static void update(String test) {
test ="update";
System.out.println(test);
}
public static void update(int a) {
a=666;
System.out.println(a);
}
}
运行结果为:
即形参改变后,对实参没有影响,验证了上述说法。
2.当使用引用数据类型作为参数传递时,形参变量指向内容的改变通常会影响实参的数值;即如果形参是容器或者数组,其内部的元素改变,实参也会改变。
import java.util.ArrayList;
import java.util.List;
public class TestArray {
public static void main(String[] args) {
int[] test = {1,2,3,4};
System.out.println(test[0]);
update(test);
System.out.println(test[0]);
List<Integer> t = new ArrayList<>();
System.out.println(t.toString());
add(t);
System.out.println(t.toString());
}
public static void update(int[] test) {
test[0]=666;
}
public static void add(List<Integer> t) {
t.add(6);
}
}
测试结果为:
3. 当使用引用数据类型作为参数传递时,若改变形参变量的指向后再改变指向的内容,此时不会影响到实参的数值。
即:如果形参是一个对象,如果在方法里面直接修改形参对象的属性,比如直接改下面的name属性,是会影响到实参的name属性的。但是如果在方法里只是改行参的指向,使其指向另外一个对象,或者先改变行参指向再改变其属性,均不会影响原有实参。
对象定义如下:
public class Hero{
public String name;
protected float hp;
float armor;
int moveSpeed;
}
public class Test {
public static void main(String[] args) {
Hero h1 = new Hero();
h1.name = "h1";
Hero h2 = new Hero();
h2.name = "h2";
swap1(h1,h2);
System.out.println(h1.name);
swap2(h1);
System.out.println(h1.name);
update(h1);
System.out.println(h1.name);
}
public static void swap1(Hero h1,Hero h2) {
h1=h2;//修改指向
System.out.println(h1.name);
}
public static void swap2(Hero h1) {
h1 = new Hero();//先修改指向
h1.name = "h3";//再改属性
System.out.println(h1.name);
}
public static void update(Hero h1) {
h1.name="update";//直接修改属性
System.out.println(h1.name);
}
}
测试结果符合上述说明。