首頁 >Java >java教程 >java怎麼傳值?

java怎麼傳值?

青灯夜游
青灯夜游原創
2019-11-15 15:03:103626瀏覽

我們都知道,傳值方式基本上分兩種:值傳遞和引用傳遞,那麼在JAVA中到底是值傳遞還是引用傳遞呢?下面這篇文章就來跟大家介紹一下,希望對大家有幫助。

java怎麼傳值?

值傳遞:是指在呼叫函數時將實際參數複製一份傳遞給形參,這樣函數中對形參的修改將不會影響到實際參數的值。

引用傳遞:是指在呼叫函數時將實際參數的位址直接傳遞到形參,那麼在函數中對參數所進行的修改,將會影響到實際參數的值。

java怎麼傳值?

java的傳值方式:值傳遞(所有發生的變化只限制在方法體中,出了方法體,任何的修改操作都不再有效)。 【推薦學習:java課程

我們可以使用一段程式來驗證Java中只有值傳遞

/**
 * 验证java中只有值传递
 */
class User{    
    private String name;    public String getName() {        return name;
    }    public void setName(String name) {        this.name = name;
    }
}public class TestValue {    public static void change(User user2,int a2){
        System.out.println("改变之前:"+user2.getName()+",a2="+a2);
        
        user2.setName("李四"); //改变 user2 的 name 值
        a2 = 10; //改变 a2 的值
        System.out.println("改变之后:"+user2.getName()+",a2="+a2);
        
        user2 = new User(); //将 user2 重新指向一个新对象
        user2.setName("王五");
        System.out.println("重新指向一个新对象后:"+user2.getName());
    }    public static void main(String[] args){
        User user1 = new User();
        user1.setName("张三"); //初始化 user1 的 name 为张三
        int a1 = 5; //初始化 a1 的值为 5
        change(user1,a1); //调用方法验证传值方式
        System.out.println("调用方法后:"+user1.getName()+",a1="+a1);
    }
}

運行這段程序,輸出結果為:

改变之前:张三,a2=5
改变之后:李四,a2=10
重新指向一个新对象后:王五
调用方法后:李四,a1=5

結果分析

java怎麼傳值?

#下面我們以上圖為輔助,來分析這段程序,首先我們定義了一個User類,然後在測試類中實例化了一個User對象,名為user1,並且為其賦值name = '張三'。

此時在記憶體中如圖1所示,實例化一個物件相當於在堆中開闢了一塊內存,記憶體位址為017 ,此時這個物件的引用為user1,記憶體位址為001,它保存了該物件在記憶體中的位址,也就是指向了該物件。

接下了,我們呼叫方法change(),來嘗試改變user1name值以此驗證java中的傳值方式。

我們將user1當作實參傳給change()方法,形參user2來接受這個實參,在這裡就體現出了兩種傳參方式的不同。如果是按值傳遞,那麼就像定義的那樣。

圖2所示,user2user1的一份副本,也就是說在傳遞參數時,將會 user1(本身是一個物件的引用),複製了一份,名稱為user2,它同樣也是一個物件的引用,並且user1user2此時指向同一個物件。

而如果是引用傳遞,也如同定義的那樣,如圖5所示,在傳遞參數時,是直接將user1傳遞給了形參,只是換了一個名字叫做user2,但是本質上user1user2其實是同一個。它是一個物件的引用。

接著來分析輸出的結果,不管是按值傳遞還是引用傳遞,第1行輸出的結果一定都是張三,因為都是指向同一個物件。對於第2行輸出,我們還是無法判斷是哪一種方式,因為都是改變同一個對象,值也會改變;關鍵在於第3行輸出和第4行輸出。

此時,我們將user2重新指向了一個新的對象,並且為這個對象賦值name = '王五',如果是引用傳遞的方式,那麼user1同樣也會改變指向,指向新的這個對象,最後一行呼叫方法之後輸出的結果將會和第3行一樣是王五,但是事實輸出的是李四。這顯示user1user2其實並不是同一個。

真實的呼叫過程如 圖2~圖4所示,這樣才會使得user2指向一個新的物件後,user1指向的物件並沒有改變,還是原來那個物件。

對於基本型別的參數來說,a1的值最後沒有改變,說明在執行方法時,a2a1的一個副本。

對於引用類型的參數來說,例如User對象,在呼叫方法時,實際上是將其引用user1作為實際參數,那麼傳遞給形參的將是該引用的副本引用user2,雖然說這是兩份引用(好比a1a2的關係)。

但是卻指向同一個對象,所有的操作也都是對這同一個對象而言的。

尾聲

透過上述分析我們可以知道。 Java中只有值傳遞這一種方式,只不過對於引用型別來說,傳遞的參數是物件的參考罷了。

以上是java怎麼傳值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn