2017-10-31課堂作業02

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;

總結一下:如果方法中傳入的是基本數據類型,那麼原變量的值是不會發生改變的,如果方法中傳入的是引用數據類型(即類類型),那麼傳入方法中,如果對對象的相關屬性進行了修改,那麼原對象的相關屬性也會發生改變。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章