为什么new
关键字在Java中被称为运算符?
我知道new
在Java中为一个对象动态分配内存并返回对它的引用,但为什么它被称为运算符?
答案 0 :(得分:4)
正式new
不是运营商。 Java语言规范中没有这样的词,它是这个问题的唯一权威。
有class instance creation expression,其中涉及关键字 new
。
答案 1 :(得分:3)
实际上,Java语言规范并未将new
称为运算符。它writes:
由ASCII字符组成的38个令牌是运营商。
Operator: = > < ! ~ ? : -> == >= <= != && || ++ -- + - * / & | ^ % << >> >>> += -= *= /= &= |= ^= %= <<= >>= >>>=
new
只是keyword中出现的class instance creation expression。
我认为这是一个合理的定义,因为运算符将采用操作数(或者从源代码的角度出现在表达式旁边),但是参数列表后面的类名本身并不是有效的表达式,也不是它被评估为在运行时产生一个值。
我怀疑调用new
运算符的做法源于C ++,其中new运算符可以独立于构造函数调用而重载,以自定义内存分配策略。诸如Java或C#之类的托管语言不再允许这样的分离,但术语运算符已经卡住了。
例如,C# language specification实际上讨论了new
运算符,并指定了它的优先级,但实际指定其含义时,只讨论了可以使用new关键字形成的3种表达式类型(对象创建,数组创建和委托创建表达式)。
答案 2 :(得分:2)
这是一个运营商,不是吗?
你可以创建这样的实例:
A some = A.new(); // This wouldn't be an operator but just a built-in method
或者代替new
它可能是+
A some = +A();
但是在Java和其他流行语言中,他们决定实现一个运算符来创建类的实例,这就是所谓的new
运算符。
答案 3 :(得分:2)
new
确实是一名运营商。它是Java中的保留关键字,因此您无法覆盖它,就像您可以覆盖方法一样。它对类名进行操作 - 对于给定的类名,它返回类的新实例。它类似于一元-
(减号)运算符,它接受一个整数并返回另一个整数(一个符号相反),只有新的,输入和输出是不同的类型。