通过对象数组调用构造函数

时间:2012-09-23 09:42:19

标签: java constructor calling-convention

class A
{
  static int i;
  A()
  {
    System.out.println(++i);
  }
  public static void main(String h[])
  {
    A obj[] = new A[30]; 
  }
}
  

obj [30] =新A [30]; : - 此行应调用默认值   构造函数30次?

3 个答案:

答案 0 :(得分:11)

该行

A obj[30] = new A[30];

不会调用A的构造函数。它创建了30个未经实例化的A;

引用

要实例化30个对象引用,可以使用:

A obj[] = { new A(), new A(), ..28 more ->
};
在这种情况下,给定元素数量

或更好:

for (int i=0; i < obj.length; i++) {
   obj[i] = new A();
}

注意,在数组大小声明中首次使用30是非法的。

A obj[30] = new A[30];
      ^

答案 1 :(得分:2)

不,这行根本不会调用构造函数。它只创建30个元素长数组A。数组的每个元素都是null

答案 2 :(得分:0)

没有办法完全按照你想要做的去做,但这里有两件事情非常接近,都是默认构造函数的30次:

A *obj = new A[30];

A obj[30];

第一个答案将在堆上创建一个包含30个A对象的数组,为每个对象调用默认构造函数。 obj可以传递回此函数的调用者,因为它不在堆栈中。问题是,obj不再具有A [30]的类型,因此sizeof(obj)将与原始问题中的代码不同。 (注意,“delete []”必须用于obj,而不仅仅是“删除”。)

第二个答案将在堆栈上创建一个包含30个A对象的数组。现在编译器将理解obj有30个元素,而sizeof(obj)将与你的问题中的相同。但是,obj只能在这个函数(或它调用的函数)中使用,因为一旦函数返回,它将从堆栈中消除,在进程中调用30个析构函数。 (它只是一个局部变量。)

使用C ++(或任何良好的面向对象语言),创建对象总是意味着分配空间和调用构造函数。否则,你真的没有有用的对象。因此,当以任何支持的方式创建对象(本地变量或C ++的“new”)时,它总是为您创建的每个对象调用默认构造函数,现在可以访问该对象。 (注意,如果没有默认构造函数,那么答案都不会编译!)