java都是值传递,没有引用传递

博主这几天在复习 javaSE 部分的内容时,遇到了关于参数传值的问题,但是始终不知道原因,上网上一查才知道钻牛角尖了,把C语言的参数传值转移到java中了。

相信很多在学习java之前,有接触过C/C++的同学,会按照之前固有的观念认为,java中的参数传递分为 值传递引用传递 。这样想的同鞋都已经掉进了大坑了。请记住一点:在java中,一切的参数传递都是值传递。

什么是值传递?是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改操作,都不会影响到实际参数。

java中的参数传递的区别就是参数数据类型的不同。根据参数的类型可分为 基本数据类型 和 引用数据类型。

基本数据类型:

当方法中的参数类型是基本数据类型时,传递的是数据值。因为是值传递,所以传递的数据值,是复制实参所得到的。

分析下列代码:

 public class TestDemo02 {
        public static void main(String[] args) {

           int a = 3,b = 4;
           change(a,b);
            System.out.println(a);
            System.out.println(b);
        }

        private static void change(int a, int b) {
            a = a + a;
            b = a + b;
            
        }
    }

结果如下:

分析:这种情况下,change方法中的两个参数的值和主函数的值无关,在change方法中的修改,只是对该方法中的两个局部变量进行,方法结束后,变量就消失了,所以不会对主函数造成影响。

 

引用数据类型:

当方法的参数是引用数据类型时,传递的是地址值。这种情况下,会先将地址进行拷贝,将拷贝后的地址进行值传递。

分析下列代码:

public class TestDemo02 {
        public static void main(String[] args) {

            int[] arr  = {1,2,3};
            change(arr);
            System.out.println(arr[0]);
        }

        public static void change(int[] arr){
            arr[0] = 4;
            exchange(arr);
        }
        public static void exchange(int[] arr){
            int[] arr1 = {5,6,7};
            arr = arr1;
        }

    }

结果如下:

分析:在方法中,参数拥有的是和主函数的数组相同的地址。在执行arr[0]=4时,改变了该地址的指向,使得实参中的地址指向也发生了改变;而exchange方法中的arr虽然也指向了arr1,
但是它是个局部变量 ,方法结束后,就会自动消失。

change方法的图解:

exchange方法的图解:

arr = arr1 后:

通过以上两个例子,我们可以知道 java中进行值传递的时候,参数类型为基本数据类型和引用数据类型的区别。注意:数组中改变的永远是地址的指向

猜你喜欢

转载自www.cnblogs.com/mysmeng/p/zhichuandi.html