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

时间:2011-06-14 07:44:22

标签: java

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

只是为了澄清多余的意思,并希望让我的问题更清楚。 new会添加任何内容吗?是否可以在没有new的情况下表达语言,以便通过构造函数实例化对象?

5 个答案:

答案 0 :(得分: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");
        }
    }
}

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

答案 1 :(得分:14)

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

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

答案 2 :(得分:6)

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

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:-3)

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

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中不鼓励以大写字符开头的方法以避免混淆。