PROGRAMMATION ORIENTEE OBJET LFIG2-2019/2020-ISAEG
TD N°1 POO : Approche Orienté Objet
Exercice N° 01 : Exercice de vocabulaire
Donnez la signification des termes suivants (donner des exemples):
Instance - objet - classe - méthode - comportement - propriété - réutilisation - héritage - type -
classe fille - classe mère - référence - polymorphisme – encapsulation, constructeur.
Exercice N° 02: Questions
· Quelles sont les principales différences entre les modèles objet (comme le Java) et procédural
(comme le langage C) ?
· Quels sont les avantages de la programmation OO ?
· Quelles sont les différences entre une classe et un objet ?
· Comment obtenir un objet en vue de l'utiliser ?
· Qu'est ce que le polymorphisme ? le polymorphisme paramétrique ?
· A quoi sert l'héritage ?
Exercice N° 03 : Héritage et méthodes
La classe Voiture dérive de la classe Véhicule.
Soit le programme suivant se trouvant dans une classe quelconque : (les notations ne
correspondent pas à celles d'un véritable langage de programmation).
classe Véhicule
{
méthode rouler () {...}
méthode seGarer () {...}
}
classe Voiture dérive de Véhicule
{
méthode seGarer () {...}
méthode klaxonner () {...}
méthode rouler () {...}
}
Soit une106, une instance de Voiture et monVehicule, une instance de Véhicule.
1. Peux-t-on faire une106.rouler () ? Pourquoi ?
2. Si l'on fait une106. seGarer (), est-ce la méthode de la classe Véhicule ou de la classe
Voiture qui est appelée ?
3. Peux-t-on faire monVehicule.klaxonner () ? Pourquoi ?
Ali ZIDANII 1
PROGRAMMATION ORIENTEE OBJET LFIG2-2019/2020-ISAEG
TD N°2 POO : les classes Java
Exercice N° 01 :
- Écrire un programme affichant "Hello World" sachant que l'instruction permettant
d'afficher un chaîne à l'écran est: System.out.println("[chaîne]");
- Écrire un programme affichant 10 fois "Hello World"
- Écrire un programme affichant le premier argument donné en lançant la classe.
- Ecrire un programme qui lit deux entiers passés en paramètres sur la ligne de commande
et affiche leur somme, leur différence, leur produit et leur quotient. Attention, on ne peut
pas diviser par 0.
- Ecrire un programme qui lit une note passée en paramètre et qui indique si elle est
suffisante pour réussir un examen. On pourra vérifier l'existence de la note et arrêter le
programme si ce n'est pas le cas en utilisant l'instruction System.exit(1).
Exercice N° 02 :
- Écrire une classe Voiture possédant les propriétés iAge et iKilometrage ainsi que la
méthode getKilometrage() qui renvoie le kilométrage courant du véhicule. La classe
Voiture aura deux constructeurs : le premier prenant uniquement l'âge et l'autre l'âge et
le kilométrage. Ces deux constructeurs n'auront pas de code redondant. Par défaut, le
kilométrage sera de zéro km.
- Écrire une classe Test ayant une méthode main et instanciant deux voitures. Affichez l'âge
et le kilométrage de ces voitures.
- Définir dans la classe Voiture un attribut primitif iNbRoues statique qui donne le nombre
de roues.
- Dans Test, fixer la valeur de iNbRoues d'une voiture à 4 et afficher la valeur iNbRoues des
autres instances de Voiture. Conclusion?
Ali ZIDANII 2
PROGRAMMATION ORIENTEE OBJET LFIG2-2019/2020-ISAEG
Correction TD N°2 POO : les Classes Java
Installer l’environnement JAVA suivant :
L’Editeur NtBeans
Le JDK
Exercice N° 01 :
Écrire un programme affichant "Hello World" sachant que l'instruction permettant
d'afficher une chaîne à l'écran est: System.out.println("[chaîne]");
/* Premier programme java : afficher Hello World */
public class HelloWorld {
public static void main(String args[]) {
System.out.println("Hello World");
}
}
Écrire un programme affichant 10 fois "Hello World"
/* Premier programme java : afficher Hello World */
public class HelloWorld1 {
public static void main(String args[]) {
int i;
for( i= 0;i<10;i++)
System.out.println("Hello World");
}
}
Écrire un programme affichant le premier argument donné.
public class affiche {
public static void main(String args[]) {
String msg=args[0];
/* ou bien String msg=args[0]+" "+args[1]+" "+args[2];*/
System.out.println(msg);
}
}
Ecrire un programme qui lit deux entiers passés en paramètres sur la ligne de commande
et affiche leur somme, leur différence, leur produit et leur quotient.
Attention, on ne peut pas diviser par 0.
Ali ZIDANII 3
PROGRAMMATION ORIENTEE OBJET LFIG2-2019/2020-ISAEG
public class Oper {
public static void main(String args[]) {
if (args.length<2) {
System.out.println("Passer deux nombres en paramètre !");
System.exit(1);
}
else {
int n0=Integer.parseInt(args[0]);
int n1=Integer.parseInt(args[1]);
int som=n0+n1;
int diff=n0-n1;
int prod=n0*n1;
System.out.println("Somme : "+som);
System.out.println("Différence : "+diff);
System.out.println("Produit : "+prod);
if (n1==0)
System.out.println("Division par zéro !");
else {
int quot=n0/n1;
System.out.println("Quotient : "+quot);
}
}
}
}
Ecrire un programme qui lit une note passée en paramètre et qui indique si elle est suffisante
pour réussir un examen. On pourra vérifier l'existence de la note et arrêter le programme si
ce n'est pas le cas en utilisant l'instruction System.exit(1).
public class note {
public static void main(String args[]) {
if (args.length==0) {
System.out.println("Passer une note en paramètre !");
System.exit(1);
}
else {
int n=Integer.parseInt(args[0]);
if (n>=10)
System.out.println("Vous êtes admis.");
else if (n>=8)
System.out.println("Vous devez passer l'oral.");
else System.out.println("Vous êtes en contrôle.");
}
}
}
Exercice N° 02:
Fichier voiture.java
package voiture;
Ali ZIDANII 4
PROGRAMMATION ORIENTEE OBJET LFIG2-2019/2020-ISAEG
public class voiture {
private long ikilometrage;
int iAge;
private int NbR;
int getNbR(){
return NbR;
}
long getkilometrage(){
return ikilometrage;
}
long getiage(){
return iAge;
}
voiture(){
this.iAge=5;
this.ikilometrage=250000;
this.NbR=4;
}
voiture(int iAge){
this.iAge=iAge;
this.ikilometrage=0;
this.NbR=4;
}
voiture(int iAge,long ikilometrage,int NbR){
this.iAge=iAge;
this.ikilometrage=ikilometrage;
this.NbR=NbR;
}
void setikilometrage(long kilo){
this.ikilometrage= kilo;
}
void setiage(int ag){
this.iAge= ag;
}
}
Fichier test.java
package voiture;
public class test {
public static void main(String[] args) {
// TODO Auto-generated method stub
voiture v1;
Ali ZIDANII 5
PROGRAMMATION ORIENTEE OBJET LFIG2-2019/2020-ISAEG
voiture v2;
voiture v3;
v3 = new voiture();
v1=new voiture(5);
v2=new voiture(4,10000, 5);
System.out.println("Age v1="+v1.iAge);
System.out.println("kilometrage v1="+v1.getkilometrage());
System.out.println("NBR v1="+v1.getNbR());
System.out.println("Age v2="+v2.iAge);
System.out.println("kilometrage v2="+v2.getkilometrage());
System.out.println("NBR v2="+v2.getNbR());
System.out.println("Age v3="+v3.iAge);
System.out.println("kilometrage v3="+v3.getkilometrage());
System.out.println("NBR v3="+v3.getNbR());
v3.setiage(3);
v3.setikilometrage(70000);
System.out.println("Age v3="+v3.iAge);
System.out.println("kilometrage v3="+v3.getkilometrage());
}
Ali ZIDANII 6
PROGRAMMATION ORIENTEE OBJET LFIG2-2019/2020-ISAEG
TD N°3 POO : Héritage
Exercice N° 01 :
Soit les classes JAVA suivantes :
Shape.java
public class Shape {
double x, y ;
public Shape() { x = 0 ; y = 0 ; }
public Shape(double x, double y) { this.x = x ; this.y = y ; }
public String toString() { return "Position : (" + x + "," + y + ")" ; }
}
Circle.java
public class Circle extends Shape {
final static double PI = 3.141592564 ;
private double radius ;
public Circle() { radius = 0 ; }
public Circle(double x, double y, double r) { super(x,y) ; radius = r ; }
public String toString() { return super.toString() + " Rayon : " + radius ; }
}
Test.java
public class Main {
public static void main(String[] args) {
Circle c1,c2 ;
c1 = new Circle(1,1,3) ; c2 = new Circle() ;
System.out.println(c1.toString() + "\n" + c2.toString()) ;
}
Travail demandé
1) De quelles variables d'instance de Shape hérite la classe Circle ?
2) La variable radius étant déclarée private, on ne peut pas la modifier de l'extérieur de la
classe. Ajouter une méthode setRadius pour pouvoir le fixer et getRadius pour le lire.
3) Ajouter une variable surface à la classe Circle :
Modifier les méthodes setRadius et toString en conséquence.
Ajouter les méthodes d'accès à ce champ.
4) Écrire une méthode int isBigger (Circle c1, Circle c2) renvoyant 1 si le cercle c1 est plus
grand que c2 et 0 sinon.
5) Étendre la classe Circle avec une classe Cylinder ajoutant une variable h pour la hauteur.
Ajouter les constructeurs adéquats.
Implémenter un get et un set pour la hauteur.
Implémenter les méthodes aire() et volume() pour le cylindre, respectivement
2*surface du cercle + 2 * 3.14159 * rayon * hauteur et : aire du cercle * hauteur.
Surcharger la méthode toString qui permet d'obtenir toutes les informations sur le cylindre :
centre du cercle, rayon du cercle et hauteur.
Ali ZIDANII 7
PROGRAMMATION ORIENTEE OBJET LFIG2-2019/2020-ISAEG
Exercice 2:
On modélise une application devant servir à l’inventaire d’une bibliothèque. Elle devra traiter
des documents de nature diverse : des livres, des dictionnaires, et autres types de documents
qu’on ne connaît pas encore précisément mais qu’il faudra certainement ajouter un jour
(articles, bandes dessinées...). Tous les documents possèdent un numéro d’enregistrement et
un titre. A chaque livre est associé, en plus, un auteur et un nombre de pages, les
dictionnaires ont, eux, pour attributs supplémentaires une langue et un nombre de tomes. On
veut manipuler tous les articles de la bibliothèque au travers de la même représentation : celle
d’un document.
1) Définir les classes Document, Livre et Dictionnaire. Définir pour chacune un constructeur
permettant d’initialiser toutes ses variables d’instances.
2) Définir une classe Bibliothèque réduite à une méthode main permettant de tester les classes
précédentes (ainsi que les suivantes).
3) Définir la classe ListeDeDocuments permettant de créer une liste vide de documents, puis
y adjoindre une fonction permettant d’ajouter un document. Utiliser la structure Vecteur
(java.util.Vector).
4) Dans la classe ListeDeDocuments Définir une méthode tousLesAuteurs() qui affiche la
liste des numéros des documents de la liste avec, pour chacun, l’éventuel auteur.
5) Redéfinir la méthode toString() dans la classe Document ainsi que dans les classes Livre et
Dictionnaire et qui renvoie une chaîne de caractères décrivant un document, un livre ou un
dictionnaire. Ajoutez alors dans la classe ListeDeDocuments une méthode
tousLesDocuments() qui affiche consécutivement la description de tous les documents.
6) Proposez quelques lignes de codes à ajouter à la classe Bibliotheque afin de tester la classe
ListeDeDocuments.
Ali ZIDANII 8
PROGRAMMATION ORIENTEE OBJET LFIG2-2019/2020-ISAEG
Correction TD N°3 POO : Héritage
Exercice N° 02 :
1)
public class Document {
static private int numeroSuivant = 0;
private int numero;
private String titre;
static private int getID() {
return ++numeroSuivant; }
public Document(String titre) {
this.numero = getID();
this.titre = titre;
}
public int getNumero(){
return numero;
}
public String getTitre(){
return titre;
}
}
public class Dictionnaire extends Document {
private int nbTomes;
private String langue;
public Dictionnaire(String titre, int nbTomes, String langue) {
super(titre);
this.nbTomes = nbTomes;
this.langue = langue;
}
public int getNombreDeTomes() { return nbTomes; }
public String getLangue() { return langue; }
}
public class Livre extends Document{
private String auteur;
private int nbPages;
public Livre(String titre, String auteur, int nbPages) {
super(titre);
this.nbPages = nbPages;
this.auteur = auteur;
}
public String getAuteur() {
return auteur; }
public int getNombreDePages() {
return nbPages; }
}
2)
public class Bibliotheque{
public static void main(String[] args){
Document d = new Document("Configurer son compte utilisateur");
Livre l = new Livre("La communication sous unix","J-M Rifflet",799);
Dictionnaire di = new Dictionnaire("Minidic",4,"Anglais");
System.out.println(d.getTitre()) ;
System.out.println(l.getTitre()) ;
System.out.println(di.getTitre()) ;
}
}
3)
import java.util.Vector;
public class ListeDeDocuments {
Ali ZIDANII 9
PROGRAMMATION ORIENTEE OBJET LFIG2-2019/2020-ISAEG
private Vector<Document> lesDocuments;
public ListeDeDocuments() {
lesDocuments = new Vector<Document>();
}
public void ajouteDocument(Document unDocument) {
lesDocuments.addElement(unDocument);
}
}
4)
public void tousLesAuteurs() {
Document unDocument;
for (int i=0; i<lesDocuments.size(); i++){
unDocument = lesDocuments.elementAt(i);
System.out.print(unDocument.getNumero());
if (unDocument instanceof Livre)
System.out.println( " " + ((Livre)unDocument).getAuteur());
else
System.out.println() ;
}
}
5)
Dans Document :
public String toString() {
return ("numero: "+numero+" titre: "+titre);
}
Dans Livre :
public String toString(){
return (super.toString()+" auteur: "+getAuteur()+" pages:
"+getNombreDePages());
}
Dans Dictionnaire :
public String toString() {
return (super.toString()+" tomes: "+getNombreDeTomes()+" langue:
"+getLangue());
}
Dans ListeDeDocuments :
public void tousLesDocuments() {
Document unDocument;
for (int i=0; i<lesDocuments.size(); i++){
unDocument = lesDocuments.elementAt(i);
System.out.println(unDocument);
}
}
6)
public class Bibliotheque{
public static void main(String[] argv) {
Document d = new Document("Configurer son compte utilisateur");
Livre l = new Livre("La communication sous unix","J-M Rifflet" ,799);
Dictionnaire di = new Dictionnaire("Man pages",4,"Anglais");
System.out.println(d.getTitre());
System.out.println(l.getTitre());
System.out.println(di.getTitre());
ListeDeDocuments ld = new ListeDeDocuments();
ld.ajouteDocument(d);
ld.ajouteDocument(l);
ld.ajouteDocument(di);
ld.tousLesAuteurs();
ld.tousLesDocuments();
}
}
Ali ZIDANII 10