[英]Is it not required to allocate memory explicitly using new before assigning value to data through a function call in java
[英]In java, why new operator not used before data type to allocate memory?
如果我們需要new
運算符為一個對象分配內存,那么為什么在數據類型分配內存之前不使用它呢?
class-name class-var = new class-name();
new int a;
因為詹姆士·高斯林 ( James Gosling)這么說……(或Bjarne Stroustrup這么說)。 確實,這主要是語言設計問題,而不是技術法規。
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
運算符。 原始數據類型始終按值傳遞。 對於引用數據類型,引用是按值傳遞的,但是您可以有許多指向同一對象或數組的引用。
因此,如果您更改了引用所指向的對象中的任何內容,則所有其他引用也將看到更改。 對於原始數據類型,這不會發生。
有關原始和引用數據類型的更多信息:
這主要是由於編譯器和/或解釋器將如何讀取此源。 基本上,您必須在分配內存之前告訴編譯器/解釋器它正在處理的對象類型。 大多數語言(包括C和Java)都是相同的。 您基本上可以告訴編譯器/解釋器對象的類型,對象的名稱,然后是賦值操作。 new
並不總是在賦值運算符的右邊,因為您可能正在復制/克隆相同對象類型的現有變量名/句柄。
Java原語不需要new
運算符的原因是@pep所說的,語言/平台已經知道該類型的定義大小。 int
在Java中將始終為32字節,但MyCustomClass
可能並非如此。
因為原始數據類型已經由語言定義,並由關鍵字命名。 您要做的就是聲明它,並且已經定義的內存將為其保留。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.