Java參數傳遞

Java支持兩種數據類型:基本數據類型和引用數據類型。
原始數據類型是一個簡單的數據結構,它只有一個與之相關的值。 引用數據類型是一個複雜的數據結構,它表示一個對象。

原始數據類型的變量將該值直接存儲在其存儲器地址處。使用對象和引用變量時會有所不同。Java中的所有參數都通過值傳遞。

當參數是原始數據類型時,實際參數的值將複製到參數。
在方法主體中對參數值進行的任何更改只會更改形式參數的副本,而不會更改實際參數的值。當參數通過參考值傳遞時,存儲在實際參數中的參考被複制到形式參數。 實際參數和形式參數都指向內存中的相同對象。

可以將另一個對象的引用分配給方法主體中的形式參數。

示例

下面的代碼演示了Java中的引用傳遞機制。

class Phone {
  public String model = "Unknown";
  public int year = 2016;
  public double price = 0.0;
}

public class Main {
  public static void main(String[] args) {
    Phone myPhone = new Phone();

    myPhone.model = "iPhone";
    myPhone.year = 2018;
    myPhone.price = 16000.0;

    System.out.println("#1: model  = " + myPhone.model + ", year   = "
        + myPhone.year + ", price = " + myPhone.price);

    Main.test(myPhone);

    System.out.println("#4: model  = " + myPhone.model + ", year   = "
        + myPhone.year + ", price = " + myPhone.price);
  }

  public static void test(Phone xPhone) {
    System.out.println("#2: model  = " + xPhone.model + ", year   = "
        + xPhone.year + ",  price = " + xPhone.price);

    // Let's make xyCar refer to a new object
    xPhone = new Phone();

    System.out.println("#3: model  = " + xPhone.model + ", year   = "
        + xPhone.year + ", price = " + xPhone.price);
  }
}

上面的代碼生成以下結果。

#1: model  = iPhone, year   = 2018, price = 16000.0
#2: model  = iPhone, year   = 2018,  price = 16000.0
#3: model  = Unknown, year   = 2016, price = 0.0
#4: model  = iPhone, year   = 2018, price = 16000.0

注意
當引用類型參數傳遞給方法時,形式參數可以訪問對象,實際參數也可以訪問該對象。

形式參數可以通過直接更改實例變量的值或通過調用對象上的方法來修改對象。通過形式參數對對象進行的任何修改都可以通過實際參數立即可見,因爲它們都保存對內存中同一對象的引用。形式參數本身可以被修改以引用方法內的另一個對象。

要禁用將引用類型形式參數更改爲引用不同對象的方法,請在引用類型形式參數聲明中使用關鍵字final

public class Main {
  public static void main(String[] args) {
    Phone myPhone = new Phone();

    myPhone.model = "iPhone";
    myPhone.year = 2017;
    myPhone.price = 16000.0;

    Main.test(myPhone);
  }

  public static void test(final Phone xPhone) {
    System.out.println("#2: model  = " + xPhone.model + ", year   = "
        + xPhone.year + ",  price = " + xPhone.price);

    // Let's make xyCar refer to a new object
    //xPhone = new Phone();
  }
}
class Phone {
  public String model = "Unknown";
  public int year = 2014;
  public double price = 0.0;
}

上面的代碼生成以下結果。

#2: model  = iPhone, year   = 2017,  price = 16000.0