1

public class A
{
   A()
   {
      func() ;
   }

   void func()
   {
   }
}
public class B
      extends A
{
   B()
   {
      super() ;//appelle le constructeur de A, et donc func, qui se trouve être surchargé ici.
      //mais alors, quel est l'état de booooo ?
      //Ce n'est pas encore true, car l'initialisation de B n'a pas encore eu lieu.
      //En pratique ça a l'air d'être false, mais... C'est juste un hasard, non ?!
      //Sinon ça voudrait dire que booo est initialisé deux fois, d'abord avec la valeur par défaut (false en effet), 
      //puis true explicitement. Or je croyais que l'affectation explicite était similaire aux listes d'initialisations de C++ 
      //et que par conséquent ce n'était initialisé qu'une fois ?!
      //Merci d'avance !
   }

   boolean booooo= true ;
   @Override
   void func()
   {
      System.out.println(booooo) ;
   }


   public static void main( String[] args )
   {
      B b= new B() ;//affiche false apparemment... !!!
      b.func() ;//affiche true, c'est normal
   }
}

2

PS : je sais que c'est pas une très bonne idée d'appeler une fonction dans le constructeur, mais c'est juste un test case, mon cas est plus complexe (une histoire d'événements), et puis surtout je voudrais connaître votre avis sur l'état de boooo et la double (?) initialisation.

3

Comme quoi la spec du Java ne garantit pas dans tous les cas que les variables sont initialisées correctement, contrairement à ce qu'elle prétend. sick
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

4

effectivement la variable est initialisée plusieurs fois, je ne le savais pas non plus.
(vu en faisant du pas-à-pas)

lien qui confirme :
http://www.artima.com/designtechniques/initializationP.html
=>
"Note that this means that if you explicitly initialize innerCoffee, say to a value of 100, then when each CoffeeCup object is created, innerCoffee will, in effect, be initialized twice. First, innerCoffee will be given its default initial value of zero. Later, the zero will be overwritten with the proper initial value of 100. All of this takes place while the Java virtual machine is creating the new object -- before it returns the reference to the new object. By the time the reference to a new CoffeeCup object is returned from the new operator, the innerCoffee field will be set to 100"

confirmé sur le site d'oracle :
http://docs.oracle.com/javase/specs/jls/se7/html/jls-12.html
(voir exemple 12.5-1)


bon à savoir en tout cas :/
avatar

5

eek D'après le premier lien, l'initialisation a lieu 2 fois même sans héritage, pour un membre privé! sick
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

6

-

7

SCPCD (./4) :
effectivement la variable est initialisée plusieurs fois, je ne le savais pas non plus.
Moué, c'est étrange que ça ne remplace pas l'initialisation par défaut, je pensais vraiment que c'était le cas.
(vu en faisant du pas-à-pas)
Tu traces avec quoi ? Eclipse ?

8

oui avec eclipse.
avatar

9

Et tu as pu voir la double initialisation ?! (ici, il passe sur l'initialisation explicite, oui, mais pas sur celle par défaut)

10

non effectivement on ne voit pas l'initialisation implicite, qui doit être faite par le new avant d'appeler les constructeurs.

Néanmoins, c'est clairement écrit sur le site d'oracle que les variables sont initialisées à une valeur par défaut ("0") avant d'aller dans le constructeur, qu'ensuite il y a appel des constructeurs et qu'enfin les variables sont initialisées avec les valeurs explicites.
avatar

11

OK.
Oui j'ai vu, sauf que attention, d'après ce que tu as écrit on pourrait croire que les initialisations explicites sont réalisées après le passage dans le constructeur de la classe correspondante alors que non, ça commence bien par ça dès que ça revient du super().