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,对于数组,其他类等,都是引用传递;
图形表达:
//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后,只能通过引用去改变对象,不能去改变其指向对象;
所以传递的是引用的复制,也就是上图中的黄色箭头。
作者:kangkaii
如果您觉得本文有帮助的话,可以点个推荐呐!!
若有不对或者不合理的地方也欢迎指出,感谢~
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.