为什么java有新的?

时间:2011-01-16 16:21:08

标签: java

  

可能重复:
  Why do C# and Java bother with the “new” operator?

为什么java有新关键字?要创建A类型的对象,我必须输入A a = new A()

Java没有堆栈分配,为什么不能简化为A a = A()

6 个答案:

答案 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");
  }
}

这里会发生什么? ctormethod

答案 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(由于使用了分代垃圾收集器)。因此,支持两种类型的对象分配没有显着的好处。