2015-02-06 74 views
0

我很努力去理解我認爲Java中的一個基本問題。 下面的答案是第3行傾向於類拋出異常。我可以看到最初的a1指向對象A的數組。但是在第1行沒有設置指向對象b的數組?因此,如果a1指向一個應該現在不是也指向b?從Enthuware引用和鑄造

說明: -

程序將在該行拋出java.lang.ClassCastException標記3運行時。

第1行將在編譯期間被允許,因爲賦值是從子類引用到超類引用完成的。 因爲超類引用被分配給子類引用變量,所以需要在行// 2中進行強制轉換。並且這在運行時工作,因爲a引用的對象實際上是一個B數組。 現在,行// 3處的轉換告訴編譯器不要擔心,我是一名優秀的程序員,我知道我是什麼做和超級類引用(a1)引用的對象實際上是在運行時的類B。所以沒有編譯時錯誤。但在運行時,這種失敗,因爲實際的對象不是B的陣列,但A.

public static void main(String args[]) { 

    A[] a, a1; 
    B[] b; 
    a = new A[10]; 
    a1 = a; 
    b = new B[20]; 
    a = b;   //line 1 
    b = (B[]) a; //line 2 
    b = (B[]) a1; //line 3 

    } 

} 

class A { 
} 

class B extends A {} 
+0

http://stackoverflow.com/questions/ 1750106/how-can-i-use-pointers-in-java – chancea 2015-02-06 16:16:44

回答

0

如果有多個變量引用相同的對象,則可以使用任何引用完成對象中的更改,但引用中的更改僅影響該引用。

在您的示例中,a和a1引用相同的數組。如果修改引用的對象(A的數組),則使用a或a1時它是相同的,因爲它們引用同一對象。

A[] a, a1; 
a = new A[10]; 
a1 = a; 
/* You can use a or a1 to modify the object with the same results. */ 
a[0] = new A(); /* Equivalent to a1[0] = new A() */ 

如果修改變量以引用另一個對象,則其他引用保持不變。

A[] a, a1; 
a = new A[10]; 
a1 = a; 
a = new A[15]; /* a1 still references the first array and a the new one */ 

當您使用對象引用作爲函數參數時會發生類似的情況。

做出了榜樣,比法給出:

public static void uselessMethod(A[] a) { 
    /* a is a local variable that makes reference to the object, 
     modify the reference only has effect inside this method, 
     but modify the array has effects outside the method */ 
    a = null; 
} 

如果你撥打上面的方法,你參考不改:

A[] a = new A[10]; 
uselessMethod(a); 
System.out.println(a.length); /* This will print 10 */ 
1

的數組,因此,如果A1是指向應該現在不也點到B?

變量保持的值,是完全獨立於其他變量。如果您更改一個變量的值,則只會影響該變量。

+0

感謝您的回答。你們兩位都很有幫助,但我認爲David SN的解釋擴大了我不清楚的幾點。 – user4702831 2015-02-06 17:20:38