Given:
class Product {
double price;
}
public class Test {
public void updatePrice(Product product, double price) {
price = price * 2;
product.price = product.price + price;
}
public static void main(String[] args) {
Product prt = new Product();
prt.price = 200;
double newPrice = 100;
Test t = new Test();
t.updatePrice(prt, newPrice);
System.out.println(prt.price + " : " + newPrice);
}
}
What is the result?
A.
200.0 : 100.0
B.
400.0 : 200.0
C.
400.0 : 100.0
D. Compilation fails.
題解
這題是在考Java永遠為「pass by value」的概念。
第20行同時將基本型態的區域變數「newPrice」和物件參考的變數「prt」當作參數傳給「updatePrice」方法。此時「newPrice」和「prt」的值都會被複製一份出來,「prt」的值為Product物件的參考(類似記憶體位址)。
「updatePrice」方法會將「newPrice」的值乘2,再加給「prt」物件的「price」變數。
第21行將「prt」物件的「price」變數的值和「newPrice」變數的值輸出。「prt」物件的「price」變數的值會是執行「updatePrice」方法時改變的結果,而「main」方法的「newPrice」變數並不會被改變。