[英]Compile and run-time classes
假設我有一個名為Person
的類,它是另一個Man
類的泛化。 如果我要舉幾個這個班的例子
Man man = new Man();
Person person = new Man();
現在,從變量man
引用的實例的編譯時類為Man
,person的編譯時類為Person
而兩個實例的運行時類均為Man
。 到目前為止,我完全支持該術語,因為在運行時創建的實例都屬於Man
類。 但是,如果我按以下方式將man實例轉換為
Person personMan = (Person) man;
personMan
運行時的personMan
仍然是Man? 是否僅在創建新實例時設置實例的運行時類? 另外,是否有一種在運行時實際獲取變量的編譯時類的方法,因此我可以查詢personMan是什么類型的類(getClass將返回Man
)。
編輯:“一個類的編譯時類”是一個錯誤(並且沒有多大意義)。 我的意思是可變的(因此,他們質疑classManMan是什么類型的:))
在這里區分三個不同的概念很重要:
man
, person
) 創建對象后,對象的類型永遠不會改變。 將引用強制轉換為其他類型只會影響該表達式的編譯時類型。 引用類型強制轉換表達式的結果始終與原始引用相同-它仍引用相同的對象,該對象仍具有相同的類型。 (這將拳擊放在一邊-當然,強制轉換可能在執行時失敗,從而導致異常。)
另外,有沒有一種在運行時實際獲取類的編譯時類的方法
如果您的意思是變量的編譯時類型,而不是局部變量,則無需真正深入檢查字節碼。 如果這是一個領域 ,則可以使用反射來實現。 你為什么想知道?
運行時類型是新的類型。 無論變量的存儲類型如何,new Man()始終是Man。
編譯類型是聲明的變量的類型。
在你的例子中
Person personMan = (Person) man;
您只能使用personMan的方法和屬性進行編碼。 你也可以
((Man)personMan).someManMethod();
但是,如果personMap沒有存儲Man的實例,則可能導致錯誤。
在Java中,變量(原始變量除外)只是對對象的引用。 對象本身生活在其他地方,永遠不能直接訪問。
在每種情況下,您都有一個Man
對象坐在某個地方,並且不同的引用僅提供對該Man
對象功能的不同子集的訪問。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.