Given:



class X {

    static int i;
    int j;

    public static void main(String[] args) {
        X x1 = new X();
        X x2 = new X();
        x1.i = 3;
        x1.j = 4;
        x2.i = 5;
        x2.j = 6;
        System.out.println(
                x1.i + " "
                + x1.j + " "
                + x2.i + " "
                + x2.j);
    }
}

What is the result?

A.

3 4 5 6

B.

3 4 3 6

C.

5 4 5 6

D.

3 6 4 6

題解

第7~8行,宣告並實體化出了x1和x2這兩個X物件。X物件的變數成員有物件變數j,和宣告時用了static修飾的靜態(類別)變數i。兩種變數的差別在於,類別變數只會有一個存在,其記憶體空間並不會因為類別被實體化而多產生出來,也就是說,x1和x2的i變數是同一個變數,實際指到的記憶體空間是一樣的。

第9~12行,將不同的值指派給x1和x2物件的變數i和變數j。由於變數i是類別變數,因此「x1.i」和「x2.i」都可以改寫成「X.i」。

所以到最後,X.i為5,而x1.j為4、x2.j為6,輸出結果為「5 4 5 6」。