Given:



class Patient {

    String name;

    public Patient(String name) {
        this.name = name;
    }
}
public class Test {
    public static void main(String[] args) {
        List ps = new ArrayList();
        Patient p2 = new Patient("Mike");
        ps.add(p2);

        // insert code here
        
        if (f >= 0) {
            System.out.print("Mike Found");
        }
    }
}

Which code fragment, when inserted at line 14, enables the code to print Mike Found?

A.

int f = ps.indexOf{new Patient("Mike")};

B.

int f = ps.indexOf(Patient("Mike"));

C.

Patient p = new Patient("Mike");
int f = ps.indexOf(p);

D.

int f = ps.indexOf(p2);

題解

選項A,語法錯誤,方法的括號應為小括號,而非大括號。

選項B,語法錯誤,少了new運算元。

選項C,雖然p和p2變數所參考的物件其實體化的方式都相同,但它們是兩個獨立的物件。List的「indexOf」方法會利用每個物件皆有的「equals」方法來判斷兩個物件參考是否儘管參考到的物件不同但物件還是有邏輯上的相等。在此由於Patient類別並未覆寫「equals」方法來實作邏輯相等的判斷程式,因此p所參考到的物件在邏輯上不會相等於p2所參考到的物件。除非將Patient類別改寫如下:

class Patient {

    String name;

    public Patient(String name) {
        this.name = name;
    }

    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj instanceof Patient) {
            return ((Patient) obj).name.equals(this.name);
        }
        return false;
    }
}

選項D,List內原先就有p2所參考到的物件,因此可以使用「indexOf」方法來找到。