Java當中其實都是值傳遞?

在Java中值傳遞和引用傳遞是不同的,怎麼個不同法呢?他們在內存當中的結構是怎麼樣的咱們經過四個示例,來給你們說道說道,java

示例一:值傳遞 spa

public class ValueDemo{
	public static void main(String[] args){
		int x = 10;//咱們定義了一個基本數據類型的局部變量 是存在棧裏邊的
		method(x) ;
		System.out.println(「x=」+x) ;
	}
	public static void method(int mx){
		mx = 20;
	}
}
複製代碼

結果是多少呢?是10,爲何是10呢。3d

由於基本數據類型的變量是存在棧內存的,因此method入棧,而後傳值的時候,是把x複製一份傳給mx,而後method方法mx變成20,是複製品變成了20,然而x仍是10.其實Java當中都是值傳遞,爲何要分值傳遞和引用傳遞呢?接着往下看code

示例二:引用傳遞
複製代碼
public class RefDemo1{
	public static void main(String[] args){
		Duck d  = new Duck();
		method(d) ;
		System.out.println(「Duck age = 」+d.age) ;
	}
	public static void method(Duck duck){
		duck.age = 5;
	}
}
class Duck{
 	int age = 2;   //省略封裝
}
複製代碼

其實引用傳遞也是一種值傳遞,只不過他的值不是具體的數據,他的值是一個地址,因此叫它引用傳遞 這裏咱們寫了一個類鴨子類,它有一個年齡2,而後咱們用產生對象的方法new 關鍵字 ,new了一個鴨子,而後將這個實例d,傳進了method,而後將duck的age變成了5,而後再輸出鴨子的年齡,結果是什麼呢?確定不是2了,若是是2引用傳遞就沒有意義了和值傳遞不就同樣了嗎啊哈哈哈!最後的結果是5,爲啥呢?看我再給你分析一波!先來一張藝術品畫圖cdn

由於呀這個duck是引用類型的數據,因此它在執行玩Duck d = new Duck()內存結構是棧內存裏存的內存地址,堆內存裏存的屬性啥的,method方法執行的時候,它仍是複製了一份傳進去,此次它複製的是棧內存裏的地址,而後method方法改變的age,由於是同一個地址,因此d.age就被更改爲了5.你覺得這樣值傳遞和引用傳遞就完了,四種狀況呢,還有兩種沒說呢!

示例三:String傳遞
複製代碼
public class RefDemo2{
	public static void main(String[] args){
		String name = 「小飛」;
		method(name) ;
		System.out.println(「name=」+name) ;
	}
	public static void method(String sname){
		sname = 「小備」;
	}
}
複製代碼

示例三的結果爲啥輸出的是小飛呢?字符串不是引用類型的變量嗎?what,咱們繼續看內存結構對象

because字符串自己就是個對象,方法傳值的時候 和之前同樣也是傳的地址,不同的是sname="小備","小備"它就至關於建立了個對象,至關於new了一個對象,小飛和小備不是一個實例了,sname="小備"sname的指向就變成了小備,而name的指向仍是"小飛",這也是字符串一個特殊的地方

示例四:String傳遞
複製代碼
public class RefDemo3{
	public static void main(String[] args){
		Person p  = new Person();
		method(p) ;
		System.out.println(「person name= 」+p.name) ;
	}
	public static void method(Person p ){
		p.name = 「備備」;
	}
}
class Person{
 	String name = 「飛飛」;   //省略封裝
}
複製代碼

此次若是讓我猜的話 應該就是備備了,爲啥是備備了呢?接着上圖blog

這個圖仍是挺複雜的,一步一步的分析,先實例化一個Person p,棧內存裏存的p的地址,堆裏面存的是Person這個實例, 而後p裏面的name它也是一個引用類型的變量因此name存的也是一個地址,而後它指向了"飛飛"這塊地址爲0x0055的內存,傳給method的依然是0x0044這個地址,而後p.name="備備",name的指向由指向0x0044,指向了備備的內存地址0x0066,p的name的地址變了,加黑的那一句話!理解關鍵就是分析完畢!
相關文章
相關標籤/搜索