您好,登錄后才能下訂單哦!
本篇內容主要講解“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
如圖所示:
在堆內存中創建 TransferTempTest類型的對象,假設此時地址值時0x1177(只是假設),并讓棧內存中的引用變量test存儲0x1177,指向該對象。 在棧內存中聲明兩個變量num1和num2,并為他們賦值10和20。這時可以看到打印的結果為:num1 = 10,num2 = 20 程序繼續向下,進入swap方法,首先在棧區聲明兩個變量a和b,他們都是形參,這時將num1和num2的值分別傳入,此時如藍色字體所顯示,a=10,b=20。 接著還是在棧區聲明一個名為temp的變量,這時執行的交換過程是在swap方法中,交換的變量其實是num1和num2的拷貝值,所以方法內打印:num1 = 20,num2 = 10 最后,退出這個方法,局部變量銷毀,發現其實一頓操作,原先的值根本就沒有改變,打印結果和原先一樣: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
如圖所示:
在堆內存中創建DataTemp類型的對象,并讓棧內存中的引用變量data存儲0x7788(假設地址值),指向該對象,實例變量a和b的初始值都是0。 讓data.a=2,data.b=4,如藍色字體顯示,這時打印:data.a = 2,data.b = 4 進入swapClass方法,首先在棧區聲明形參變量data,將原來的data的地址值傳入,紅黑兩個data不是同一個!!,紅色data只是黑色data的拷貝值,且拷貝的是地址值。這時兩個data指向同一片堆區內存,如紅色箭頭顯示。 接著還是在棧區聲明一個名為temp的變量,參與交換操作,這時操作的是堆區的數據,所以方法里顯然打印:data.a = 4,data.b = 2 最后,退出這個方法,局部變量銷毀,執行的交換過程雖然是在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 020
總結
方法不能修改基本數據類型的參數,他們改變的僅僅是他們的拷貝。 方法可以改變對象參數的狀態,因為方法可以通過對象引用的拷貝修改對象狀態。 方法不能讓對象參數引用一個新的對象,方法得到的永遠都是拷貝值。
到此,相信大家對“Java方法參數傳遞機制的原理解析”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。