「こんにちは、アミーゴ! 今日は、ビラーボが変数が初期化される順序について話します。」

いくつかのコードを見ていると想像してください。変数はどのような値を取得しますか?

コード
class Cat
{
 public int a = 5;
 public int b = a + 1;
 public int c = a * b;
}
コード
class Cat
{
 public int a = getSum();
 public int b = getSum() - a;
 public int c = getSum() - a - b;

 public int getSum()
 {
  return a + b + c;
 }
}

「それって本当に許されるの?」

「もちろんです。クラスのメンバーのメソッドとフィールドが宣言される順序は重要ではありません。

クラスは上から下にロードされるため、フィールドはすでにロードされている他のフィールドにのみアクセスすることが重要です。この例では、b はaにアクセスできますが、 cについては何も知りません。

「そして何が起こるでしょうか?」

「変数が作成されると、デフォルト値が取得されます。」

コード 本当に何が起こるのか
class Cat
{
 public int a = 5;
 public int b = a + 1;
 public int c = a * b;
}
class Cat
{
 public int a = 0;
 public int b = 0;
 public int c = 0;

 public Cat()
 {
  super();

  a = 5;
  b = a + 1; //5+1 = 6
  c = a * b; //5*6 = 30
 }
}
class Cat
{
 public int a = getSum();
 public int b = getSum() - a;
 public int c = getSum() - a - b;

 public getSum()
 {
  return a + b + c;
 }
}
class Cat
{
 public int a = 0;
 public int b = 0;
 public int c = 0;

 public Cat()
 {
  super();

  a = getSum(); //(a+b+c)=0
  b = getSum() - a; //(a+b+c)-a=b=0
  c = getSum() - a - b; //(a+b+c)-a-b=c=0
 }

 public getSum()
 {
  return a + b + c;
 }
}

「なんてことだ! とても簡単なことだよ。ありがとう、ビラーボ。君は本当の友達だよ!」

「万歳! ビラーボには友達がいるよ!」