Vous êtes sur la page 1sur 4

USDB1, Date : Mars 2017

Faculté des sciences


Département d'informatique L2 Corrigé du rattrapage POO

Exercice 1 : Questions de cours ((0.25*2)+(0,75+0.75+0.5) + (0.5*3) + (0.25*4) + (0.25*4)=6 points)


1- Le polymorphisme se base sur deux règles essentielles. Lesquelles?
Le polymorphisme se base sur deux règles essentielles:
• La compatibilité entre un type dérivée et un type ascendant.
• La ligature dynamique des méthodes, dans le sens où il permet d’obtenir le
comportement adapté à chaque type d’objet, sans avoir besoin de tester sa nature de
quelque façon que ce soit.
2- Quelle est la différence entre une interface et une classe abstraite ?
- Une interface est une classe dont toutes les méthodes sont abstraites et ne peut contenir que
des attributs constant. Alors que une classe abstraite est une classe qui peut contenir en plus
des méthodes abstraites.
- Une classe qui implémente une interface doit donner un corps à toutes ses méthodes. Alors
qu’une classe qui dérive d’une classe abstraite n’est pas obligée de redéfinir toutes ses
méthodes et peut même n’en redéfinir aucune.
- Une classe peut implémenter plusieurs interfaces mais ne peut dériver que d’une seule
classe abstraite

3- Quelle est la différence entre un programme correcte et un programme robuste? Quel est le moyen
le plus efficace pour rendre un programme java plus robuste?
- Un programme est correct s’il accomplit bien la tâche pour laquelle il a été conçu. 0.5 pt
- Un programme est robuste s’il est capable de fonctionner même en présence d’erreurs.
0.5 pt
- On peut rendre un programme java plus robuste d'une manière claire et propre grâce au
mécanisme de gestion des exceptions. 0.5 pt

4- En java, comment compiler et exécuter un programme en mode console? donnez un exemple.


- Pour compiler ce fichier, il faut utiliser la commande javac suivie du nom du fichier.java.
Exemple : javac pgm.java
- Pour exécuter un programme Java, il faut utiliser la commande java suivie du nom du
fichier.
Exemple : java pgm
5- Expliquez chacun des mots dans la ligne suivante: public static void main (String [] args)
- Le mot clé public est obligatoire pour que le programme puisse s’exécuter. Il permet à la
machine virtuelle d’accéder à la méthode main.
- Le mot clé static précise que la méthode main est une méthode de classe, elle n’est donc liée à
aucune instance (objet) particulière de la classe dans laquelle elle se trouve. En outre,
comme elle porte le nom main, il s’agit de la méthode principale.
- La paramètre String args [] de la méthode main est un tableau d’objets de type String qui
permet de récupérer des arguments transmis au programme au moment de son lancement.
- Le mot clé void précise que la méthode main ne retourne rien.
Exercice 2 : (6.75 points)
Soient les classes suivantes:
public abstract class A { System.out.println("Objet de type A");}
public void affiche() { }

1
public class B extends A{ System.out.println("Objet de type C");}
public void affiche() { }
super.affiche(); public class D extends B{
System.out.println("Objet de type B");} public void affiche() {
} super.affiche();
public class C extends A{ System.out.println("Objet de type D");}
public void affiche() { }
super.affiche();
1- Qu’affiche le programme suivant ?
public class Main{ }} Reponses: 6*0.25

