[英]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.