2017-10-31課堂作業02
解釋參數在方法中的傳遞過程,並通過內存解析圖的方式,描繪出方法執行時內存的變化。
參數的傳遞都是「值傳遞」,在調用方法的時候,參數會被創造出一個副本,原本的值是不會改變的。
基本數據類型,也稱爲「值類型」
- 基本數據類型的值傳遞
class Test {
//寫一個方法用於計算兩個值都加5
public static void fun1(int i, int j) {
i = i + 5;
j = j + 5;
System.out.println("方法內輸出" + i);
System.out.println("方法內輸出" + j);
}
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println("調用方法前a的值:" + a);
System.out.println("調用方法前b的值:" + b);
fun1(a,b);
System.out.println("調用方法後a的值:" + a);
System.out.println("調用方法後b的值:" + b);
}
}
最後輸出結果:
調用方法前a的值:10
調用方法前b的值:20
方法內輸出:15
方法內輸出:25
調用方法後a的值:10
調用方法後b的值:20
下邊通過內存模型來分析一下。
1、main()方法順序執行,當執行了int a =10; b = 20;這兩句代碼後,程序在棧內存中開闢了兩個空間,裏邊分別存放的值是10,20,內存模型如下圖:
2、執行輸出語句,此時輸出的a =10 ,b = 20;
System.out.println("調用方法前a的值:" + a);
System.out.println("調用方法前b的值:" + b);
3、執行方法fun1(),程序在棧內存中又開闢了兩塊塊空間,分別存放a,b的副本a’與b‘,將a ,b 的值傳遞過去,執行a’= a’ + 5 , b’ = b’+5,輸出a’,b’。內存模型如下圖:
fun1(a,b);
a , b 的值與 a’ 和 b’ 的值沒有關聯,不會受其影響。所以運行方法後再輸出a,b的值時,其沒有發生變化,仍然是10與20。
- 引用類型的值傳遞
class P {
int a;
int b;
}
class Test1 {
public static void fun1(P p) {
p.a = p.a + 5;
p.b = p.b + 5;
System.out.println("方法內輸出:" + p.a);
System.out.println("方法內輸出:" + p.b);
}
public static void main(String[] args) {
P p = new P();
p.a = 10;
p.b = 20;
System.out.println("調用方法前p.a的值:" + p.a);
System.out.println("調用方法前p.b的值:" + p.b);
fun1(p);
System.out.println("調用方法後p.a的值:" + p.a);
System.out.println("調用方法後p.b的值:" + p.b);
}
}
最後的輸出結果:
調用方法前p.a的值:10
調用方法前p.b的值:20
方法內輸出:15
方法內輸出:25
調用方法後p.a的值:15
調用方法後p.b的值:25
下邊通過內存模型來分析一下。
1、首先定義一個類P,作爲引用類型來使用。
2、main()方法順序執行,執行P p = new P();時,內存空間發生瞭如下事件
執行 p.a = 10; p.b = 20; 內存空間發生如下事件
執行輸出語句,此時輸出的p.a =10 ,p.b = 20;
3、執行方法fun1(),程序在棧內存中又開闢了新空間,用於存放p的副本p’,將p的值0x0001傳遞過去,此時p與p’都指向棧區的0x0001
執行
p'.a = p'.a + 5;
p'.b = p'.b + 5;
執行
System.out.println("方法內輸出:" + p.a);
System.out.println("方法內輸出:" + p.b);
輸出p’.a = 15 ;p’.b = 25;
4、再次執行
System.out.println("調用方法後p.a的值:" + p.a);
System.out.println("調用方法後p.b的值:" + p.b);
由於p也是指向0x0001,堆內存中的值已經改變,所以此時輸出p.a = 15; p.b=25;
總結一下:如果方法中傳入的是基本數據類型,那麼原變量的值是不會發生改變的,如果方法中傳入的是引用數據類型(即類類型),那麼傳入方法中,如果對對象的相關屬性進行了修改,那麼原對象的相關屬性也會發生改變。