0

我们可以做的 :

class A {
     // some code
}

class B {
    A obj = new A(); // ???
}

询问 :

  • 我的理解是obj(类A)的实例不是静态的,因此在类内存中不可用B
  • 在这种情况下,是否会为每个实例初始化B
  • 在实际停留在(即静态)obj的类内存中的情况下,那么实例的初始化会在什么时候发生呢?Bobj
  • 无论哪种方式,这是一个好习惯吗?
  • 那么,如果我们能做到这一点,为什么还要有构造函数呢?

随时纠正我。

4

3 回答 3

5

像这样初始化的字段是常见的做法。

您可以将它们视为构造函数的一部分,类似于实例初始化程序块。

我们仍然有构造函数,因为有时你想要接受参数并且有复杂的逻辑。

如果您有多个构造函数(将为每个代码路径初始化字段),则该模式特别方便。

于 2013-10-01T03:37:12.727 回答
0

A 不是静态的,因此在类内存中不可用。

正确的。你必须有一个实例B才能到达现场A obj

它会为 B 的每个对象预初始化吗?

是的。new A将为每个创建的单独创建一个B

如果这必须留在 obj 内存中,那么这个初始化什么时候会发生?

不适用

无论哪种方式,这是一个好习惯吗?

是的。它被称为对象组合,从其他对象组合对象是使用面向对象设计分解问题的两种主要方法之一。另一个是继承。

那么,如果我们能做到这一点,为什么还要有构造函数呢?

这只是语法糖。以下所有内容都是等效的。

class B {
  A obj = new A();  // field initializer
}

class B {
  A obj;
  B() {
    A = new A();  // initialized in constructor
  }
}

class B {
  A obj;
  { obj = new A(); }  // instance initializer
}

只要什么都不读obj在初始化期间没有读取任何内容,在字段、构造函数或显式初始化程序中进行初始化之间就没有明显的区别。

有时在声明字段的地方分配一个值会更方便。

于 2013-10-01T03:40:15.280 回答
0

A 不是静态的,因此在类内存中不可用。

Right.classA将在被实例化时B被实例化

它会为 B 的每个对象预初始化吗?

是的。每当您创建 的对象时BA也会创建对象

无论哪种方式,这是一个好习惯吗?

实际上,它与通过构造函数进行实例化相同。所以没有问题是好的或坏的做法

那么,如果我们能做到这一点,为什么还要有构造函数呢?

如果您有多个构造函数,则不必A在每个构造函数中实例化。

于 2013-10-01T03:38:03.513 回答