首先來看一段代碼:java
User類:數組
1 public class User { 2 private String name; 3 4 public String getName() { 5 return name; 6 } 7 8 public void setName(String name) { 9 this.name = name; 10 } 11 12 }
測試類:測試
1 public class Demo1 { 2 public static void main(String[] args) { 3 User user=new User(); 4 List<User> list=new ArrayList<User>(); 5 list.add(user); 6 user.setName("李四"); 7 System.out.println(list.get(0).getName()); 8 } 9 }
你們根據本身的理解來獲得本身認爲輸出的結果,看看和接下來打印出的結果是否一致。this
程序運行結果:spa
這兒,就要講到java中的值傳遞和引用傳遞概念了:code
值傳遞:(形式參數類型是基本數據類型):方法調用時,實際參數把它的值傳遞給對應的形式參數,形式參數只是用實際參數的值初始化本身的存儲單元內容,是兩個不一樣的存儲單元,因此方法執行中形式參數值的改變不影響實際參數的值。對象
引用傳遞:(形式參數類型是引用數據類型參數):也稱爲傳地址。方法調用時,實際參數是對象(或數組),這時實際參數與形式參數指向同一個地址,在方法執行中,對形式參數的操做實際上就是對實際參數的操做,這個結果在方法結束後被保留了下來,因此方法執行中形式參數的改變將會影響實際參數。blog
根據上面的概念,咱們一塊兒來寫幾個demo來真正體會java中的值傳遞和引用傳遞區別:內存
按值傳遞:指的是在方法調用時,傳遞的參數是按值的拷貝傳遞。demo:字符串
1 public class TempTest { 2 private void test1(int a){ 3 //作點事情 4 } 5 public static void main(String[] args) { 6 TempTest t = new TempTest(); 7 int a = 3; 8 t.test1(a);//這裏傳遞的參數a就是按值傳遞 9 } 10 } 11
按值傳遞重要特色:傳遞的是值的拷貝,也就是說傳遞後就互不相關了。demo:
1 public class TempTest { 2 private void test1(int a){ 3 a = 5; 4 System.out.println("test1方法中的a="+a); 5 } 6 public static void main(String[] args) { 7 TempTest t = new TempTest(); 8 int a = 3; 9 t.test1(a);//傳遞後,test1方法對變量值的改變不影響這裏的a 10 System.out.println(」main方法中的a=」+a); 11 } 12 } 13
運行結果是:
按引用傳遞:指的是在方法調用時,傳遞的參數是按引用進行傳遞,其實傳遞的引用的地址,也就是變量所對應的內存空間的地址。demo:
1 public class TempTest { 2 private void test1(A a){ 3 } 4 public static void main(String[] args) { 5 TempTest t = new TempTest(); 6 A a = new A(); 7 t.test1(a); //這裏傳遞的參數a就是按引用傳遞 8 } 9 } 10 class A{ 11 public int age = 0; 12 }
按引用傳遞的重要特色是傳遞的是值的引用,也就是說傳遞前和傳遞後都指向同一個引用(也就是同一個內存空間)。demo:
1 public class TempTest { 2 private void test1(A a){ 3 a.age = 20; 4 System.out.println("test1方法中的age="+a.age); 5 } 6 public static void main(String[] args) { 7 TempTest t = new TempTest(); 8 A a = new A(); 9 a.age = 10; 10 t.test1(a); 11 System.out.println(」main方法中的age=」+a.age); 12 } 13 } 14 class A{ 15 public int age = 0; 16 }
運行結果是:
相信你們看了上面的例子和說明,已經對值傳遞和引用傳遞有了進一步的認識,最後再總結一下!
說明:
(1):「在Java裏面參數傳遞都是按值傳遞」這句話的意思是:按值傳遞是傳遞的值的拷貝,按引用傳遞其實傳遞的是引用的地址值,因此統稱按值傳遞。
(2):在Java裏面只有基本類型和按照下面這種定義方式的String是按值傳遞,其它的都是按引用傳遞。就是直接使用雙引號定義字符串方式:String str = 「Java私塾」;