« Bonjour, Amigo ! Aujourd'hui, Bilaabo te parlera de l'ordre dans lequel les variables sont initialisées. »

Imagine que tu observes du code. Quelles valeurs les variables reçoivent-elles ?

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

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

« C'est vraiment autorisé ? »

« Bien sûr. L'ordre d'initialisation des méthodes et champs membres d'une classe n'a pas d'importance. »

Une classe est chargée de haut en bas, il est donc important qu'un champ accède uniquement aux autres champs qui ont déjà été chargés. Dans l'exemple, b peut accéder à a, mais cette variable ne sait rien au sujet de c.

« Que se passe-t-il, alors ? »

« Lorsque les variables sont créées, elles reçoivent des valeurs par défaut. »

Code Ce qui se passe vraiment
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;
 }
}

« Nom d'une pipe en bois ! C'est si simple. Merci, Bilaabo. Tu es un vrai ami ! »

« Hourra ! Bilaabo a un ami ! »