我来自C ++,所以有一个我不太了解的java功能。我已经读过必须使用关键字new
创建所有对象,但基元除外。现在,如果编译器可以识别基本类型,并且不允许您创建一个没有new
调用其构造函数的对象,那么关键字new
的原因是什么?有人提供一个例子,当两行代码相同时,只有new
的存在,编译并具有不同的含义/结果?
只是为了澄清多余的意思,并希望让我的问题更清楚。 new
会添加任何内容吗?是否可以在没有new
的情况下表达语言,以便通过构造函数实例化对象?
答案 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中不鼓励以大写字符开头的方法以避免混淆。