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

Commentaires

Bonjour,

Ici la variable j démontre l'existence d'une ambiguïté de Java.

Il existe en fait deux genres de variables finales en Java:
- Les expressions constantes.
- Les autres.

+ Une variable finale est une expression constante, si et seulement si elle est initialisée lors de sa déclaration, avec une expression constante.
Exemples d'expressions constantes :
4
3 + 8
"Bonjour"
"Bonjour" + " le " + "sol"
j
j + 1

Une expression constante est évaluée par le compilateur, donc bien avant chargement de la classe ou constructeur.
Et une variable finale initialisée lors de sa déclaration par une expression constante, est elle-même une expression constante.

+ Exemples d'expressions non-constantes :
i
Math.min(4, 5)

En faisant quelques essais, on constate qu'on a des résultats très différents, suivant que j est initialisée à sa déclaration par une expression constante, ou après sa déclaration ou avec une expression non-constante.

Écrit par : thelvin | 15/09/2010

Les commentaires sont fermés.