【问题标题】:calling constructor through array of objects通过对象数组调用构造函数
【发布时间】:2012-09-23 09:42:19
【问题描述】:
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 次?

【问题讨论】:

  • 如果我取一个ineteger(非静态)让我们说int b;然后 obj[0].b=1;说空指针异常,我明白了。但是怎么 obj[0].i=3;有效吗?
  • 之所以有效,是因为i 是静态的,不需要A 的任何实例来保存值。

标签: java constructor calling-convention


【解决方案1】:

线

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];
      ^

【讨论】:

  • 我用c++已经有一段时间了,但我不相信它会构造30个A...的实例?
  • A obj[30] = new A[30];... 抱歉打错了。我想要一个没有循环或递归的实现,所以感谢第一种方法
  • 您好,我想知道是否可以使用“增强型”for 循环来执行此操作:for (A a : obj) { a = new A(); }
  • @Gruvw 否,因为增强循环没有对分配新实例所需的索引的引用
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    没有办法完全按照你的意愿去做,但这里有两件事非常接近,都调用了默认构造函数 30 次:

    A *obj = new A[30];
    

    或

    A obj[30];
    

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-02
      • 1970-01-01
      相关资源
      最近更新 更多