String是值傳遞還是引用傳遞

        Java參數傳遞分爲值傳遞和引用傳遞,基本類型是值傳遞,封裝的對象時引用傳遞。

        先看一下值傳遞,引用傳遞和String參數傳遞的Demo:

值傳遞:

/**
 * 值傳遞
 * @author Administrator
 *
 */
public class Demo29 {
	public static void main(String[] args) {
		boolean flag = false;
		test29(flag);
		System.out.println(flag);
	}
	
	public static void test29(boolean flag) {
		flag = true;
	}
}

值傳遞的結果是:

false

分析:

flag傳入test29()方法時,jvm實際上是複製了一份參數傳入方法中。

可以理解成傳入方法的參數是temp,值是false。

方法裏的flag = true;可以理解成給temp賦值true。

System.out輸出的參數實際上是main方法中定義的flag,跟test29()方法裏的temp參數沒有半毛錢關係。

從內存分配的角度來看,棧中是有兩個變量的。一個是main方法中定義的flag,另外一個是在傳參時jvm複製的一份flag,我們就叫它temp。不論temp值怎麼改變,flag是不會變的。

 

引用傳遞:

/**
 * 引用傳遞
 * @author Administrator
 *
 */
public class Demo30 {
	public static void main(String[] args) {
		Person person = new Person();
		person.setA(12);
		change(person);
		System.out.println(person.getA());
	}
	
	public static void change(Person person) {
		person.setA(15);
	}
}

class Person{
	private int a;

	public int getA() {
		return a;
	}

	public void setA(int a) {
		this.a = a;
	}
	
}

引用傳遞結果:

15

分析:

main方法new Person時,jvm在堆中分配了一塊內存用於存放Person對象。並且在棧中存放一個person對象,值是指向堆中Person對象的地址。

把person變量傳入change()方法時,jvm複製了一份person變量。爲了便於理解我們叫它temp,temp的值和person是一樣的,都是指向堆中Person對象的地址。

Person對象的屬性的值改變時,person變量指向的是Person,所以輸出person指向的對象的屬性的值,就是改變過後的值。

 

String參數傳遞: 

/**
 * String
 * @author Administrator
 *
 */
public class Demo31 {
	public static void main(String[] args) {
		String str = "abc";
		change(str);
		System.out.println(str);
	}
	
	public static void change(String str) {
		str = "bcd";
	}
}

String參數傳遞結果:

abc

分析:

jvm在實例化字符串時會使用字符串常量池,把str作爲參數傳入change()方法。jvm複製了一份str變量,爲了便於理解我們叫它temp。這個時候str和temp都指向字符串常量池中的“abc”。

當我們給temp變量賦值“bcd”時,jvm會實例化“bcd”並將它放進常量池中。這個過程可以看成是:

temp = new String("bcd");

這個時候temp指向的是常量池中的“bcd”。

那麼當我們輸出str時,str指向的仍然是“abc”。

 

 

如果看完這篇仍然覺得不清楚,請移步下面兩篇文章:

本文參考文章:

1.深入理解Java中的String:https://www.cnblogs.com/xiaoxi/p/6036701.html

2.String是值傳遞還是引用傳遞:https://www.cnblogs.com/boboooo/p/9066831.html

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章