为什么我们不在声明字段后立即对其进行初始化?

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);
    }
}