"¡Hola, Amigo! Hoy, Bilaabo hablará sobre el orden en que se inicializan las variables ".

Imagina que estás mirando algún código. ¿Qué valores obtienen las variables?

Código
class Cat
{
 public int a = 5;
 public int b = a + 1;
 public int c = a * b;
}
Código
class Cat
{
 public int a = getSum();
 public int b = getSum() - a;
 public int c = getSum() - a - b;

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

"¿Eso está realmente permitido?"

"Por supuesto. El orden en que se declaran los métodos y campos miembros de una clase no es importante " .

Una clase se carga de arriba a abajo, por lo que es importante que un campo solo acceda a otros campos que ya se hayan cargado. En el ejemplo, b puede acceder a a , pero no sabe nada sobre c .

"¿Y qué pasará?"

"Cuando se crean variables, obtienen valores predeterminados".

Código lo que realmente sucede
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;
 }
}

"¡Santo cielo! Es tan simple. Gracias, Bilaabo. ¡Eres un verdadero amigo!"

"¡Hurra! ¡Bilaabo tiene un amigo!"