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
06/09/2010
Questions pièges Java n°6
Double question !
Question 6a :
Qu'affiche le code suivant (à supposer que la fonction main soit effectivement exécutée) :
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( );
}
}
Question 6b :
Qu'affiche le code suivant (à supposer que la fonction main soit effectivement exécutée) :
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( );
}
}
15:29 Publié dans Programmation | Lien permanent | Commentaires (0) | Tags : java1.5, question piège
23/06/2010
Point théorique Java : Enchainements de conversion
Les enchainements de conversions autorisés lors d'une assignation, d'un passage de paramètre ou d'une opération sont :
Légende :
// I = identity
// WP = Widening primitive
// WR = Widening reference
// B = Boxing
// U = Unboxing
Ainsi on peut écrire :
Number n = 4; //(Boxing en Integer -> Widening reference)
Objet o = 4; //(id)
long l = (Integer)4; //(Unboxing -> de Widening primitive)
De la même facon
// même chose pour un passage de paramètre
MethodQuiAttendUnObject(4);
// même chose pour une opération
long l = ((Integer)4 + 7);
Mais on ne peut toujours pas écrire :
Long l = 4; //(widening reference -> Boxing) est interdit
En pratique ces exemples semblent être les seuls cas intéressants.
(*) Identity est la conversion qui transforme un type en lui même.
Le fait que ce soit autorisé permet parfois de rendre le code plus lisible ex :
{
int quelquechose = 4;
... un grand nombre de lignes de code sans utiliser la variable quelquechose;
(int)quelquechose += 5;
}
14:22 Publié dans Programmation | Lien permanent | Commentaires (0) | Tags : java1.5, point théorique