簡體   English   中英

在Java中,為什么在數據類型分配內存之前不使用new運算符?

[英]In java, why new operator not used before data type to allocate memory?

如果我們需要new運算符為一個對象分配內存,那么為什么在數據類型分配內存之前不使用它呢?

class-name class-var =  new class-name();
new int a;
  1. 因為詹姆士·高斯林James Gosling)這么說……(或Bjarne Stroustrup這么說)。 確實,這主要是語言設計問題,而不是技術法規。

  2. javac對您隱藏了這些語義,並執行了裝箱/拆箱操作(並自動進行了裝箱)。 這些類型可以作為values或“對象”(通常使用堆來實現)存在。 當上下文需要對象引用時,javac會發出一個box指令,將int值移動到對象包裝器中(int-> Integer)並傳遞一個reference value 構建許多低級JVM操作碼來處理標量值,而構建一些低級JVM操作碼來處理引用值(或僅引用)。

一個主要的例子是將一個int存儲到一個集合中。 它被裝箱。

但是最后,問一種語言為什么要在句法上做什么呢,就像問一個藝術家為什么要這樣畫畫。 只是因為。 語言是由異想天開和情感設計的,但是在Java的情況下, new的語法是從C ++繼承的,因此異想天開可能是Bjarne Stroustrup的 還要考慮Scala也是JVM語言,但是對於一些常見的想法它具有非常不同的語法。

關鍵是編譯器編寫者明天可以決定“ NEW Java”將是一種新的語言,要求所有類型前面的所有大寫字母都為NEW 無論如何,都可以在不影響語言語義的情況下實現它。

當然,選擇背后有合理的設計和一致性,但是選擇仍然只是選擇。 在這種情況下,選擇清楚地表明int是基本類型,而new只返回對象,而不返回基本類型。 因此,這是語法的不錯選擇。

Java有兩種類型: 原始數據類型和引用數據類型。

int是原始數據類型。 引用數據類型引用類的實例或數組的實例。

對於原始數據類型,不使用new運算符。 原始數據類型始終按值傳遞。 對於引用數據類型,引用是按值傳遞的,但是您可以有許多指向同一對象或數組的引用。

因此,如果您更改了引用所指向的對象中的任何內容,則所有其他引用也將看到更改。 對於原始數據類型,這不會發生。

有關原始和引用數據類型的更多信息:

Java語言規范的第4章

這主要是由於編譯器和/或解釋器將如何讀取此源。 基本上,您必須在分配內存之前告訴編譯器/解釋器它正在處理的對象類型。 大多數語言(包括C和Java)都是相同的。 您基本上可以告訴編譯器/解釋器對象的類型,對象的名稱,然后是賦值操作。 new並不總是在賦值運算符的右邊,因為您可能正在復制/克隆相同對象類型的現有變量名/句柄。

Java原語不需要new運算符的原因是@pep所說的,語言/平台已經知道該類型的定義大小。 int在Java中將始終為32字節,但MyCustomClass可能並非如此。

因為原始數據類型已經由語言定義,並由關鍵字命名。 您要做的就是聲明它,並且已經定義的內存將為其保留。

暫無
暫無

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

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