在java中,为什么new运算符在数据类型之前没有用来分配内存?

use*_*331 8 java new-operator

如果我们需要newoperator为对象分配内存,那么为什么我们不在数据类型之前使用它来分配内存?

class-name class-var =  new class-name();
new int a;
Run Code Online (Sandbox Code Playgroud)

cod*_*eim 3

  1. 因为詹姆斯·高斯林 这么说……(或者比亚恩·斯特鲁斯特鲁普这么说)。实际上,这主要是语言设计的问题,而不是技术规律的问题。

  2. javac对您隐藏这些语义并执行所谓的装箱/拆箱(并且自动执行)。这些类型可以作为values或作为“对象”存在(通常使用堆实现)。当上下文需要对象引用时,javac 会发出一条 box 指令,将值移动int到对象包装器中(int -> Integer)并传递reference value. 许多低级 JVM 操作码都是为了处理标量值而构建的,有些操作码是为了处理引用值(或只是引用)而构建的。

一个典型的例子是将 an 存储int到集合中。它被装箱。

但归根结底,问为什么一种语言在句法上会做这样的事情就像问一位艺术家为什么要这样画一幅画一样。只是因为。语言的设计在一定程度上是出于突发奇想和情感,但就 Java 而言,语法new是从 C++ 继承的,因此突发奇想可能是Bjarne Stroustrup 的。还要考虑到 Scala 也是一种 JVM 语言,但对于一些常见的想法它有非常不同的语法。

这里的关键是编译器编写者明天可以做出决定,“NEW Java”将是一种新语言,需要NEW所有类型前面全部大写。无论如何,它可以在不影响语言语义的情况下实现。

诚然,选择背后有合理的设计和一致性,但选择仍然只是选择。在这种情况下,选择明确表明 anint是原始类型,并且new仅返回对象,而不返回原始类型。所以这是一个很好的语法选择。