在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
示例三: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,咱們繼續看內存結構對象
示例四: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