为什么java有新关键字?要创建A
类型的对象,我必须输入A a = new A()
。
Java没有堆栈分配,为什么不能简化为A a = A()
?
答案 0 :(得分:3)
因为C ++这样做了,我猜想。 Java应该像C ++一样表面上看,但是使用了大大简化和简化的语言。
无论如何,你遇到了一个问题:
class Foo {
private static void A() {
System.out.println("method");
}
public static void main(String[] args) {
A();
}
}
class A {
public A() {
System.out.println("ctor");
}
}
这里会发生什么? ctor
或method
?
答案 1 :(得分:2)
您的语法建议有一个明显的缺点:
class A {}
class B extends A {
public A A() { return new B() }
public A foo() { return A(); } //ERK
}
方法foo
中的上述代码应该怎样做?它是否调用名为A()
的方法或A
的构造函数。
当然,您现在可以使用静态导入:
获得您想要的内容public class A {
public static A A() { return new A(); }
}
这可以通过import static my.stuff.A.*
答案 2 :(得分:1)
你知道你在调用构造函数而不是方法。
答案 3 :(得分:0)
这是任意的。 Python构造函数或多或少像Java构造函数一样工作,只是A(),不需要新的。
答案 4 :(得分:0)
在Java中,类,方法和变量具有不同的名称空间,这意味着在任何范围内,每个名称空间都可以具有相同的名称。说A a = A();
是不明确的,因为可能有一个名为A()
的方法。当然,Java可以寻找一个方法并使用类构造函数,如果它找不到方法......但是,它不会显而易见(从查看代码)它做什么,而Java人是对“纯洁”很重视。另外,如果您碰巧在课程中添加了public A A()
,那么这行代码就会有不同的含义。
答案 5 :(得分:0)
这是任意的,但可以想到很多原因。
一个原因与混合自动(基于堆栈)和堆分配对象及其引用有关。您知道如何在C ++中小心不要将指针指向自动变量吗?这是一个不用担心的问题。
第二个原因可能是Java通常被设计为具有低成本对象分配和最近对象的低成本GC(由于使用了分代垃圾收集器)。因此,支持两种类型的对象分配没有显着的好处。