一篇文章讓你瞭解:值傳遞和引用傳遞

問題

關於Java傳參時是引用傳遞仍是值傳遞,一直是一個討論比較多的話題,有論壇說Java中只有值傳遞,也有些地方說引用傳遞和值傳遞都存在,比較容易讓人迷惑。java

答案

可是請記住,Java 語言的參數傳遞只有「按值傳遞」spa

Java的參數傳遞,無論是基本數據類型仍是引用類型的參數,都是按值傳遞,沒有按引用傳遞!3d

 

先看一下microsoft的文檔中對按引用傳遞參數的定義(以下截圖)(看不懂的話就先看下面的,回頭再看這個,你會有一種醍醐灌頂的感受):code

 

  • 基本數據類型的參數

先來看一下基本數據類型的參數按值傳遞的例子:對象

TransferTest.javablog

public class Test{
    public static void main(String[] args) {
        int num = 1;
        System.out.println("changeNum()方法調用以前:num = " + num);
        changeNum(num);
        System.out.println("changeNum()方法調用以後:num = " + num);
    }

    public static void changeNum(int x) {
        x = 2;
    }
}

運行結果:內存

這個傳遞過程的示意圖以下:文檔

num做爲參數傳遞給changeNum()方法,是將內存空間中num所指向的存儲單元中存放的1傳遞給了changeNum()方法中的x變量。調用changeNum(),x變量在內存空間中分配一個存儲單元,這個時候,num的值1傳遞給了x指向的存儲單元中。此後,在changeNum()方法中對x的一切操做都是針對x所指向的這個存儲單元,與num所指向的那個存儲單元沒有關係了!class

因此,在changeNum()方法調用以後,num所指向的存儲單元的值仍是沒有發生變化,這就是所謂的「按值傳遞」!按值傳遞的精髓是:傳遞的是存儲單元中的內容,而不是存儲單元的引用!變量

 

  • 引用類型的參數

Test2.java  

1.public class Test2 {
2.    public static void main(String[] args) {
3.        Person p1 = new Person();
4.        System.out.println(p1);
5.        change(p1);
6.        System.out.println(p1);
7.    }
8.
9.    public static void change(Person p2) {
10.        System.out.println(p2);
11.        p2 = new People();
12.        System.out.println(p2);
13.    }
14.}
15.
16./**
17. * Person類
18. */
19.class Person {
20.
21.}
22.

運行結果:

能夠看出四次打印person的地址值,只有new以後的變量地址值不同,而且用完change() 方法以後,person變量並無發生改變。

這個傳遞過程的示意圖以下:

當執行到第3行代碼時,程序在堆內存中開闢了一塊內存空間用來存儲Person類的實例對象,同時在棧內存中開闢了一個存儲單元用來存儲該實例對象的引用,即上圖中person指向的存儲單元。

當執行到第5行代碼時,person做爲參數傳遞給change()方法,須要注意的是:person將本身存儲單元的內容傳遞給了change()方法的p變量(即引用對象的地址)!此後,在change()方法中對p的一切操做都是針對p所指向的存儲單元,與person所指向的那個存儲單元沒有關係了!如11行,對p變量指向了新的對象,這個傳遞過程以下圖

 

總結

  • Java 語言的參數傳遞只有「按值傳遞」

  • 基本類型傳參時,傳遞給形參的就是的實參的值

  • 引用類型傳參時,傳遞給形參的是實參的引用對象的值

相關文章
相關標籤/搜索