在类定义的开头或构造函数中初始化成员变量?

时间:2011-08-24 00:31:57

标签: java

在类定义的开头定义和初始化成员变量之间有什么区别,首先定义成员变量并在构造函数中初始化成员变量

比如说:

public class Test {
   private int foo = 123;
   private boolean flag = false;

   public void fooMethod() {...}
}

对战:

public class Test {
   private int foo;
   private boolean flag;

   public Test() {
      foo = 123;
      flag = false;
   }

   public void fooMethod() {...} 
}

提前致谢。

5 个答案:

答案 0 :(得分:22)

在您的示例中,唯一的区别是它们被初始化时。根据JLS,在调用构造函数之前初始化实例变量。当你有超级类来处理时,这会变得很有趣,因为初始化顺序并不总是那么明显。有了它,请记住,当没有调用显式超级构造函数时,仍然会初始化“超级”实例变量。

答案 1 :(得分:8)

不同之处在于它们的初始化/设置顺序。

在调用构造函数之前,将声明/设置您的类成员变量。我个人的偏好是在构造函数中设置它们。

答案 2 :(得分:2)

类内初始化允许您避免编写一个简单的构造函数。

您必须初始化依赖于构造函数内的构造函数参数的实例成员。为了便于阅读,将所有其他实例成员的初始化放在同一构造函数中可能是合理的。

否则,没有区别。

答案 3 :(得分:0)

通常,构造函数将接受参数并将这些参数分配给类的字段。

public Test(int foo, boolean flag)
{
   this.foo = foo;
   this.flag = flag;
}

答案 4 :(得分:0)

声明它们时首先进行初始化(并确保始终将它们初始化为某种东西)。通常在其中放置默认值。构造函数接下来发生,并将其设置为允许调用者使用构造函数参数指定初始值。

public class Test {
   private String foo = "default String";
   private int bar = 0;

   public Test() {
   }
   public Test(String specificString) {
      this.foo = specificString;
   }

   public void fooMethod() {...} 
}

在此示例中,如果您使用空构造函数(或子类未显式调用其构造函数),则foo会初始化为默认值,而如果将String传递给构造函数,则会覆盖默认值。无论调用哪个构造函数,bar的默认值均为0。