java中传参问题的分析,基本数据类型和引用类型传参的区别,String类型传参是值传递还是引用传递?

it2022-05-05  96

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 */

 

 

 


最新回复(0)