Given the definitions of the MyString class and the Test class:



package p1;

class MyString {

    String msg;

    MyString(String msg) {
        this.msg = msg;
    }
}
package p1;

public class Test {

    public static void main(String[] args) {
        System.out.println("Hello " + new StringBuilder("Java SE 8"));
        System.out.println("Hello " + new MyString("Java SE 8"));
    }
}

What is the result?

A.

Hello Java SE 8
Hello Java SE 8

B.

Hello java.lang.StringBuilder@<<hashcode1>>
Hello p1.MyString@<<hashcode2>>

C.

Hello Java SE 8
Hello p1.MyString@<<hashcode>>

D.

Compilation fails at the Test class.

題解

運算子「+」若其中一個運算元為字串,那麼它將會做字串連接,否則為加法運算。任何的物件,都擁有「toString()」方法,可以轉成字串。預設的「toString()」方法於Object類別中,程式實作如下:

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

由於MyString類別並未覆寫Object的「toString()」方法,因此會直接使用原本的程式實作。

所以這個題目的實際輸出為:

Hello Java SE 8
Hello p1.MyString@15db9742

「15db9742」為雜湊值,在不同環境下可能有不一樣的結果。