中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java方法的參數傳遞機制實例詳解

發布時間:2020-09-19 09:24:08 來源:腳本之家 閱讀:131 作者:下班后的爪哇菌 欄目:編程語言

本文實例講述了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

由此可知按值傳遞重要特點:傳遞的是值的拷貝,也就是說傳遞后就互不相關了。下面看一下內存分析:

Java方法的參數傳遞機制實例詳解

引用類型的參數傳遞

在方法調用時,傳遞的參數按引用進行傳遞,其實傳遞的引用的地址,也就是變量所對應的內存空間的地址。

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

這里傳遞的是值的引用,也就是說傳遞前和傳遞后都指向同一個引用(也就是同一個內存空間)。

Java方法的參數傳遞機制實例詳解

下面我們接著看一個例子:

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方法時實際傳遞的是引用的地址值。

Java方法的參數傳遞機制實例詳解

傳遞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程序設計有所幫助。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

静宁县| 府谷县| 汝州市| 康马县| 泊头市| 且末县| 会同县| 昌图县| 奉节县| 通化市| 电白县| 兴城市| 德清县| 镇平县| 民勤县| 石家庄市| 普宁市| 武定县| 玉树县| 宝山区| 安阳县| 南阳市| 缙云县| 德安县| 东台市| 临沭县| 宁波市| 襄垣县| 清涧县| 定远县| 成安县| 营山县| 上饶市| 山丹县| 江永县| 武清区| 攀枝花市| 辽中县| 蕲春县| 吴旗县| 司法|