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