12/09/2010

Point théorique Java : Construction

1) Ordre

- 1. 	La première action du constructeur est d'initialiser ses paramètres
- 2. + Soit le constructeur n'est pas celui de Object, auquel cas il appelle un autre constructeur via :
* l'utilisation explicite de this(...)
* l'utilisation explicite de super(...)
* l'utilisation implicite de super() sans argument
+ Soit le constructeur est celui de Object et il passe à l'étape 3.
Cet appel implique le lançement des étapes 1 à 4 pour le constructeur appelé.
- 3. il exécute ensuite les instance initializers
- 4. puis le reste de son code


2) Surcharge
En java la surcharge des méthodes est valide dès le début de la création de l'objet.
Notament,le constructeur d'un objet peu appeler des méthodes surchargées, ce qui peut induire l'utilisation de variables non-initialisées.

09/09/2010

Questions pièges Java n°6b : réponse

Code :

class Base {
Base ( ) {init ( ); }
void init ( ) { System.out.println(2); }
}
class Derived extends Base{
int i = 4;
final int j = 4;
void init() { System.out.println ( i +" "+j); }
}
public class AClass {
public static void main(String[ ] args){
Derived c = new Derived( );
}
}


Réponse
0 4

Explication
En java la surcharge est effective, même dans le constructeur :
- Derived( ) appelle Base ( ) 
- Base appalle Derived.init( )
- init affiche i et j
- Derived( ) passe i à 4


La variable i n'est donc pas encore initialisée lors de la première exécution de init(), visiblement la valeur d'une variable non-initialisée pour ma version de la JVM est 0.

La variable j est, elle, curieusement initialisée, ce qui semble prouver que les instance initializer des variables finales ne sont pas traités de la même façon que ceux des variables non-finales.

Point théorique associé
ici et ici

08/09/2010

Questions pièges Java n°6a : réponse

Code :

class Base{
{ System.out.print ( "A"); };
Base( ) { System.out.print ("B"); }
}
class Derived extends Base{
{ System.out.print ("C"); };
Derived ( ) {
this ( 0 );
System.out.print ("D");
}
Derived ( int i ) {
System.out.print ("E");
}
{ System.out.print ("F"); };
}
public class AClass {
public static void main(String[ ] args){
Derived c = new Derived( );
}
}


Réponse
ABCFED

Explication
- Derived() appelle Derived(int)
- Derived(int) appelle Base()
- Base() appelle Object()
- Base() affiche A (les initialiseurs d'instance avant le corps du constructeur)
- Base() affiche B
- Derived(int) affiche C
- Derived(int) affiche F
- Derived(int) affiche E
- Derived() affiche D


Point théorique associé
ici