繁体   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