QCM de Java corrigé

Programming, Java · exam

Voir tous les documents en programmation

QCM de Java corrig´e

1. Java est un langage

(a)

(b)

(c)

(d)

Compil´e

Interpr´et´e

Compil´e et interpr´et´e

Ni compil´e ni interpr´et´e

Le compilateur compile le code source vers un bytecode, la machine virtuelle Java

(JVM) interpr`ete ce bytecode

2. Java est un langage d´evelopp´e par

(a)

(b)

Hewlett-Packard

Sun Microsystems

(c) Microsoft

(d)

Oracle

Par James Gosling chez Sun.

3. Combien d’instances de la classe A cr´ee le code suivant?

A x,u,v;

x=new A();

A y=x;

A z=new A();

(a)

(b)

(c)

(d)

Aucune

Cinq

Trois

Deux

Il y a deux instances de A cr´e´ees par les deux new, la premi`ere est r´ef´erenc´ee par x

et y, la deuxi`eme par z.

Publicité

4. Pour la classe B d´efinie comme suit:

class B {

public B(){System.out.print(”Ciao”);};

public B(int i) {this(); System.out.println(”Bonjour ”+i);};

}

qu’affichera l’instruction suivante?

B monB=new B(2003);

(a)

(b)

(c)

(d)

erreur de compilation

erreur d’ex´ecution

CiaoBonjour 2003

Bonjour 2003

L’instruction invoque le constructeur avec un argument entier (2003). Ce dernier

appelle explicitement le constructeur sans arguments (this()) qui imprime ”Ciao”,

et ensuite le message ”Bonjour 2003” est imprim´e.

1

5.

(a)

(b)

(c)

(d)

Une classe peut impl´ementer plusieurs interfaces mais doit ´etendre une seule classe

Une classe peut impl´ementer plusieurs classes mais doit ´etendre une seule interface

Une classe peut impl´ementer plusieurs classes et peut ´etendre plusieurs interfaces

Une classe doit impl´ementer une seule interface et ´etendre une seule classe

C’est comme ¸ca

6. La liaison tardive est essentielle pour assurer

(a)

(b)

(c)

(d)

l’encapsulation

le polymorphisme

Publicité

l’h´eritage

la marginalisation

La marginalisation n’a rien `a voir avec la programmation. La liaison tardive dy-

namique permet d’utiliser pour chaque objet sa propre version d’une m´ethode (en

fonction de la classe de l’objet d´etermin´ee `a l’ex´ecution). Ceci permet d’obtenir un

code polymorphe.

7. ´Etant donn´e que la classe Grande ´etend la classe Petite, trouvez une ligne correcte parmi les

suivantes

(a)

Petite y =new Petite(); Grande x= (Grande)y; Petite z=x;

(b)

(c)

La deuxi`eme affectation Grande x= (Grande)y; essaye de transformer un objet

(r´ef´erenc´e par y) de la classe Petite vers un objet de sa sous-classe Grande. Un

tel downcasting est impossible.

Grande x= new Grande(); Petite y = x; Grande z=(Grande)y;

Tout va bien. On cr´ee un objet de classe Grande r´ef´erenc´e par x. Ensuite on fait

une variable y (de type Petite) r´ef´erencer le mˆeme objet – c’est un upcasting explicite

qui est toujours possible. `A la fin on fait encore une r´ef´erence z (cette fois Grande)

sur ce mˆeme objet. Ce dernier downcasting est possible parce que l’objet est en fait

une instance de la classe Grande.

Grande x= new Grande(); Petite y = x; Grande z=y;

C’est presque comme dans le cas pr´ec´edent, mais la derni`ere affectation Grande

z=(Grande)y; est un downcasting implicite, ce qui est interdit.

(d)

Petite y =new Petite(); Grande x= (Grande)y; Petite z=(Petite)x;

Grande x=(Grande)y; est un downcasting impossible, comme dans le (a).

2

8. Pour la classe C d´efinie comme suit:

class C {

public static int i;

public int j;

public C() {i++; j=i; }

}

qu’affichera le code suivant?

C x=new C(); C y=new C(); C z= x;

Publicité

System.out.println(z.i + ” et ” + z.j);

(a)

(b)

(c)

(d)

2 et 2

1 et 1

2 et 1

1 et 3

On remarque d’abord, que i est une variable (statique) de classe commune `a toutes

les instances, tandis que chaque objet de la classe a son propre j. Donc, apr`es

la premiere affectation on a i=1, x.j=1; apres la deuxi`eme: i=2, y.j=2 (x.j a rest´e

inchang´e et ´egal a 1); la troisieme n’appelle pas le constructeur mais fait z r´ef´erencer

le mˆeme objet que x. D’ou z.i est la valeur globale de i, c-a-d 2, et z.j=x.j=1.

9. Pour les classes A et B d´efinies comme suit:

class A {

public int x;

public A() {x=5; }

}

class B extends A {

public B() {x++;}

public B(int i){this(); x=x+i; }

public B(String s){super(); x- -; }

}

qu’affichera le code suivant?

B b1=new B(); B b2 =new B(2003); B b3= new B(”Bonjour”);

System.out.println(b1.x + ” et ” + b2.x + ” et encore ” + b3.x );

(a)

(b)

(c)

(d)

6 et 2009 et encore 4

1 et 2004 et encore 4

1 et 2004 et encore 2003

autre chose

Le constructeur B() n’appelle explicitement ni this(), ni super(). Donc, par con-

Publicité

vention, le constructeur de la super-classe A est appel´e (implicitement) avant de

proc´eder. Ceci donne b1.x=6. Le constructeur B(2003) appelle le constructeur

pr´ec´edent avec le this(), ce qui donne b2.x=6. Ensuite on y ajoute 2003, ce qui

donne finalement b2.x=2009 Le constructeur B(”Bonjour”) appelle le constructeur

de la super-classe A avec le super(). Ceci donne b3.x=5. Ensuite on le decr´emente

et on a finalement b3.x=4.

3

10. Pour les classes Machin et Bidul d´efinies comme suit:

class Machin {

public int f() {return(5) };

public static int g() {return (6);}

}

qu’affichera le code suivant?

Bidul b=new Bidul(); Machin m =b;

System.out.println(m.f()*m.g());

class Bidul extends Machin {

public int f() {return(2) };

public static int g() {return (4); }

}

(a)

(b)

(c)

(d)

30

20

8

12

La methode g est statique, la version utilis´ee est d´etermin´ee par le compilateur en

fonction du type de la r´ef´erence. Comme m est une r´ef´erence Machin, m.g() - c’est

toujours la m´ethode g de la classe Machin (valeur 6). Pour f tout est diff´erent: sa

version utilis´ee est d´etermin´ee dynamiquement (`a l’execution)par la JVM en fonc-

tion du type de l’objet. Dans le cas de m.f(), m fait r´ef´erence `a une instance de Bidul,

c’est donc la version de f red´efinie dans la classe Bidul qui est invoqu´ee (valeur 2).

D’o`u la r´eponse.

4