java中没有引用传递,只有值传递
分析:java有基本数据类型和引用数据类型两种,基本数据类型变量存储的就是数值,而引用数据类型变量存储的是引用,也就是能指向堆中对象的地址
为什么说java只要值传递呢?
对于基本数据类型,传参传递的就是数值的副本,也就说把实参的数据复制给形参一份,不管形参怎么改变,实参是不受影响的
对于引用数据类型,传参传递的是引用的副本,也就说把引用(对象的地址)复制了一份,这时候实参和形参都是引用(是两个引用,指向相同,区分C语言指针传递,一个对象指针只有一个,实参和形参是一个指针),都指向在堆中相同的对象
对形参引用两种操作的区别
-
1把形参引用指向一个新对象
这时改变的只是形参引用的指向,而实参引用和实参引用指向的对象都没有被改变
-
2通过形参引用找到指向的对象,并对该对象修改
因为实参引用和形参引用指向的对象相同,这是实参引用指向的对象被修改了
具体测试代码
传参基本数据类型
引用数据类型
1把形参引用指向一个新对象
public void setInt(Integer b) {
b = new Integer(2);
System.out.println("b的值为:"+b);
}
public static void main(String[] args) {
Integer a = 1;
Test1 t = new Test1();
t.setInt(a);
System.out.println("a的值为:"+a);
//没有改变a的值
/*
* 输出
* b的值为:2
* a的值为:1
*/
}
//String类的直接赋值就相当于新创建另一个对象(但还是区别直接new的,可以这样理解)
public void setString(String s2) {
s2 = "bb";
System.out.println("s2的值为:"+s2);
}
public static void main(String[] args) {
String s1 = "aa";
//调用setString()方法,试图修改s1的值
Test t = new Test();
t.setString(s1);
System.out.println("s1的值为:"+s1);
}
//没有改变s1的值
/*
* 输出
* s1的值为:aa
* s2的值为:bb
*/
2通过形参引用找到指向的对象,并对该对象修改
public void setArray(int[] b) {
b[0] = 4;
System.out.println("b数组:"+b[0]+b[1]+b[2]);
}
public static void main(String[] args) {
int[] a = {1,2,3};
Test2 t = new Test2();
t.setArray(a);
System.out.println("a数组:"+a[0]+a[1]+a[2]);
}
//a数组的值发生了改变
/*
* 输出
* 423
* 423
*/