答:是值傳遞。Java編程語言只有值傳遞參數。當一個對象實例作爲一個參數被傳遞到方法中時,參數的值就是該對象的引用一個副本。指向同一個對象,對象的內容可以在被調用的方法中改變,但對象的引用(不是引用的副本)是永遠不會改變的。
在 Java應用程序中永遠不會傳遞對象,而只傳遞對象引用。因此是按引用傳遞對象。但重要的是要區分參數是如何傳遞的,這纔是該節選的意圖。Java應用程序按引用傳遞對象這一事實並不意味着 Java 應用程序按引用傳遞參數。參數可以是對象引用,而 Java應用程序是按值傳遞對象引用的。
Java應用程序中的變量可以爲以下兩種類型之一:引用類型或基本類型。當作爲參數傳遞給一個方法時,處理這兩種類型的方式是相同的。兩種類型都是按值傳遞的;沒有一種按引用傳遞。
按值傳遞意味着當將一個參數傳遞給一個函數時,函數接收的是原始值的一個副本。因此,如果函數修改了該參數,僅改變副本,而原始值保持不變。按引用傳遞意味着當將一個參數傳遞給一個函數時,函數接收的是原始值的內存地址,而不是值的副本。因此,如果函數修改了該參數的值,調用代碼中的原始值也隨之改變。如果函數修改了該參數的地址,調用代碼中的原始值不會改變.
當傳遞給函數的參數不是引用時,傳遞的都是該值的一個副本(按值傳遞)。區別在於引用。在 C++中當傳遞給函數的參數是引用時,您傳遞的就是這個引用,或者內存地址(按引用傳遞)。在 Java應用程序中,當對象引用是傳遞給方法的一個參數時,您傳遞的是該引用的一個副本(按值傳遞),而不是引用本身。
Java 應用程序按值傳遞參數(引用類型或基本類型),其實都是傳遞他們的一份拷貝.而不是數據本身.(不是像 C++中那樣對原始值進行操作。)
例1
//在函數中傳遞基本數據類型,
public class Test {
public static void change( int i, int j) {
int temp = i;
i = j;
j = temp;
}
public static void main(String[] args) {
int a = 3 ;
int b = 4 ;
change(a, b);
System.out.println( "a=" + a);
System.out.println( "b=" + b);
}
}
結果爲: a=3 b=4
原因就是 參數中傳遞的是 基本類型 a 和 b 的拷貝,在函數中交換的也是那份拷貝的值 而不是數據本身;
例2:
//傳的是引用數據類型
public class Test {
public static void change( int [] counts) {
counts[ 0 ] = 6 ;
System.out.println(counts[ 0 ]);
}
public static void main(String[] args) {
int [] count = { 1 , 2 , 3 , 4 , 5 };
change(count);
}
} <span>
</span>
6original : 6
在方法中 傳遞引用數據類型int數組,實際上傳遞的是其引用count的拷貝,他們都指向數組對象,在方法中可以改變數組對象的內容。即:對複製的引用所調用的方法更改的是同一個對象。
例3:
//對象的引用(不是引用的副本)是永遠不會改變的
class A {
int i = 0 ;
}
public class Test {
public static void add(A a) {
a = new A();
a.i++;
}
public static void main(String args[]) {
A a = new A();
add(a);
System.out.println(a.i);
}
}
輸出結果是 0 在該程序中,對象的引用指向的是A ,而在change方法中,傳遞的引用的一份副本則指向了一個新的OBJECT,並對其進行操作。
而原來的A對象並沒有發生任何變化。 引用指向的是還是原來的A對象。