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
15:34 Publié dans Programmation | Lien permanent | Commentaires (1) | Tags : java1.5, reponse question piege
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
14:32 Publié dans Programmation | Lien permanent | Commentaires (0) | Tags : java1.5, reponse question piege
16/06/2010
Questions pièges Java n°5 : réponse
Code :
class AClass {
public static void main() {
Byte B1 = 2;
Byte B2 = 200;
Long L = 2;
Number N = 2;
Object O = 2;
}
}
Réponse
Les trois premières lignes du corps de la fonction main sont incorrectes
Explication
La première ligne est incorrecte car :
- on ne peut pas Boxer un int en Byte, on ne peut que le boxer en Integer
- il n'existe pas de conversion de Byte en Integer
- il n'existe pas d'enchainement de conversion implicite qui commençe par caster un int en byte puis qui le boxe en Byte
Ceci n'a rien à voir avec la valeur contenue dans le Byte. La ligne 4 est donc tout aussi incorrecte.
Cela n'a rien à voir non plus avec le fait que le byte soit plus "étroit" que le int. La ligne 5 est incorrecte pour exactement les mêmes raisons.
Les lignes 6 et 7 sont correctes. Il s'agit d'un enchainement de conversions :
- Boxing (int -> Integer)
- Widening reference (Integer ->Number) ou (Integer -> Object)
Point théorique associé
ici
14:21 Publié dans Programmation | Lien permanent | Commentaires (2) | Tags : java1.5, reponse question piege