您好,登錄后才能下訂單哦!
本文實例講述了Java方法的參數傳遞機制。分享給大家供大家參考,具體如下:
參數傳遞機制
對于程序設計語言來說,一般方法(函數)的參數傳遞有兩種:按值傳遞和按引用傳遞。
按值傳遞意味著當將一個參數傳遞給一個方法時,方法接收的是原始值的一個副本。因此,如果方法修改了該參數,僅改變副本,而原始值保持不變。按引用傳遞意味著當將一個參數傳遞給一個方法時,方法接收的是原始值的內存地址,而不是值的副本。因此,如果方法修改了該參數,調用代碼中的原始值也隨之改變。
需要注意的是,方法可以修改按引用傳遞的參數對應的變量值,但不可以修改按值傳遞的參數對應的變量值,這是兩者的最大區別。
Java中的參數傳遞
Java中的參數傳遞機制只有一種,就是值傳遞。在Java中并沒有C++的引用傳遞這種參數傳遞機制,它所有的參數傳遞都遵循值傳遞的機制。
Java中對于對象(數組,類,接口)的傳遞似乎有點像引用傳遞,可以改變對象中某個屬性的值。但是不要被這個假象所蒙蔽,實際上這個傳入方法的值是對象引用的拷貝,即傳遞的是引用的地址值,所以還是按值傳遞。
基本類型的參數傳遞
在方法調用時,傳遞的參數是按值的拷貝傳遞;
public class Test { public static void main(String[] args) { Test t = new Test(); int a = 5; t.method(a); // 傳遞后,method方法對變量值的改變不影響這里的a System.out.println("method調用完后的a: " + a); } private void method(int a){ System.out.println("method中重新賦值之前的a: " + a); a = 10; System.out.println("method中重新賦值之后的a: " + a); } }
執行結果如下:
method中重新賦值之前的a: 5 method中重新賦值之后的a: 10 method調用完后的a: 5
由此可知按值傳遞重要特點:傳遞的是值的拷貝,也就是說傳遞后就互不相關了。下面看一下內存分析:
引用類型的參數傳遞
在方法調用時,傳遞的參數按引用進行傳遞,其實傳遞的引用的地址,也就是變量所對應的內存空間的地址。
public class Test { public static void main(String[] args) { Person person = new Person(); person.age = 18; // 把main方法中的變量person所引用的內存空間地址,按引用傳遞給method方法中的person變量 // 請注意:這兩個person變量是完全不同的,不要被名稱相同所蒙蔽 method(person); System.out.println("調用method方法之后:" + person.age); } public static void method(Person person){ person.age = 20; System.out.println("method方法內第一次修改:" + person.age); person = new Person(); // 新創建一個對象 person.age = 25; System.out.println("method方法內第二次修改:" + person.age); } } class Person { public int age; }
執行結果如下:
method方法內第一次修改:20 method方法內第二次修改:25 調用method方法之后:20
這里傳遞的是值的引用,也就是說傳遞前和傳遞后都指向同一個引用(也就是同一個內存空間)。
下面我們接著看一個例子:
public class Test { public static void main(String[] args) { int[] a = {5, 10}; method(a); System.out.println("調用完method方法之后:" + a[0]); } public static void method(int[] a){ System.out.println("method內修改a[0]之前:" + a[0]); a[0] = 50; System.out.println("method內修改a[0]之后:" + a[0]); } }
執行結果如下:
method內修改a[0]之前:5 method內修改a[0]之后:50 調用完method方法之后:50
根據結果可知,調用method方法時實際傳遞的是引用的地址值。
傳遞String類型的參數
由于String類是final修飾的,不可變,它會在內存中在開辟一塊新空間。
public class Test { public static void main(String[] args) { String str1 = new String("test1"); String str2 = "test2"; method(str1, str2); System.out.println("調用method傳參str1之后:" + str1 + ", " + str2); } public static void method(String str1, String str2){ System.out.println("method內修改str之前:" + str1 + ", " + str2); str1 = "new1"; str2 = "new2"; System.out.println("method內修改str之后:" + str1 + ", " + str2); } }
執行結果如下:
method內修改str之前:test1, test2 method內修改str之后:new1, new2 調用method傳參str1之后:test1, test2
總結:
1)基本數據類型傳遞的是值的復制,對一個參數的修改不會影響另一個參數;
2)引用類型傳引用,形參和實參指向同一個內存地址(同一個對象),所以對參數的修改會影響到實際的對象;
3)String、Integer、Double等immutable的類型特殊處理,可以理解為傳值,最后的操作不會修改實參對象(與基本數據類型一致)。
更多java相關內容感興趣的讀者可查看本站專題:《Java面向對象程序設計入門與進階教程》、《Java數據結構與算法教程》、《Java操作DOM節點技巧總結》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對大家java程序設計有所幫助。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。