答:是值傳遞。Java編程語言只有值傳遞參數。java
當一個對象實例做爲一個參數被傳遞到方法中時,參數的值就是該對象的引用一個副本。指向同一個對象,對象的內容能夠在被調用的方法中改變,但對象的引用(不是引用的副本)是永遠不會改變的。編程
1.Java中沒有指針,因此也沒有引用傳遞了,僅僅有值傳遞。不過,能夠經過對象的方式來實現引用傳遞。相似java沒有多繼承,但能夠用屢次implements接口實現多繼承的功能。數組
2.在Java應用程序中永遠不會傳遞對象,而只傳遞對象的引用。所以是按引用傳遞對象。但重要的是要區分參數是如何傳遞的。編程語言
3.Java應用程序按引用傳遞對象這一事實並不意味着 Java 應用程序按引用傳遞參數。參數能夠是對象引用,而 Java應用程序是按值傳遞對象引用的。函數
4.Java應用程序中的變量能夠爲如下兩種類型之一:引用類型或基本類型。看成爲參數傳遞給一個方法時,處理這兩種類型的方式是相同的。兩種類型都是按值傳遞的,沒有一種按引用傳遞。spa
按值傳遞意味着當將一個參數傳遞給一個函數時,函數接收的是原始值的一個副本。所以,若是函數修改了該參數,僅改變副本,而原始值保持不變。指針
按引用傳遞意味着當將一個參數傳遞給一個函數時,函數接收的是原始值的內存地址,而不是值的副本。所以,若是函數修改了該參數的值,調用代碼中的原始值也隨之改變。若是函數修改了該參數的地址,調用代碼中的原始值不會改變。code
值傳遞:方法調用時,實際參數把它的值傳遞給對應的形式參數,方法執行中,對形式參數值的改變不影響實際參數的值。對象
// 在函數中傳遞的是基本數據類型 public class Test { public static void main(String[] args) { int a = 3; int b = 4; change(a, b); System.out.println("a=" + a); // 3 System.out.println("b=" + b); // 4 } public static void change(int i, int j) { int temp = i; i = j; j = temp; } } 結果爲: a=3 b=4
緣由:參數中傳遞的是基本數據類型a和b的拷貝,在函數中交換的也是那份拷貝的值,而不是數據自己。
// 在函數中傳的是引用數據類型 public class Test { public static void main(String[] args) { int[] count = { 1, 2, 3, 4, 5 }; change(count);
Sysout.out.println(count[0]); // 6 } public static void change(int[] counts) { counts[0] = 6; } }
結果爲: 6 緣由:在方法中,傳遞引用數據類型int數組,實際上傳遞的是該數組的地址值,他們都指向數組對象,在方法中能夠改變數組對象的內容。
// 傳遞的是對象的引用 class A { int i = 0; } public class Test { public static void main(String args[]) { A a = new A(); add(a); // 1 System.out.println(a.i); // 0 } public static void add(A a) { a = new A(); a.i++; System.out.println(a.i); } } 結果爲:
1
0 緣由:在該程序中,對象的引用指向的是A,而在add方法中,傳遞的引用的一份副本則指向了一個新的對象,並對新的對象進行操做。而原來的A對象並無發生任何變化。引用指向的是仍是原來的A對象。
// String 不改變,數組改變 public class Example { public static void main(String args[]) { Example ex = new Example(); ex.change(ex.str, ex.ch); System.out.print(ex.str + " and "); // good and System.out.println(ex.ch); // gbc } String str = new String("good"); // good 是常量,不能改 char[] ch = { 'a', 'b', 'c' }; public void change(String str, char ch[]) { str = "test ok"; // test ok 又是一個常量,也不能改 等價於 String str1 = new String("test ok"); ch[0] = 'g'; } } 結果爲: good and gbc 緣由:String類比較特別,看過String類代碼的都知道,String類是final修飾的。因此值是不變的。 函數中String對象引用的副本指向了另一個新String對象,而數組對象引用的副本沒有改變,而是改變對象中數據的內容。 對於對象類型,也就是Object的子類,若是你在方法中修改了它的成員的值,那個修改是生效的,方法調用結束後,它的成員是新的值;可是若是你把它指向一個其它的對象,方法調用結束後,原來對它的引用並沒用指向新的對象。