为什么我们不在声明字段后立即对其进行初始化?
Why don't we initialize the fields as soon as we declare them?
为什么我们不在 class 中声明字段后立即对其进行初始化?如果我们在声明字段后立即对其进行初始化,代码的工作流程是否会有所不同?关键是,为什么我们不在构造函数之上初始化它们?
我们可以在声明的时候初始化一个字段:
class Foo {
int a = 1;
}
我们可以在构造函数中初始化一个字段:
class Foo {
int a;
Foo() {
a = 1;
}
}
我们甚至可以在初始化块中初始化一个字段:
class Foo {
int a;
{
a = 1;
}
}
实际上,编译器将第一种和第三种形式转换为第二种形式。
(当然,如果字段不是final
,我们也可以在方法中(重新)赋值)。
如果你在写代码的时候知道初始值a
,而且是一个简单的表达式,一定要写成第一种方式;通常值得避免初始化方法(主要是因为它不寻常,而且不是很漂亮)。如果你有多个构造函数,但想在所有构造函数中设置相同的值,这种方式很棒:相同的初始化被复制到所有构造函数中(或者至少是那些不调用 [=16 的构造函数) =]).
但是如果你需要根据构造函数参数之类的东西来设置 a
,你必须采用(类似)第二种方式:
class Foo {
int a;
Foo(int a) {
this.a = a;
}
}
您使用哪种方法取决于具体情况。
首先:我们可以!
要获得更深入的答案,我将引用 The Java Tutorials 中的内容:
However, this form of initialization has limitations because of its simplicity. If initialization requires some logic (for example, error handling or a for loop to fill a complex array), simple assignment is inadequate.
因此,为了保持代码的连贯性和同质性,确保代码的可读性,我们倾向于避免直接初始化some字段和some构造函数中的其他人(或其他地方)。
我只初始化 final 字段,其他一切都由构造函数初始化。
class MyClass{
final static int SERIAL = 12345678;
int a, b, c, d;
MyClass(int i){
a = b = c = d = i;
}
MyClass(){
this(1);
}
}
为什么我们不在 class 中声明字段后立即对其进行初始化?如果我们在声明字段后立即对其进行初始化,代码的工作流程是否会有所不同?关键是,为什么我们不在构造函数之上初始化它们?
我们可以在声明的时候初始化一个字段:
class Foo {
int a = 1;
}
我们可以在构造函数中初始化一个字段:
class Foo {
int a;
Foo() {
a = 1;
}
}
我们甚至可以在初始化块中初始化一个字段:
class Foo {
int a;
{
a = 1;
}
}
实际上,编译器将第一种和第三种形式转换为第二种形式。
(当然,如果字段不是final
,我们也可以在方法中(重新)赋值)。
如果你在写代码的时候知道初始值a
,而且是一个简单的表达式,一定要写成第一种方式;通常值得避免初始化方法(主要是因为它不寻常,而且不是很漂亮)。如果你有多个构造函数,但想在所有构造函数中设置相同的值,这种方式很棒:相同的初始化被复制到所有构造函数中(或者至少是那些不调用 [=16 的构造函数) =]).
但是如果你需要根据构造函数参数之类的东西来设置 a
,你必须采用(类似)第二种方式:
class Foo {
int a;
Foo(int a) {
this.a = a;
}
}
您使用哪种方法取决于具体情况。
首先:我们可以!
要获得更深入的答案,我将引用 The Java Tutorials 中的内容:
However, this form of initialization has limitations because of its simplicity. If initialization requires some logic (for example, error handling or a for loop to fill a complex array), simple assignment is inadequate.
因此,为了保持代码的连贯性和同质性,确保代码的可读性,我们倾向于避免直接初始化some字段和some构造函数中的其他人(或其他地方)。
我只初始化 final 字段,其他一切都由构造函数初始化。
class MyClass{
final static int SERIAL = 12345678;
int a, b, c, d;
MyClass(int i){
a = b = c = d = i;
}
MyClass(){
this(1);
}
}