簡體   English   中英

編譯和運行時類

[英]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是什么類型的:))

在這里區分三個不同的概念很重要:

  • 變量manperson
  • 引用 (變量的值)
  • 對象 (引用的內存塊,um,指的是)

創建對象后,對象的類型永遠不會改變。 將引用強制轉換為其他類型只會影響該表達式的編譯時類型。 引用類型強制轉換表達式的結果始終與原始引用相同-它仍引用相同的對象,該對象仍具有相同的類型。 (這將拳擊放在一邊-當然,強制轉換可能在執行時失敗,從而導致異常。)

另外,有沒有一種在運行時實際獲取類的編譯時類的方法

如果您的意思是變量的編譯時類型,而不是局部變量,則無需真正深入檢查字節碼。 如果這是一個領域 ,則可以使用反射來實現。 你為什么想知道?

運行時類型是新的類型。 無論變量的存儲類型如何,new Man()始終是Man。

編譯類型是聲明的變量的類型。

在你的例子中

Person personMan = (Person) man;

您只能使用personMan的方法和屬性進行編碼。 你也可以

((Man)personMan).someManMethod();

但是,如果personMap沒有存儲Man的實例,則可能導致錯誤。

在Java中,變量(原始變量除外)只是對對象的引用。 對象本身生活在其他地方,永遠不能直接訪問。

在每種情況下,您都有一個Man對象坐在某個地方,並且不同的引用僅提供對該Man對象功能的不同子集的訪問。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM