Java引用传递

Java引用传递教程

我们在 Java 语言对象详解 文章里面介绍了堆和栈的概念,所谓的引用传递就是指将堆内存空间的使用权交给多个栈内存空间。

案例

定义一个普通类

我们定义一个类,里面有一个 int 类型的属性

package com.haicoder.net.quote; public class Quote { int num = 100; }

我们改变其中的 num 值。

package com.haicoder.net.quote; public class QuoteTest { public static void main(String[] args) { System.out.println("嗨客网(www.haicoder.net)"); Quote quote = new Quote(); System.out.println("调用change前的值:" + quote.num); changeDate(quote); System.out.println("调用change后的值:" + quote.num); } public static void changeDate(Quote quote) { quote.num = 1000; } }

运行结果如下:

20 引用类型传递.png

我们从运行结果中看到,对应的 quote 对象里面的 num 属性值变化了,变成了我们 changeDate 里面赋的值。

原理如下:

21 堆里面数据改变.png

在调用 changeDate 方法的时候,我们传递的参数是 quote 的一个对象,即 quote 对应的栈上面的引用,所以我们在调用 changeDate 方法的时候,修改了传递的变量的数据,再打印出里面的 num 的时候是改变后的数据。

定义一个String类变量

package com.haicoder.net.quote; public class QuoteTest { public static void main(String[] args) { System.out.println("嗨客网(www.haicoder.net)"); String str1 = "嗨客网"; System.out.println("调用 changeDate 之前 : " + str1); changeDate(str1); System.out.println("调用 changeDate 之后 : " + str1); } public static void changeDate( String str2) { str2 = "www.haicoder.net"; } }

运行结果如下:

22 String类型引用.png

之前我们讲过,String 类型是一个特殊的类,它是 final 类型的,所以重新赋值的时候,新开辟了一个堆空间

23 String 类型引用类型原理.png

Java引用类型传递总结

如果是普通类的对象里面的参数,指向的引用里面改变了,再访问的时候,对应的堆里面数据也改变了,但是 String 类型的数据是特殊的数据,它的改变只会新建一个堆内存空间。可以将上面的原理图记住。