2010-10-08 49 views
0

對象類型轉換的問題我有一個關於在Java類型轉換問題如下:關於Java的

假設我有一個類:

class A { public void m() } 

現在我做:

A a1 = new A();  // (1) 
a1.m();    // (2) 
Object o = new A(); // (3) 
o.m();    // (4) 

我們可以將行(1)表示爲:a1包含新對象A()(在Heap中創建)的內存地址。所以第(2)行肯定是好的。

我們也可以將行(3)說成:o包含新對象A()(也在堆中創建)的內存地址。但是行(4)顯然不能被編譯,因爲Object類沒有m()方法。

但是爲什麼a1包含對象A()的地址,並且它能「看到」m()方法;而o也包含對象A()的地址,但它「看不見」m()方法?

有沒有其他解釋? (除了Object類沒有m()方法的原因)。

謝謝大家。

回答

7

Object類不具備m()方法

也就是說解釋。這些東西在編譯時被驗證。想象一下以下內容:

Object o1 = new A(); 
Object o2 = new String(); 

void doSomething(Object o) { 
    o.m(); // compilation error 
} 

現在,Am(),但String沒有。這通過編譯錯誤來表示。如果Java不是statically typed,則該錯誤將在運行時出現。並且認爲越早發現問題越好。

+0

非常感謝您的回答。我還有一個。如果我寫((A)o).m() - >這完全沒問題。所以,我不確定鑄件((A)o)究竟做了什麼(內存中發生了什麼),以便在編譯時可以看到m()。 – ipkiss 2010-10-10 04:10:54

+0

@ipkiss - 內存中沒有任何反應。投射對於CPU來說有一點開銷,因爲運行時必須決定是否可以投射對象,或者拋出異常 – Bozho 2010-10-10 07:39:00