分析:java有基本数据类型和引用数据类型两种,基本数据类型变量存储的就是数值,而引用数据类型变量存储的是引用,也就是能指向堆中对象的地址
为什么说java只要值传递呢?
对于基本数据类型,传参传递的就是数值的副本,也就说把实参的数据复制给形参一份,不管形参怎么改变,实参是不受影响的
这时改变的只是形参引用的指向,而实参引用和实参引用指向的对象都没有被改变
因为实参引用和形参引用指向的对象相同,这是实参引用指向的对象被修改了
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 */