Qcmcorr 2004
Qcmcorr 2004
Qcmcorr 2004
Licence dinformatique
Le 01/12/2004
Questions g
en
erales
Bar`eme :
bonne r
eponse=1pt ; mauvaise r
eponse=-0.5pt ; pas de r
eponse=0pt.
1. class B {
private int x ; private float y ;
public void setX( int x) {this.x=x ; }
public void setY( float y) {this.y=y ; }
}
Questions sp
ecifiques
Les deux instances referencees par a (1`ere) et b (2`eme) sont creees par les deux new. Ensuite
la variable a est reorientee sur la 2`eme instance, en laissant la 1`ere orpheline. Par la suite
linstance orpheline sera nettoyee par le Garbage collector. Do`
u la reponse 2 ;1.
8. Etant donne que la classe Sardine etend la classe Poisson, trouvez une ligne qui passe bien
la compilation mais produit une erreur `a lexecution parmi les suivantes
Poisson y =new Poisson() ; Sardine x= (Sardine)y ; Poisson z=x ;
Tout va bien pour le compilateur : une affectation sans transtypage, un downcasting explicite, un upcasting implicite. Par contre, `
a lexecution la tentative de transtyper un simple
Poisson en Sardine donne une erreur. Donc la premi`
ere ligne correspond `
a l
enonc
e.
Sardine y =new Sardine() ; Poisson x= y ; Sardine z=(Sardine)x ;
Tout va bien pour le compilateur : une affectation sans transtypage, un upcasting implicite, un downcasting explicite. A lexecution le downcasting se passe bien, comme lobjet
reference par x est en realite Sardine. Pas derreur.
Poisson y =new Sardine() ; Object x= y ; Sardine z=x ;
La derni`ere affectation est un downcasting implicite, ce qui est interdit et donne lieu `
a
une erreur `
a la compilation.
Poisson y =new Poisson() ; Sardine z= new Sardine() ; y=z ;
Pas de downcasting - pas de probl`emes.
Pour obtenir la bonne reponse il suffit de ne pas oublier que le constructeur Poule() contient
un appel implicite de Oeuf(). Il faut aussi comprendre que Poule(int i) commence par un this()
qui signifie Poule(), et que Poule(int i) commence par un super(33) qui signifie Oeuf(33). En
tenant compte de toutes ces considerations on obtient la bonne reponse : 32 et 10020 et
encore 5.
11. Pour les classes A et B definies comme suit :
class A {
public int f(int x) {return(x+1) } ;
public static int g(int x) {return (6) ; }
}
class B extends A {
public int f(int x) {return(x+2) } ;
public static int g( int x) {return (x+4) ; }
}
La methode dinstance f est definie dans la classe A et redefinie dans B. Le choix de la version
utilisee seffectue `
a lexecution (liaison tardive) et depend de la vraie classe de lobjet. Comme
la variable a ref`ere en realite `
a un objet de classe B, la JVM utilisera la f de B. Pour la
methode statique g tout est different. Cette methode est associee `
a une classe (et non `
a une
instance), sa version est choisie statiquement par le compilateur. Bref, a.g() signifie A.g(),
c-`
a-d la g de A. La bonne reponse sera donc 24