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

jua*_*nza 25 java

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

只是为了澄清多余的意思,希望能让我的问题更加清晰.不new添加任何东西?语言是否可以在没有new通过构造函数实例化对象的情况下表达?

art*_*tol 47

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

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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • @Riduidel:让它更加令人困惑:将`TheClass`方法设置为一个返回新的`TheClass`对象的工厂方法,但使它与构造函数略有不同. (6认同)
  • Java设计者首先布置命名空间是非常不可能的,然后被迫添加`new`关键字.很可能恰恰相反:`new`首先存在,然后他们发现它允许它们让构造函数名称与其他名称冲突. (5认同)
  • @Joachim所以你可以编写`static TheClass TheClass()`OMFG!这里是龙...... (3认同)
  • 从来没有意识到Java不可能实现这种特技。糟糕的写作给迷惑的全新世界打开了我的大门! (2认同)
  • 简而言之,答案是"是的,但是有一种隐喻,看起来:". (2认同)

ste*_*vls 14

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

public class Foo {
    public Foo() {}
    public void Foo() {}
}
Run Code Online (Sandbox Code Playgroud)

  • 它编译得很好,但在我看来它没有任何意义,除了混淆.如果它只是禁止与类/构造函数同名的方法,那么语言会更好.(我仍然会留下`new`关键字,但这是一个大多数独立的讨论;而且,我不是下注者) (4认同)

And*_*s_D 6

我现在不知道为什么 java语言设计者决定将new语句添加到java语言中,但是,我不想错过它.即使如果它可能是多余的,如果它没有被允许给类,方法和字段的名称相同,像其他人一样在他们的答案都已经显示:

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

  • 所以你认为在工厂方法中隐藏分配是一种糟糕的风格?我假设没有. (2认同)