public static void main(String args[]) { Objet de type A


Objet de type B
Objet de type A
A O1 = new B(); O1.affiche(); A O2 = new C(); Objet de type C
Objet de type A
O2.affiche(); B O3= new B(); O3.affiche(); Objet de type B
Objet de type A
D O4=new D(); O4.affiche(); C O5 = new C(); Objet de type B
Objet de type D
Objet de type A
O5.affiche(); Object O6 = new B(); Objet de type C
Objet de type A
((B)O6).affiche(); Objet de type B

2- On effectue les affectations suivantes (ces affectations sont indépendantes les unes des autres, elles ne
sont pas exécutées en séquence!). Pour chaque affectation, dites si elle fonctionne sans erreur, si elle
provoque une erreur à la compilation ou si elle provoque une erreur à l'exécution. S' il y a une erreur
expliquez (rapidement) pourquoi.
Réponses:
N° Instruction fonctionnement
1 O1 = O2; OK 0.25
2 O1 = O3; OK 0.25
3 O3 = O2; erreur à la compilation on ne peut pas convertir de A vers B 0.5
4 O4 = O5; erreur à la compilation on ne peut pas convertir de C vers D 0.5
5 O2 = O6; erreur à la compilation on ne peut pas convertir de Object vers A 0.5
6 O4 = (D)O1; erreur à l'exécution B ne peut pas être casté en D 0.5

3- On crée un tableau T de type B de la manière suivante: B[] T = new B[3];


a) Que faut-il faire pour que les affectations suivantes soient toutes valides (à la compilation et à
l'exécution).
Note: on reprendra les variables dans l'état de la question 1.
T[0]=O1;T[1]=O2;T[2]=O4;T[3]=O6;
Réponses:

N Instruction fonctionnement Correction


1 T[0]=O1; erreur à la compilation on ne peut pas convertir de A vers B 0.5 T[0]=(B)O1; 0.25
2 T[1]=O3; ok 0.25
3 T[2]=(B)O6; ok 0.25
4 T[3]=O4; erreur à l'exécution débordement du tableau augmenter la taille B[] T = new B[4];
du tableau 0.25 0.25

2
b) Que produit l'exécution du bloc suivant:
for(int i=0;i<T.length;i++) T[i].affiche(); 0.25*4

Objet de type A
Objet de type B
Objet de type A
Objet de type B
Objet de type A
Objet de type B
Objet de type A
Objet de type B
Objet de type D
Exercice 3 : (3.25 points)
Ecrire, en langage Java, deux classes A, B et une interface I telles que :
• L'interface I possède une constante de type entier N initialisé à 100 et la méthode int f(int x);
• La classe B hérite de la classe A ;
• La classe A est abstraite et implémente l'interface I;
• La classe A possède :
- Un attribut entier x visible seulement par ses classes dérivées ;
- Un attribut entier y visible par ses classes filles et les classes du même package ;
- Un constructeur affectant une valeur à l’attribut x ;
- Une méthode abstraite void f(double x);
• La classe B possède :
- un attribut entier z visible uniquement dans la classe B ;
- un constructeur affectant une valeur aux attributs x et z ;
- L'implémentation de la méthode int f(int x) qui retourne le produit de l'argument x et l'attribut
z;
- L'implémentation de la méthode void f(double x) qui affiche la somme de l'argument x et
l'attribut z ;
Réponses: ((0.25*2)+(0.25*5)+1.5=3.25 points)
public interface I {
final int N=100;
int f(int x);
}
public abstract class A implements I{
protected int x;
int y;
public A(int x){
this.x=x;
}
public abstract void f(double x);
}
public class B extends A{
private int z;
public B(int x, int z){
super(x);
this.z=z;
}
public void f(double x){
System.out.println("la somme = "+x+z);
}
public int f(int x){
return x*z;
}
3
}

Exercice 4: (4.5 points)


On désire écrire un programme java qui permet à l'utilisateur de saisir, pendant l'exécution, des noms de
personnes et leurs âges et les affiche triés selon l'ordre alphabétique du nom. Si plusieurs personnes
commencent par la même lettre alors ils sont affichés par ordre décroissant de leurs âges.
Pour cela utilisez la classe Personne définie par les attributs nom (de type String) et age (de type int) et la
classe Exo4 contenant la méthode main. Dans cette dernière déclarez un tableau de taille 10, remplissez-le
et triez-le selon l'ordre défini puis affichez ses éléments.
Réponses
public class Personne implements Comparable {
String nom;
int age;
public Personne(String nom, int age){
this.nom = nom;
this.age = age;}

public void affiche(){


System.out.println(nom + " \t" + age);}

public int compareTo(Object O){


Personne p=(Personne)O;
if (nom.charAt(0)==p.nom.charAt(0))
return (p.age - age);
else
return nom.compareTo(p.nom); }
}
import java.util.Scanner;
import java.util.Arrays;
public class Exo4 {

public static void main(String[] args) {


Personne T[]= new Personne[10];
Scanner sc = new Scanner(System.in);
String nom; int age;

System.out.println("Entrez 10 noms de personnes et leurs ages");


for (int i = 0; i<T.length; i++){
nom = sc.next();
age = sc.nextInt();
T[i] = new Personne(nom, age); }

Arrays.sort(T);

for (int i = 0; i<T.length; i++) T[i].affiche();

Vous aimerez peut-être aussi