溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java方法的參數(shù)傳遞機(jī)制實(shí)例詳解

發(fā)布時(shí)間:2020-09-19 09:24:08 來(lái)源:腳本之家 閱讀:130 作者:下班后的爪哇菌 欄目:編程語(yǔ)言

本文實(shí)例講述了Java方法的參數(shù)傳遞機(jī)制。分享給大家供大家參考,具體如下:

參數(shù)傳遞機(jī)制

對(duì)于程序設(shè)計(jì)語(yǔ)言來(lái)說(shuō),一般方法(函數(shù))的參數(shù)傳遞有兩種:按值傳遞和按引用傳遞。

按值傳遞意味著當(dāng)將一個(gè)參數(shù)傳遞給一個(gè)方法時(shí),方法接收的是原始值的一個(gè)副本。因此,如果方法修改了該參數(shù),僅改變副本,而原始值保持不變。按引用傳遞意味著當(dāng)將一個(gè)參數(shù)傳遞給一個(gè)方法時(shí),方法接收的是原始值的內(nèi)存地址,而不是值的副本。因此,如果方法修改了該參數(shù),調(diào)用代碼中的原始值也隨之改變。

需要注意的是,方法可以修改按引用傳遞的參數(shù)對(duì)應(yīng)的變量值,但不可以修改按值傳遞的參數(shù)對(duì)應(yīng)的變量值,這是兩者的最大區(qū)別。

Java中的參數(shù)傳遞

Java中的參數(shù)傳遞機(jī)制只有一種,就是值傳遞。在Java中并沒(méi)有C++的引用傳遞這種參數(shù)傳遞機(jī)制,它所有的參數(shù)傳遞都遵循值傳遞的機(jī)制。

Java中對(duì)于對(duì)象(數(shù)組,類,接口)的傳遞似乎有點(diǎn)像引用傳遞,可以改變對(duì)象中某個(gè)屬性的值。但是不要被這個(gè)假象所蒙蔽,實(shí)際上這個(gè)傳入方法的值是對(duì)象引用的拷貝,即傳遞的是引用的地址值,所以還是按值傳遞。

基本類型的參數(shù)傳遞

在方法調(diào)用時(shí),傳遞的參數(shù)是按值的拷貝傳遞;

public class Test {
  public static void main(String[] args) {
    Test t = new Test();
    int a = 5;
    t.method(a); // 傳遞后,method方法對(duì)變量值的改變不影響這里的a
    System.out.println("method調(diào)用完后的a: " + a);
  }
  private void method(int a){
    System.out.println("method中重新賦值之前的a: " + a);
    a = 10;
    System.out.println("method中重新賦值之后的a: " + a);
  } 
}

執(zhí)行結(jié)果如下:

method中重新賦值之前的a: 5
method中重新賦值之后的a: 10
method調(diào)用完后的a: 5

由此可知按值傳遞重要特點(diǎn):傳遞的是值的拷貝,也就是說(shuō)傳遞后就互不相關(guān)了。下面看一下內(nèi)存分析:

Java方法的參數(shù)傳遞機(jī)制實(shí)例詳解

引用類型的參數(shù)傳遞

在方法調(diào)用時(shí),傳遞的參數(shù)按引用進(jìn)行傳遞,其實(shí)傳遞的引用的地址,也就是變量所對(duì)應(yīng)的內(nèi)存空間的地址。

public class Test {
  public static void main(String[] args) {
    Person person = new Person();
    person.age = 18;
    // 把main方法中的變量person所引用的內(nèi)存空間地址,按引用傳遞給method方法中的person變量
    // 請(qǐng)注意:這兩個(gè)person變量是完全不同的,不要被名稱相同所蒙蔽
    method(person);
    System.out.println("調(diào)用method方法之后:" + person.age);
  }
  public static void method(Person person){
    person.age = 20;
    System.out.println("method方法內(nèi)第一次修改:" + person.age);
    person = new Person(); // 新創(chuàng)建一個(gè)對(duì)象
    person.age = 25;
    System.out.println("method方法內(nèi)第二次修改:" + person.age);
  }
}
class Person {
  public int age;
}

執(zhí)行結(jié)果如下:

method方法內(nèi)第一次修改:20
method方法內(nèi)第二次修改:25
調(diào)用method方法之后:20

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

Java方法的參數(shù)傳遞機(jī)制實(shí)例詳解

下面我們接著看一個(gè)例子:

public class Test {
  public static void main(String[] args) {
    int[] a = {5, 10};
    method(a);
    System.out.println("調(diào)用完method方法之后:" + a[0]);
  }
  public static void method(int[] a){
    System.out.println("method內(nèi)修改a[0]之前:" + a[0]);
    a[0] = 50;
    System.out.println("method內(nèi)修改a[0]之后:" + a[0]);
  }
}

執(zhí)行結(jié)果如下:

method內(nèi)修改a[0]之前:5
method內(nèi)修改a[0]之后:50
調(diào)用完method方法之后:50

根據(jù)結(jié)果可知,調(diào)用method方法時(shí)實(shí)際傳遞的是引用的地址值。

Java方法的參數(shù)傳遞機(jī)制實(shí)例詳解

傳遞String類型的參數(shù)

由于String類是final修飾的,不可變,它會(huì)在內(nèi)存中在開(kāi)辟一塊新空間。

public class Test {
  public static void main(String[] args) {
    String str1 = new String("test1");
    String str2 = "test2";
    method(str1, str2);
    System.out.println("調(diào)用method傳參str1之后:" + str1 + ", " + str2);
  }
  public static void method(String str1, String str2){
    System.out.println("method內(nèi)修改str之前:" + str1 + ", " + str2);
    str1 = "new1";
    str2 = "new2";
    System.out.println("method內(nèi)修改str之后:" + str1 + ", " + str2);
  }
}

執(zhí)行結(jié)果如下:

method內(nèi)修改str之前:test1, test2
method內(nèi)修改str之后:new1, new2
調(diào)用method傳參str1之后:test1, test2

總結(jié):

1)基本數(shù)據(jù)類型傳遞的是值的復(fù)制,對(duì)一個(gè)參數(shù)的修改不會(huì)影響另一個(gè)參數(shù);

2)引用類型傳引用,形參和實(shí)參指向同一個(gè)內(nèi)存地址(同一個(gè)對(duì)象),所以對(duì)參數(shù)的修改會(huì)影響到實(shí)際的對(duì)象;

3)String、Integer、Double等immutable的類型特殊處理,可以理解為傳值,最后的操作不會(huì)修改實(shí)參對(duì)象(與基本數(shù)據(jù)類型一致)。

更多java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java面向?qū)ο蟪绦蛟O(shè)計(jì)入門與進(jìn)階教程》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》

希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI