一次讲透引用传递和值传递的区别

2022-05-05  本文已影响0人  半山腰烤苞米

首先回顾一下 堆、栈

int age = 22;

String name = newString("shuaibei");

如果,我们分别对 age、name 变量赋值,会发生什么呢?

age = 18;

name = new String("xiaobei");

age 仅仅是将栈上的值修改为 18,而 name 由于是 String 引用类型,所以会重新创建一个 String 对象,并且修改 name,让其指向新的堆对象。(细心的话,你会发现,图中 name 执行的地址我做了修改)

然后,之前那个对象如果没有其它变量引用的话,就会被垃圾回收器回收掉。

这里也要注意一点,我创建 String 的时候,使用的是 new,如果直接采用字符串赋值,比如:

String name = "shuaibei"

那么是会放到 JVM 的常量池去,不会被回收掉。


值传递

public  static  void  main(String[] args) {

        int b =20;

        change(b);// 实参 实际上的参数

        System.out.println(b);

    }

//形参 形式上的参数  

  public  static  void  change(inta){

        a=100;

    }

结果:20

形参只是实参创建的一个副本,副本改变了,原本当然不可能跟着改变;

引用传递

    public  static  void  main(String[] args) {

        int[] a={1,2,3};

        System.out.println(a[0]);

        change(a);

        System.out.println(a[0]);

    }

    public  static  void  change(int[] a ){

        a[0]=100;

    }

结果:1        100

由于引用传递,传递的是地址,方法改变的都是同一个地址中的值(同一个对象),

原来a[0]指向0x13地址,值是1,

后来在a[0] 指向的也是0x13地址,将值变成了100所以,

再查询a[0]的值的时候,值自然变成了100

总结:

无论引用传递值传递就是将自己中的参数列表中局部参数 copy 后传递过去。(基本数据类型,就是copy数据。非基本数据类型就copy 引用地址。)

所有也有人说 JAVA中 就是值传递。(引用地址也是值)

上一篇 下一篇

猜你喜欢

热点阅读