java中 引用传递、值传递的理解(数组,自定义类,基本数据类型,String类)

时间:2023-03-09 06:19:36
java中 引用传递、值传递的理解(数组,自定义类,基本数据类型,String类)

代码部分:

    public static void main(String[] args) {
testInt();
testString();
testArray();
testX();
} public static void testInt() {
int a = 1;
int b = a;
a = 2;
System.out.println("b = "+b);
changeInt(a);
System.out.println("a = "+a);
} public static void testString() {
String a = "1";
String b = a;
a = "2";
System.out.println("b = "+b);
changeString(a);
System.out.println("a = "+a);
} public static void testArray() {
int[] a = {1,2,3};
int[] b = a;
a[0] = 2;
System.out.println("b[0] = "+b[0]);
changeArray(a);
System.out.println("a[0] = "+a[0]);
} public static void testX() {
X a = new X("1");
X b = a;
a.setValue("2");
System.out.println("b.value = "+b.getValue());
changeX(a);
System.out.println("a.value = "+a.getValue());
} static void changeInt(int a) { a = 100;} static void changeString(String a) { a = "100";} static void changeArray(int[] a) { a[0] = 100;} static void changeX(X a) { a.setValue("100");}

输出结果补充,如下:

b = 1
a = 2
b = 1
a = 2
b[0] = 2
a[0] = 100
b.value = 2
a.value = 100

结果分析:

将数据赋值或当做参数传递的时候:

1,对于基本数据类型,String类, Integer, Double等immutable的类型 都是 值传递;

2,对于数组,其他类等,都是引用传递;

图形表达:

java中 引用传递、值传递的理解(数组,自定义类,基本数据类型,String类)

//2018-9-17更新

如果非要谈论是否java里只有值传递,可以把引用传递看成:实际上传递了引用的值。

补充代码与输出如下



public static void testX02() {
X a = new X("1");
changeX02(a);
System.out.println("a.value = "+a.getValue());
} static void changeX02(X a) {
a = new X("");
a.setValue("100");
}

上方代码输出结果:a.value = 1

也就是说testX02中的a,仍然指向最初定义value为“1”的对象;

当做参数调用changeX02后,只能通过引用去改变对象,不能去改变其指向对象;

所以传递的是引用的复制,也就是上图中的黄色箭头。

相关文章