"Olá amigo! Hoje o Bilaabo vai falar sobre a ordem de inicialização das variáveis ​​."

Imagine que você está olhando para algum código. Que valores as variáveis ​​obtêm?

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

"Isso é realmente permitido?"

"Claro. A ordem em que os métodos e campos membros de uma classe são declarados não é importante. "

Uma classe é carregada de cima para baixo, por isso é importante que um campo acesse apenas outros campos que já foram carregados. No exemplo, b pode acessar a , mas não sabe nada sobre c .

"E o que vai acontecer?"

"Quando as variáveis ​​são criadas, elas obtêm valores padrão."

Código O que realmente acontece
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;
 }
}

"Caramba! É tão simples. Obrigado, Bilaabo. Você é um amigo de verdade!"

"Viva! Bilaabo tem um amigo!"