歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Java 值傳遞和引用傳遞

關於Java 值傳遞和引用傳遞。

先上代碼:

public class JavaTest {
    private int paraInt = 10;

    public int getParaInt() {
        return paraInt;
    }

    public void setParaInt(int paraInt) {
        this.paraInt = paraInt;
    }
    
    public void tryChangeBasicData(int para){
        para = 100;
        System.out.println("inner tryChangeBasicData method:para = " + para);
    }
    
    public void tryChangeObject(JavaTest jTest){
        jTest.setParaInt(100);
        System.out.println("inner tryChangeObject method:para = " + jTest.getParaInt());
    }
    
    public static void main(String[] args) {
        JavaTest jTest = new JavaTest();
        
        System.out.println("基本數據類型作為參數傳遞");
        System.out.println("before method: " + jTest.getParaInt());
        jTest.tryChangeBasicData(jTest.getParaInt());
        System.out.println("after method: " + jTest.getParaInt());
        
        System.out.println("");
        
        System.out.println("對象引用作為參數傳遞");
        System.out.println("before method: " + jTest.getParaInt());
        jTest.tryChangeObject(jTest);
        System.out.println("after method: " + jTest.getParaInt());
    }
}

輸出:

基本數據類型作為參數傳遞
before method: 10
inner tryChangeBasicData method:para = 100
after method: 10
***
對象引用作為參數傳遞
before method: 10
inner tryChangeObject method:para = 100
after method: 100 

基本數據類型作為參數傳遞

是按值傳遞,實際上是對傳入的基本數據類型參數A 做了一個值拷貝B,然後所有操作是針對這個拷貝B 的,因此不會影響到原參數A

比如上面代碼中,tryChangeBasicData() 方法前後 paraInt 值並沒有改變。

對象引用作為參數傳遞

是引用傳遞,實際上是對傳入引用X 做了一個拷貝引用Y,傳入引用X 和拷貝引用Y 指向同一個地址。

上面代碼中,tryChangeObject() 方法對拷貝引用Y 指向的地址空間內的變量進行修改,所以傳入引用X 取得的變量值是修改後的值。

說明

究竟是按值傳遞還是按引用傳遞,這點不重要,因為不同的人對這兩個定義的理解不一樣。

真正需要明白的是:

  1. 基本數據類型(包括裝箱的基本數據類型)傳遞的是值得拷貝,在方法中針對這個參數做任何事情都不會影響原參數;
  2. 對象引用傳遞的是引用的拷貝,但是無論拷貝多少次,引用指向的地址從未變過,因此可以通過此引用的拷貝修改原對象的一些屬性

補充:String 類型

String 在方法中作為參數傳遞,我們不用考慮傳遞的是引用還是值得拷貝,因為 String 本身一旦定義了就不可修改,做了“修改”(比如使用連接符做拼接)後就變成另外一個對象了,不會影響原對象。

所以當提起 Java 語言是值傳遞還是引用傳遞的時候,不妨換個理解方式,那就是傳過去的對象或引用會不會影響原對象。

Copyright © Linux教程網 All Rights Reserved