簡體   English   中英

理解java中的“new”關鍵字

[英]Understanding “new” keyword in java

我想知道是否有人確切知道代碼行發生時會發生什么:

class Class{}

class Math extends Class{}

class UseClasses{
public static void main (String[]args)

{

   new Math();  //Line 8
   (Class)new Math();//     Line 9

}

我完全理解“new keyword”在堆內存中充當對象實例創建者。 但是,在前面的代碼中,您可以看到第9行對此關鍵字(新)的使用不正常。 第8行沒關系並且編譯得很好。 但是第9行需要將內容分配給其他一些引用。 因此,這意味着每次存在強制轉換操作數時,在這種情況下(Class)new Math,將實例化新的引用(強調引用而不是對象)。

它以這種方式工作嗎? 如果沒有,你能解釋一下為什么它在第8行編譯得很好並且它在第9行中出錯了嗎? (顯然由於鑄造功能不在那里,但為什么不呢?)

由於第9行沒有引用變量,編譯器不認為此語句有效。

如果您具有對象本身的“更具體”類型的引用變量,則需要強制轉換。 例如,當您執行上傳時,您不需要它:

Class obj = new Math();

當你執行向下轉換時,你需要一個明確的演員:

Class obj = new Math();
Math math = (Math) obj;

(Class)new Math()做兩件事:

  1. 創建一個新的Math實例
  2. 將創建的Math實例強制轉換為Class。

由於Math擴展了Class,因此每個Math實例都是一個Class實例,並且您不需要任何強制轉換來將Math實例分配給Class類型的變量。 因此,演員陣容完全沒用。 由於您沒有將創建的Math實例分配給任何變量,因此強制轉換更無用。

這兩行都構建了一個Math實例。 因為在這種情況下, MathClass的子Class (這有點不尋常,但好吧,我正在玩)。

所以第9行, (Class)new Math(); 告訴JVM忘記它是Class的一個專門實例,只是把它當成一個普通的Class對象。 這基本上意味着,如果你這樣做:

Class c = (Class)new Math(); Math沒有從Class繼承的方法,你將無法在對象c上調用它們。

但請注意, c實際上仍然是Math一個實例。

我不確定這個示例中的重點是什么,但是如果您希望代碼在對象的泛型定義之外工作而不擔心特定的實現,通常會這樣做。 我不知道,整個例子對我來說似乎很傻。

在這種特殊情況下,這只是因為沒有對第9行的變量進行賦值。

暫無
暫無

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

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