在java中,为什么在数据类型之前不使用新操作符来分配内存?

在java中,为什么在数据类型之前不使用新操作符来分配内存?,java,new-operator,Java,New Operator,如果我们需要new操作符为一个对象分配内存,那么我们为什么不使用它呢 在数据类型分配内存之前 class-name class-var = new class-name(); new int a; 这主要是由于编译器和/或解释器将如何读取此源代码。基本上,在为编译器/解释器分配内存之前,您必须告诉它正在处理的对象类型。这在大多数语言中都是一样的,包括C和Java。基本上是告诉编译器/解释器对象的类型、对象的名称,然后是赋值操作新建并不总是位于赋值运算符的右侧,因为在中,可以复制/克隆相同对象

如果我们需要
new
操作符为一个对象分配内存,那么我们为什么不使用它呢 在数据类型分配内存之前

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

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


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

Java有两种类型:基本数据类型和引用数据类型

int
是一种基本数据类型。引用数据类型引用类的实例或数组的实例


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

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

有关基本数据类型和引用数据类型的详细信息:

  • 因为我是这么说的。。。。(或者这么说)。事实上,这主要是语言设计的问题,而不是技术法规的问题

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

  • 一个主要示例是将
    int
    存储到集合中。它被装箱了

    但归根结底,问一种语言为什么在句法上如此,就像问一个艺术家为什么这样画一幅画一样。只是因为。语言是通过奇想和情感设计的,但是在java的情况下,“代码>新< /COD>的语法是C++继承的,所以可能是一时兴起。也可以认为斯卡拉也是一个JVM语言,但是它对于一些常见的思想有非常不同的语法。 这里的关键是编译器编写人员明天可以做出决定,“新Java”将是一种新语言,它需要在所有类型前面的所有大写字母中使用
    NEW
    。它可以在不影响语言语义的情况下实现


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

    这是哪种语言?我的问题错了吗?为什么投票否决了我,我的声誉是11,现在是9,很难建立声誉,但很容易失去声誉:D@user2849331不,一些开玩笑的人在这个帖子里没完没了地投下所有的票,没有任何解释和理由。@leo不,有人在玩游戏。不提供更好的解释或至少一条注释,只提供了一个驱动向下投票。说真的,除非你有更好的解释,否则停止向下投票。“原始数据类型总是按值传递的。”,嗯,Java中的所有内容都是按值传递的,包括对象。只是当你把一个对象传递给一个方法时,你就是在传递引用的值@蛇医生,这是不对的。对象通过引用传递,对对象的引用通过值传递。请阅读我的全部答案。对不起,Java只是显式地按值传递。传递引用的值,但不像在C中的指针那样传递引用本身。这是有区别的。我建议您参考:请阅读中关于Java引用类型的内容(为什么您认为它们被称为Java引用类型?),然后回到这里。Java语言规范是Java语言的权威来源。@SnakeDoc,Erwin:我想你们都同意。对象从不按值传递,但对这些对象的引用按值传递。你说的是同一件事……这可能是因为内存在编译时分配给原始数据类型,而new操作符在运行时分配。否。主要的选择是语法(尽管语法是为了设计)。大多数其他对象类型的大小在编译时也是已知的。这不是区别。在这种情况下,编译器编写者可以决定将
    new
    设置为可选,并忽略它。