Java方法之參數傳遞機制


Java方法之參數傳遞機制

Java方法中如果聲明了形參,在調用方法時就必須給這些形參指定參數值,實際傳進去的這個值就叫做實參
這就涉及到Java中的參數傳遞機制,值傳遞

基本數據類型

基本數據類型,值傳遞的體現是數值的傳遞。

public class TransferTempTest {
    public static void main(String[] args) {
        //基本數據類型參數傳遞
        TransferTempTest test = new TransferTempTest();
        int num1 = 10;
        int num2 = 20;
        System.out.println("進行交換前:");
        System.out.println("num1 = " + num1 + ",num2 = " + num2);
        test.swap(num1, num2);
        System.out.println("交換之后:");
        System.out.println("num1 = " + num1 + ",num2 = " + num2);
    }
   public void swap(int a, int b) {
        int temp = a;
        a = b;
        b = temp;
        System.out.println("交換過程中:");
        System.out.println("num1 = " + a + ",num2 = " + b);
    }
}
//運行結果
進行交換前:
num1 = 10,num2 = 20
交換過程中:
num1 = 20,num2 = 10
交換之后:
num1 = 10,num2 = 20

整個過程的內存圖演示:

如圖所示:

  1. 在堆內存中創建 TransferTempTest類型的對象,假設此時地址值時0x1177(只是假設),並讓棧內存中的引用變量test存儲0x1177,指向該對象。
  2. 在棧內存中聲明兩個變量num1和num2,並為他們賦值10和20。這時可以看到打印的結果為:num1 = 10,num2 = 20
  3. 程序繼續向下,進入swap方法,首先在棧區聲明兩個變量a和b,他們都是形參,這時將num1和num2的分別傳入,此時如藍色字體所顯示,a=10,b=20。
  4. 接着還是在棧區聲明一個名為temp的變量,這時執行的交換過程是在swap方法中,交換的變量其實是num1和num2的拷貝值,所以方法內打印:num1 = 20,num2 = 10
  5. 最后,退出這個方法,局部變量銷毀,發現其實一頓操作,原先的值根本就沒有改變,打印結果和原先一樣:num1 = 10,num2 = 20

引用數據類型

基本數據類型,值傳遞的體現是地址值的傳遞。

public class TransferTempTest {
    public static void main(String[] args) {
    //引用類型參數傳遞
        DataTemp data = new DataTemp();
        data.a = 2;
        data.b = 4;
        System.out.println("進行交換前:");
        System.out.println("data.a = " + data.a + ",data.b = " + data.b);
        data.swapClass(data);
        System.out.println("進行交換后:");
        System.out.println("data.a = " + data.a + ",data.b = " + data.b);
    }
}
class DataTemp {
    int a;
    int b;

    public void swapClass(DataTemp data) {
        int temp = data.a;
        data.a = data.b;
        data.b = temp;
        System.out.println("交換過程中:");
        System.out.println("data.a = " + data.a + ",data.b = " + data.b);

    }
}
//運行結果
進行交換前:
data.a = 2,data.b = 4
交換過程中:
data.a = 4,data.b = 2
進行交換后:
data.a = 4,data.b = 2

整個過程的內存圖顯示:

如圖所示:

  1. 在堆內存中創建DataTemp類型的對象,並讓棧內存中的引用變量data存儲0x7788(假設地址值),指向該對象,實例變量a和b的初始值都是0。
  2. 讓data.a=2,data.b=4,如藍色字體顯示,這時打印:data.a = 2,data.b = 4
  3. 進入swapClass方法,首先在棧區聲明形參變量data,將原來的data的地址值傳入,紅黑兩個data不是同一個!!,紅色data只是黑色data的拷貝值,且拷貝的是地址值。這時兩個data指向同一片堆區內存,如紅色箭頭顯示。
  4. 接着還是在棧區聲明一個名為temp的變量,參與交換操作,這時操作的是堆區的數據,所以方法里顯然打印:data.a = 4,data.b = 2
  5. 最后,退出這個方法,局部變量銷毀,執行的交換過程雖然是在swapClass方法中,但引用變量傳入形參傳遞的是地址值,意味着,這時的交換操作直接對堆區對象生效,所以最終交換成立:data.a = 4,data.b = 2

綜合練習

package com.my.pac05;

public class TransferTest {
    public static void main(String[] args) {
        TransferTest test = new TransferTest();
        test.first();
    }

    public void first() {
        int i = 5;
        Value v = new Value();

        v.i = 25;
        second(v, i);
        System.out.println(v.i);
    }

    public void second(Value v, int i) {
        i = 0;
        v.i = 20;
        Value val = new Value();
        v = val;
        System.out.println(v.i + " " + i);
    }
}

class Value {
    int i = 15;
}
//運行結果
15 0
20

整個過程的內存圖顯示:

總結

  • 方法不能修改基本數據類型的參數,他們改變的僅僅是他們的拷貝。
  • 方法可以改變對象參數的狀態,因為方法可以通過對象引用的拷貝修改對象狀態。
  • 方法不能讓對象參數引用一個新的對象,方法得到的永遠都是拷貝值。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM