- 給出了基本類型和引用類型參數傳遞時行為的示例,并給出了String類型作為參數傳遞時表現出的和一般引用類型傳遞行為不同的原因
- 使用基本類型進行參數傳遞時的代碼示例
public class Test1 {
public static void main(String[] args) {
int n = 3;
System.out.println("Before change, n = " + n);
changeData(n);
System.out.println("After changeData(n), n = " + n);
}
public static void changeData(int nn) {
n = 10;
}
}
**基本類型作為參數傳遞時,是傳遞值的拷貝,無論你怎么改變這個拷貝,原值是不會改變的
**,輸出的結果證明了這一點:
Before change, n = 3
After changeData(n), n = 3使用引用類型進行參數傳遞的代碼示例
public class Test2 {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("Hello ");
System.out.println("Before change, sb = " + sb);
changeData(sb);
System.out.println("After changeData(n), sb = " + sb);
}
public static void changeData(StringBuffer strBuf) {
strBuf.append("World!");
}
}
-
在Java中對象作為參數傳遞時,是把對象在內存中的地址拷貝了一份傳給了參數,
Test2輸出結果
Before change, sb = Hello
After changeData(n), sb = Hello World! - 傳遞引用型參數,并在子方法中對參數進行變更的一種情況
public class Test3 {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("Hello ");
System.out.println("Before change, sb = " + sb);
changeData(sb);
System.out.println("After changeData(n), sb = " + sb);
}
public static void changeData(StringBuffer strBuf) {
strBuf = new StringBuffer("Hi ");
strBuf.append("World!");
}
}
運行一下這個程序,結果是這樣的:
Before change, sb = Hello
After changeData(n), sb = Hello
- 通過分析Java參數傳遞時的內存模型,給出了Java參數傳遞時內存中實際發生的行為
- 基本類型代碼示例和內存模型示意圖
public class ParameterTransfer {
public static void main(String[] args) {
int num = 30;
System.out.println("調用add方法前num=" + num);
add(num);
System.out.println("調用add方法后num=" + num);
}
public static void add(int param) {
param = 100;
}
}
調用前num變量內存狀態
方法調用發生時全局變量num和add方法參數num的內存狀態
- 兩個變量的內存都被分配在棧中,從內存地址的角度來看,對8600地址的修改,不會反映到8500地址上面
- 使用引用類型時的代碼示例和內存模型示例
public class ParameterTransfer {
public static void main(String[] args) {
String[] array = new String[] {"huixin"};
System.out.println("調用reset方法前array中的第0個元素的值是:" + array[0]);
reset(array);
System.out.println("調用reset方法后array中的第0個元素的值是:" + array[0]);
}
public static void reset(String[] param) {
param[0] = "hello, world!";
}
}
調用前全局array變量的內存狀態
調用時全局array變量和方法參數array的內存狀態
在reset方法中進行修改后,兩個array變量的內存狀態
在Java語言中,以String作為類型的變量在作為方法參數時所表現出的“非對象”的特性
基本結論
基本類型作為參數傳遞時,是傳遞值的拷貝,無論你怎么改變這個拷貝,原值是不會改變的
****在****Java****中對象作為參數傳遞時,是把對象在內存中的地址拷貝了一份傳給了參數****
****在參數列表中的變量,和傳遞進方法的參數,不在同一個地址上面****