java传递实例_Java方法的参数传递机制实例详解
本文實例講述了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方法的参数传递机制实例详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 百行征信对个人有什么影响
- 下一篇: 中证500火了 相关ETF出现限购