在类定义的开头定义和初始化成员变量之间有什么区别,首先定义成员变量并在构造函数中初始化成员变量 ?
比如说:
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() {...}
}
提前致谢。
答案 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。