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;
        }

    }

 

结果如下:

 

在分析这个程序前,我们需要知道java中的内存分配。

在java中的内存分为:

  • 寄存器(给CPU使用)
  • 本地方法区(和系统相关)
  • 方法区
  • 栈内存(存储局部变量)
  • 堆内存(存储 new 出来的东西)

这里我们主要讲一下栈内存和堆内存。

栈内存的特点:

  1. 存储的都是局部变量
  2. 变量所属的作用域一旦结束,该变量就会自动释放

堆内存的特点:

  1. 存储的都是new出来的实体,对象。每个对象都有首地址值。
  2. 堆内存中的变量都有默认初始化值。整型是0,浮点型是0.0f,boolean型是false,char型是‘\u0000’,引用类型为null。
  3. 有垃圾回收机制,会自动回收堆内存中的垃圾数据。

我们在方法中建立数组的时候,数组左边的,例如:int[ ] arr 会存放在栈内存中。而右边的 new 出来的数据,会在堆中自动开辟一个空间,进行存放数据,该数组会自动获取一个首地址值。栈内存中的 arr 存的就是堆内存中的new 出来的数组的地址。

 

分析:在change方法中,参数拥有的是和主函数的数组相同的地址。在执行arr[0]=4时,改变了该地址的指向,使得堆内存中的数组地址不在指向原来的的数据,而是指向 4 ,因为在堆内存中发生改变,所以主函数中打印数组元素时,就是 4 了。而在exchange方法中,arr1 将自己存储的地址赋给了该方法中的局部变量 arr ,所以这个 arr 指向了 567数组。在进行操作,就是对这个数组进行修改,不会影响 123数组。等到方法结束后,arr是局部变量,自动消失。main方法中的数组变量 arr中存储的地址还是 堆内存中的 123 数组,所以仍然打印 123数组的值。不懂的童鞋可以看图解啊,博主没有艺术细胞,画的不好看,还请原谅啊,哈哈哈。

change方法的图解:

exchange方法的图解:

arr = arr1 后:

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

posted @ 2019-12-10 13:40  登天路踏歌行弹指遮天  阅读(407)  评论(0)    收藏  举报