java中的`new`关键字是多余的吗?

我来自C ++,所以有一个我不太了解的javafunction。 我已经读过,必须使用关键字new创建所有对象,但基元除外。 现在,如果编译器可以识别基本类型,并且不允许您创建一个没有new调用其构造函数的对象,那么将关键字new设置为什么的原因是什么? 有人可以提供两行代码的例子,除了new的存在,编译和具有不同的含义/结果相同吗?

只是为了澄清多余的意思,希望能让我的问题更加清晰。 new增加了什么吗? 语言是否可以通过构造函数表示没有new的对象实例化?

方法和构造函数可以具有相同的名称。

 public class NewTest { public static void main(final String[] args) { TheClass(); new TheClass(); } static void TheClass() { System.out.println("Method"); } static class TheClass { TheClass() { System.out.println("Constructor"); } } } 

这种语言设计选择是否是一个好主意是有争议的,但这是它的工作方式。

信不信由你,需要使用new作为构造函数是一个命名空间。 以下编译就好了:

 public class Foo { public Foo() {} public void Foo() {} } 

我现在不知道为什么 java语言设计者决定将new语句添加到java语言中,但是,我不想错过它。 即使它不允许给类,方法和字段提供相同的名称,也可能是多余的,就像其他人已经在他们的答案中所示:

因为 – 它极大地提高了可读性。 每当我读到这个new陈述时,我立即意识到一个新的对象诞生了。

如果你来自C ++,为什么你会感到惊讶? 出于同样的目的,C ++不具有相同的new吗? Java试图遵循大多数C / C ++语法,这很可能就是原因。

评论artbristol的答案:Java设计者首先列出名称空间是非常不可能的,然后被迫添加新的关键字。 很可能恰恰相反: new首先存在,然后他们发现它允许它们将构造函数名称与其他名称冲突。

必须用Java编写new以创建新的对象实例。

 public class Foo { public void test() { final Foo foo1 = new Foo(); final Foo foo2 = Foo(); } public Foo Foo() { System.out.println("hello world"); return this; } } 

请注意,在Java中不鼓励以大写字符开头的方法以避免混淆。