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」變數並不會被改變。