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

时间:2014-11-02 06:04:17

标签: java new-operator

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

class-name class-var =  new class-name();
new int a;

4 个答案:

答案 0 :(得分:3)

  1. 因为James Gosling这么说....(或Bjarne Stroustrup这样说)。实际上,这主要是语言设计问题,而不是技术法则。

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

  3. 一个主要的例子是将int存储到集合中。它被装箱了。

    但最后,问问为什么一种语言在语法上的作用就像问艺术家为什么要画一幅画。只是因为。语言是通过心血来潮和情感来设计的,但在Java的情况下,new的语法是从C ++继承而来的,所以突发奇想可能是Bjarne Stroustrup's。还要考虑Scala也是一种JVM语言,但它对于一些常见的想法却有着截然不同的语法。

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

    当然,选择背后有完善的设计和一致性,但选择仍然只是选择。在这种情况下,选择清楚地表明int是基本类型,而new仅返回对象,而不是基元。所以这是一个很好的语法选择。

答案 1 :(得分:2)

Java有两种类型: primitive 数据类型和 reference 数据类型。

int是原始数据类型。引用数据类型引用类的实例或数组的实例。

对于原始数据类型,不使用new运算符。原始数据类型始终按值传递。对于引用数据类型,引用按值传递,但是您可以有许多引用指向同一个对象或数组。

因此,如果您更改了引用指向的对象中的任何内容,则所有其他引用也会看到更改。对于原始数据类型,这不会发生。

有关原始数据类型和参考数据类型的更多信息:

Chapter 4 of the Java Language Specification

答案 2 :(得分:0)

这主要是由于编译器和/或解释器将如何读取此源。基本上,在为内存分配内存之前,必须告诉编译器/解释器它正在使用哪种类型的对象。在大多数语言中都是如此,包括C和Java。您基本上告诉编译器/解释器对象的类型,该对象的名称,然后是赋值操作。 new并不总是位于赋值运算符的右侧,因为您可能正在复制/克隆相同对象类型的现有变量名称/句柄。

Java原语不需要new运算符的原因如同@pep所说,语言/平台已经知道该类型的已定义大小。 int在Java中总是32个字节,但MyCustomClass可能不是。

答案 3 :(得分:0)

因为原始数据类型已经由语言定义,并且由关键字命名。您所要做的就是声明它,并且已经为它保留已定义的内存