我们在 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;
}
}
运行结果如下:
我们从运行结果中看到,对应的 quote
对象里面的 num
属性值变化了,变成了我们 changeDate
里面赋的值。
原理如下:
在调用 changeDate 方法的时候,我们传递的参数是 quote
的一个对象,即 quote
对应的栈上面的引用,所以我们在调用 changeDate
方法的时候,修改了传递的变量的数据,再打印出里面的 num
的时候是改变后的数据。
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";
}
}
运行结果如下:
之前我们讲过,String 类型是一个特殊的类,它是 final 类型的,所以重新赋值的时候,新开辟了一个堆空间
如果是普通类的对象里面的参数,指向的引用里面改变了,再访问的时候,对应的堆里面数据也改变了,但是 String 类型的数据是特殊的数据,它的改变只会新建一个堆内存空间。可以将上面的原理图记住。