69
ETRS506 Initiation Programmation Objet Java Florent Lorne [email protected] Bureau : Chablais 13 http://florent.lorne.free.fr Université de Savoie Licence 3 Télécoms Réseaux Cours : 7 x 1.5 H +1 examen TD : 6 x 1,5 H TP : 12 H + 1 examen

ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

  • Upload
    phamnhu

  • View
    214

  • Download
    0

Embed Size (px)

Citation preview

Page 1: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

ETRS506Initiation Programmation Objet

Java

Florent [email protected] Bureau : Chablais 13http://florent.lorne.free.fr

Université de SavoieLicence 3 Télécoms Réseaux

Cours : 7 x 1.5 H +1 examenTD : 6 x 1,5 HTP : 12 H + 1 examen

Page 2: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 2

Programmation objet

L'approche procédurale

➢ Met l'accent sur l'action : on doit "faire quelque chose"– exécution par étapes successives– chaque étape peut être découpée jusqu'à obtenir des

fonctions élémentaires. – fonctions élémentaires dans des bibliothèques,

➢ Programmation procédurale : séparation stricte entre le code et les données.

– On a :● des variables contennant les données● des procédures/fonctions

– Vous passez des variables à des procédures qui agissent dessus.

– Si une fonction veut modifier ce que contient une variable en la passant à une autre fonction, elle a besoin d’accéder à la variable et à la fonction qu’elle appelle.

➢ Inconvénients :– Lors de l' élaboration de programmes complexes, on

est vite confronté aux problèmes suivants :● Comment comprendre et réutiliser les programmes

faits par d’autres ?● Domment réutiliser les programmes écrits six mois

auparavant et dont on a oublié le fonctionnement ?● Comment "cloner" rapidement des programmes

déjà fait pour des applications légèrement différentes ?

● Comment programmer simplement des actions simples sur des éléments variés et complexes ?

● Comment ajouter des fonctions sans tout réécrire et tout retester ?

Page 3: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 3

➢ L’approche procédurale marche bien tant que le développeur sait où il va : le client a fourni un cahier des charges parfait et complet, ne changera pas d’avis, et une fois que le logiciel sera fini, on y touchera plus...

➢ Dans ce cas, on peut facilement décomposer les programmes en fonctions élémentaires.

Programmation objet

➢ Objectifs principaux de l'approche objet : – Produire des logiciels fiables, garants d'une certaine

robustesse.– Rechercher les qualités de réutilisabilité et d'extensibilité.– Faciliter le déploiement et la maintenabilité

➢ La programmation Orientée Objet (POO) consiste à programmer des objets :

– indépendants – réutilisables dans de nombreux programmes, par de

nombreuses personnes, sans nécessairement en connaître les sources mais en utilisant les fonctionnalités

➢ Objet : – entité chargée de gérer des données, de les classer, et

de les stocker sous une certaine forme– objet regroupe les données et les moyens de traitement

de ces données

Page 4: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 4

1er exemple

* Nom du fichier : Personne_test.java */

// Définition de la classe Personne________ Personne {

int année_naissance; // L'année de naissance de la personneString nom,prénom;void dire (String phrase) {

System.out.println(phrase);}

String identité () {return "Je suis"+nom+" "+prénom+ ". J'ai " +

calcule_age();}int calcule_age () {

return 2012-année_naissance;}

}

// Définition de la classe Personne_testpublic class ____________________ {

public _________ void main(String[] args) {Personne personne1;personne1 = new Personne ();

personne1______="WOZNIAK";_________prénom="Steve";____________________________________=1950;//Affichage de l'identité de la personneSystem.out.println (personne1._______________);//La personne1 dit bonjour______________("Bonjour");}

}

Page 5: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 5

1er exemple

Combien de classes sont définies ? Quelle classe est précédée du modificateur de portée « public » ? Quel est le nom du fichier contenant ces 2 classes ?

Quel est le type de la « variable » année_naissance d'une personne ? Quel est le type de la variable nom d'une personne ?

Quel type de variable est renvoyée par la méthode calcule_age d'une personne ? Combien d'arguments sont passés à cette méthode ? Quel type de variable est renvoyé par la méthode identité d'une personne ? Combien de paramètres sont passés à cette méthode ?

Page 6: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 6

Notion de classe

➢ Une classe est généralement un modèle d'objet – classe : plan de construction d'un objet elle n'est donc

pas concrète.

➢ A l'inverse, un objet a une réalité matérielle. Un objet est stocké en mémoire. Il possède des champs dans lesquels sont mémorisées des valeurs.

➢ Classe définit les données et de codes opérant sur ces données.

– Données s'appellent champs, variables ou attributs.– Le code est constitué de méthodes ou fonctions.

➢ On crée un objet à partir d'une classe en :– déclarant une nouvelle variable du type de l'objet à

créer : Personne personne1– créant véritablement l'objet grâce au mot clé new :

personne1 = new Personne()

➢ On dit que personne1 est une instance de la classe Personne.

Page 7: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 7

Notions de classe et d'objet

➢ Une classe est déclarée par le mot clé class.

➢ Remarque : Dans le code précédent on a définit deux classes :

– class Personne : qui est véritablement un modèle d'objet– class Construire_personne : ne permet pas de construire

d'objet. Elle contient uniquement la méthode main (). C'est cette méthode qui est appelée lors l'exécution du programme. La méthode main est déclarée statique, elle fonctionne comme en programmation classique.

Page 8: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 8

Champs et méthode d'un objet

➢ Par convention : – les identificateurs (noms) d'objets, de champs et de

méthodes commencent par une minuscule– les identificateurs de classes commencent par une

majuscule

➢ Utilisation des champs d'un objet– nomObjet.nomChamp– Exemple :

➢ Utilisation des méthodes d'un objet– nomObjet.nomMéthode(liste_arguments) – Exemple :

Rappels fonctions, paramètres et valeur de retour

➢ Fonction : sous-algorithme qui est composé d'instructions– reçoit des données, arguments ou paramètres– Retourne généralement un résultat

➢ Même chose qu'en mathématique : soit la fonction y=sin(x)

– argument x, valeur de retour y

➢ En programmation objet : fonction → méthodes

Page 9: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 9

Compilation et exécution

➢ Le fichier source : – peut contenir plusieurs classes à condition qu'une seule

classe soit publique. – si le fichier source contient une classe publique on doit

lui donner le même nom que celui de la classe publique, suivi de l'extension .java.

– Le nom du fichier source et celui de la classe doivent avoir la même casse.

– Il est préférable de créer un fichier source par classe.– Exemple : Quelle classe était déclarée publique dans

l'exemple précédent ? Comment s'appeler le fichier ?

➢ Compilation et exécution– Le JDK (Java Development Kit) créé par SUN, a été

porté sur de nombreuses plate-formes (Windows, Linux, MAC ...). Il contient :● la machine virtuelle Java● compilateur Java ainsi que plusieurs autres utilitaires.

– Actuellement Sun propose le J2SE : framework pour le développement d'application pour le poste de travail. Il contient le JDK ainsi qu'un ensemble d'API (JAXP - parsing XML, JDBC bases de données ...)

➢ Le programme javac est le compilateur Java. Pour chaque classe, le compilateur produit un fichier compilé possédant le même nom que la classe, suivi de l'extension .class.

Page 10: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 10

Compilation et exécution

➢ Combien de fichiers sont créés lorsqu'on fait javac Personne_test.java ? Donner leur nom.

➢ Exécution d'un programme

System.out.println– System.out : flux de sortie standard de type PrintStream– println : méthode associée à un objet de type

PrintStream qui reçoit en paramètre une chaine de caractères. Rajoute un saut de ligne.

– System.out.println (...) permet donc de transmettre sur le flux de sortie standard (l'écran) les valeurs indiquées en paramètres.

– opérateur de concaténation + qui permet de concaténer des chaines de caractères.

– Transtypage automatique : type simple → chaine de caractères

Editeur

Fichiers sources

Compilateur

Fichiers class

Fichiers bibliothèqueMachinevirtuelle

Page 11: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 11

Type simple Java

Exercice AnimalFamilier

➢ On modélise un animal familier de la façon suivante :– attributs : age, taille, poids, couleur et nom.– actions possibles : manger, dormir et dire.

➢ Pour simplifier : – l'action manger fera augmenter le poids de 1 kg– l'action dormir devra renvoyer la chaîne de caractères :

« Bonne nuit»– l'action dire devra récupérer une chaîne de caractères et

afficher : « Je dis » + chaîne

➢ A partir de cette définition écrire le code de la classe AnimalFamilier.

➢ Ecrire également le code de la classe (Animal_Test) qui crée un AnimalFamilier ayant pour nom tigrou, pesant 50 kg et mesurant 1,2 m, de couleur orange.

Page 12: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 12

Correction AnimalFamilier

➢ Est-ce que la fonction manger renvoie une valeur ? A-t-on juste si on écrit le code :

float manger () {return poids++ ; }

➢ Le poids de l'animal est bien incrémenté : – return poids++ ==> return poids=poids+1 ;

➢ Par contre le return n'est pas nécessaire : on a spécifié : « l'action manger fera augmenter le poids de 1 kg »

➢ On ne fait un return que lorsque la valeur renvoyée est indispensable à la méthode appelante.

Page 13: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 13

Exercice

Exercice 2 : Equation du second degré

➢ L'objectif est d'écrire un programme permettant de calculer les racines d'une équation du second degré puis d'afficher le résultat.

➢ Pour cela on définit une classe Equation avec :– les champs coeffX2, coeffX1 et coeffX0– les champs racine1 et racine2– la méthode résolution

➢ Donner le code des classes Equation et EquationTest.

Page 14: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 14

Notions avancées sur les classes

➢ Identificateur d'un objet (nom/référence de l'objet) contient l'adresse mémoire où se trouve l'objet.

➢ Chaque objet créé possède des champs qui lui sont propres, ils requièrent qu'une zone mémoire leur soit réservée.

➢ Allocation de mémoire dynamique, elle a lieu pendant l'exécution, contrairement à l'allocation de mémoire statique faite à la compilation.

➢ Pour instancier monequation, new fait appel à Equation(), constructeur de la classe Equation. Un constructeur porte toujours le nom de la classe qu'il instancie.

➢ Exemples :– Personne pers1 = new Personne () ;– AnimalFamilier monanimal= new AnimalFamilier ();

monequation contient @

Equation

coeffX2=1coeffX1=4coeffX0=2racine1=0racine2=0

resolution ()

Page 15: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 15

Principes de programmation objet

➢ La classe est l'élément fondamental.

➢ Le découpage en classes doit correspondre à des unités – opérationnelles, – cohérentes, – efficaces.

➢ Les classes doivent être indépendantes les unes des autres.

➢ Pour des raisons de sécurité et d'efficacité, des méthodes extérieures à un objet ne doivent pas pouvoir accéder directement aux champs de l'objet.

– Exemple : classe Personne_Test : personne.nom= « steve » ; // INTERDIT

– Cf modificateur de portée private

➢ Pour accéder à un champ d'un objet il faut que le développeur est prévu la/les méthodes adéquates.

– getter → connaître la valeur d'un attribut – setter → fixer la valeur d'un attribut

➢ Donner le code d'un getter et d'un setter de la classe Personne.

Page 16: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 16

Principes de programmation objet

➢ Le fonctionnement interne de l'objet est caché au monde extérieur. Un changement du fonctionnement interne de l'objet se fera sans modifications des méthodes qui permettent d'accéder à l'objet.

➢ Le fonctionnement d'une voiture illustre bien ce principe. Parce que la conduite d'une voiture se fait par des méthodes et des instruments normalisés, le changement du moteur n'impose pas de réapprendre à conduire.

Page 17: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 17

Constructeur et signature

➢ Les attributs d'un objet ne sont plus accessibles. Comment faire pour les initialiser ???

➢ Rôle d'un constructeur : initialiser les champs/attributs d'un objet.

➢ Constructeur : méthode appelée une seule fois, après le mot clé new.

➢ Java fournit un constructeur implicite (ou par défaut) vide. Il ne permet donc pas d'initialiser les attributs.

– monEquation = new Equation ();

➢ Il est possible de définir un ou plusieurs constructeurs.

➢ Un constructeur porte obligatoirement le nom de la classe qu'il permet d'instancier. Il n'a pas de type, même pas void.

➢ Les différents constructeurs créés se distinguent par leurs signatures.

➢ La signature d'un constructeur (ou d'une méthode) est constituée du nom du constructeur (ou de la méthode) suivi de la liste ordonnée des types de ses arguments.

– Exemple : imaginons une classe AdresseIPClass AdresseIP {byte byte0, byte1, byte2, byte3 ;

AdresseIP(byte octet0, byte octet1, byte octet2, byte octet3) {..}AdresseIP(String adresse) {..}

Page 18: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 18

Constructeur et signature

– Exercice : recopier de manière abrégée le code de la classe Personne et rajouter un constructeur. Modifier la classe Construire_Personne pour tenir compte des changements.

Page 19: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 19

This objet courant – référence courante

➢ Le mot clé this quand il n'est pas suivi de parenthèses est une référence à l'objet courant. On peut considérer que this contient l'adresse de l'objet courant.

➢ Tout se passe comme si on remplaçait this par le nom de l'instance courante.

➢ Le mot clé this est principalement utilisé lorsqu'il y a risque de confusion entre un paramètre de méthode et un attribut de l'objet.

– Exemple : public class AnimalFamilier {private String nom ;public void changeNom (String nom) { nom=nom ;}

➢ Exercice : Donner le code d'un constructeur de la classe Personne utilisant obligatoirement le mot clé this.

A quoi fait référence cette variable ?

Page 20: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 20

This objet courant

➢ Considérons une classe Point symbolisant un point dans un repère.

Class Point { float x=0, y=0;

void initPoint(float a, float b); { x=a; y=b; }

Point (float a, float b) {InitPoint (a,b);}

}– Modifier le code de initPoint () et du constructeur pour

que seuls les termes x et y apparaissent.– Rajouter une méthode copiePoint qui renvoie le point

courant.– Donner le code de la classe Point_Test

● crée un point de coordonnées (1,2) ● crée un point P2 étant la copie de P1.

– Dans l'état actuel, si on modifie P1, modifie-t-on également P2 ?

– Modifier le code de copiePoint, pour qu'elle instancie un nouveau point.

Page 21: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 21

Notions avancée sur les classes

➢ L'encapsulation avec private et public– Lors de l'exécution du programme, plusieurs objets,

instances de classes différentes cohabitent en mémoire. Démarche fondamentale de la POO : faire en sorte que chaque objet soit responsable de son état interne. On interdit à une autre objet d'une autre classe de modifier directement les valeurs du premier objet. Cette contrainte, qui cherche à protéger les objets d'interventions extérieures → l'encapsulation.

➢ On se sert de private et public pour concevoir les différents éléments qui composent une classe en Java :

– les éléments public sont visibles de l'extérieur de la classe

– les éléments private sont réservés à un usage interne aux objets de la classe.

Page 22: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 22

Notions avancées sur les classes

➢ A-t-on maintenant le droit d'écrire dans la classe AnimalFamilier_Test :

monanimal.age=5 ;

➢ Que faut-il faire si on veut pouvoir modifier le poids d'un objet de type animal ?

➢ On s'intéresse à la méthode comparePoids :– Quel est le type de la variable passée en paramètre ?– Quel est le type de la variable renvoyée par cette

méthode ?

➢ Ecrire le code d'un constructeur de AnimalFamilier et modifier la classe AnimalFamilier_Test pour créer 2 animaux (animal1 et animal2) et comparer le poids de ces 2 animaux.

➢ On remarque ici que l'animal1 a accès au poids de l'animal1 alors que celui-ci est privée. C'est normal car les deux objets sont issus de la même classe.

➢ Modifier la classe Point en ajoutant les méthodes getAbssice, getOrdonnée et setAbssice, setOrdonnée.

Page 23: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 23

Champs et méthodes statiques

➢ Champs statiques ou champs de classe: certains champs n'ont aucune raison d'appartenir à des objets.

– Ex : champ permettant de connaître le nombre d'objets créés pour une classe donnée.

– Déclaration avec static.

➢ Les champs statiques sont communs à tous les objets d'une classe → stockés à un emplacement mémoire réservé lors de la compilation.

➢ Existence d'un champ statique commence dès que la classe qui le définit est citée dans le source.

➢ Invocation par le nom de la classe.

➢ Exemple : On rajoute un champ animaux_créés qui indique le nombre d'animaux qui ont été créés.

public class AnimalFamilier {private int âge;private float poids;private float taille;private String couleur, nom;

?_____________________________

public void dormir () {System.out.println("Bonne nuit");

}

public void manger() {poids=poids+1;

}

Page 24: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 24

Champs et méthodes statiques

public String dire(String unmot){String réponseAnimal="OK OK " + unmot;return réponseAnimal;}

public void comparepoids (AnimalFamilier a) {if (this.poids>a.poids) System.out.println ("Le poids de " + this.nom + "est

supérieur au poids de " + a.nom);

public AnimalFamilier (int âge, float poids, float taille, String couleur, String nom){

?_________________this.âge=âge;this.poids=poids;this.taille=taille;this.couleur=couleur;this.nom=nom;

}}

➢ Rédiger la classe AnimalFamilierTest qui crée 2 animaux et qui affiche le nombre d'animaux créés.

Page 25: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 25

Méthodes statiques

➢ Une méthode statique est appelée directement par la classe, sans nécessité d'instancier un objet.

➢ Avec des méthodes statiques : programmation classique : pas besoin d'objet.

➢ Une méthode statique a un emplacement mémoire réservé dès la compilation.

➢ main : méthode statique

➢ Donner un autre exemple de méthode statique rencontrée dans un exemple précédent.

Page 26: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 26

Objet et héritage

➢ L'héritage permet de concevoir des classes d'une même famille en les structurants de façon arborescente.

➢ Une sous-classe :– possède tous les champs et toutes les méthodes de sa

super classe– peut avoir de nouveaux champs et de nouvelles

méthodes

➢ Les classes situées au sommet de l'arbre sont plus générales que les classes qui se situent au bas de l'arborescence, et celles-ci sont plus riches en informations et plus spécifiques que les classes du sommet.

➢ Terminologie: Certaines classes héritent d'autres classes, on dit aussi qu'elles les étendent. Une sous-classe hérite de sa super-classe.

➢ Chaque classe ne peut avoir qu'une super classe (pas d'héritage multiple) mais peut avoir plusieurs sous-classes.

➢ Pour définir une sous-classe, on utilise le mot clé extends.

– Ex : public class EquationH1 extends Equation

➢ Toutes les classes ont une racine commune, la classe Object.

Page 27: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 27

Héritage

➢ Définir une classe Poisson qui dérive de la classe AnimalFamilier avec :

– un champ profondeur– une méthode plonger qui reçoit un nombre p et qui fait

descendre le poisson de p mètres

Page 28: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 28

Constructeur de sous-classe

➢ Pour utiliser un constructeur dans une sous-classe, il faut obligatoirement le définir dans cette sous-classe. Normal un constructeur doit porter le nom de la classe.

➢ Rmq la sous-classe a quand-même son constructeur vide.– ATTENTION : si le constructeur vide n'est pas défini

dans la super-classe on ne peut pas utiliser le constructeur vide dans la sous-classe.

➢ Quand on écrit le constructeur d'une sous-classe, il est souvent utile de faire appel au constructeur de la super-classe ==> utilisation de super().

➢ En utilisant super (), définir le constructeur de Poisson et écrire le code de la classe.

Page 29: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 29

Redéfinition de méthodes

➢ Une méthode d'une sous-classe peut avoir– même nom – même signature

➢ que celle d'une super-classe, on dit qu'elle la redéfinit.

➢ La méthode de la super-classe reste encore accessible dans la sous-classe mais en la préfixant avec le mot clé super.

➢ Contrairement au cas de la surcharge, la signature doit être la même ; objectif ==> masquer la méthode de la super classe.

➢ Exercice : Ecrire le code de la classe poisson en tenant compte du fait qu'un poisson ne peut pas parler.

Page 30: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 30

Héritage et encapsulation

➢ Rappel : Une variable déclarée avec le modificateur private n'est accessible que par une méthode de sa classe.

➢ Toute méthode appartenant à une classe dérivée de la classe de base ne peut pas accéder à un attribut déclarée private au sein de la classe de base.

➢ Possibilité d'alléger cette contrainte en remplaçant le modificateur private par protected

Exemple :public class AnimalFamilier {private int âge;private float poids;private float taille;.....}

public class Poisson extends AnimalFamilier {private int profondeur;

void affiche_taille () {System.out.println (taille); // Est-ce que cette instruction fonctionne ? Pourquoi ?}}

Page 31: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 31

Package-Paquetage

➢ Paquetage (package) --> regroupement de classes. Bibliothèques de classes.

➢ Les paquetages permettent de regrouper des classes apparentées, c'est à dire qui sont liées les unes aux autres de façon utile et logique.

➢ Avantages des paquetages :– permet d'éviter les problèmes de nom de classes

identiques. Grands projets, des programmeurs utilisent un même nom pour deux classes différentes ; si elles sont dans des packages différents ça ne posera pas de problème. Exemple : il existe une classe Timer dans le package java.util et une autre class Timer dans le package javax.swing package.

– Regroupement des classes apparentées.Exemple : dans la plate forme Java, tous le code relatif aux I/O système est recueilli dans un package unique appelé java.io.

– les variables d'instance et méthodes sans modificateur (ni public, ni private) sont disponibles pour toutes les classes dans le même package, mais pas pour les classes définies à l'extérieur du package.

➢ L'unité d'accueil du paquetage est le répertoire. Obligatoirement Nom du paquetage = nom du répertoire qui l'accueille.

– Exemples : ● Le paquetage tp est dans un répertoire tp ex :

C:\Java\tp– le sous-paquetage de tp placé dans le répertoire

c:\java\tp\foncstat s'appelle alors tp.foncstat

➢ Pour qu'une classe appartienne à un paquetage, il faut déclarer ce paquetage au début du fichier source : package nom_paquetage

Page 32: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 32

Package-Paquetage

➢ Si aucun paquetage n'est déclaré, la classe appartient quand même à un paquetage par défaut constitué de :

– ensemble des classes accessibles par la variable d'environnement CLASSPATH à l'exclusion de celle ayant un paquetage déclaré.

– ensemble des classes du répertoire courant si la variable CLASSPATH n'est pas définie.

➢ Les paquetages sont parfois rassemblés et compactés --> fichier .JAR.

➢ Par convention les noms de paquetage sont toujours en minuscules.

Importation de classes

➢ Pour utiliser une classe appartenant à un paquetage ; la racine de l'arborescence du paquetage doit être dans un répertoire déclaré dans la variable d'environnement CLASSPATH

➢ Pour accéder à la classe :– nom complet nom_de_paquetage.nom_de_classe– OU import nom_de_paquetage.nom_de_classe

● possibilité de faire un import nom_de_paquetage.* pour pouvoir utiliser toutes les classes d'un paquetage.

Page 33: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 33

Portée de classe / Portée des membres d'une classe

➢ Rappel : cacher l'implémentation : « séparer les choses qui changent des choses qui ne changent pas ».

➢ Important pour les bibliothèques [libraries] :– Les utilisateurs (programmeurs clients) de cette

bibliothèque doivent pouvoir s'appuyer sur la partie qu'ils utilisent, et savoir qu'ils n'auront pas à réécrire du code si une nouvelle version de la bibliothèque sort.

– Le créateur de la bibliothèque doit avoir la liberté de faire des modifications et améliorations avec la certitude que le code du programmeur client ne sera pas affecté par ces modifications

➢ Portée d'une classe --> zone dans laquelle elle est visible.

➢ Rmq : Les membres d'une classe ne sont par forcément publics lorsqu'une classe est publique. Par contre impossible d'avoir des membres publics si la classe n'est pas publique.

Page 34: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 34

Exercice portée

paquetage1

public Classe1

private int d11;public int d12;int d13 ;

private methode11()public methode12()methode13()

public Classe2

public methode21()public methode22()

paquetage2

public Classe3

public methode31()

public Classe4

public methode41()

La variable d12 de Classe1 est-elle accessible par methode11 ? Par méthode 21 ? Par méthode 31 ?

Quelles méthodes peuvent accéder à d11 ?

Quelles méthodes peuvent accéder à d13 ?

Une méthode de la classe Classe3 crée un nouvel objet de type Classe1. La méthode de la classe Classe3 peut-elle invoquer la méthoded13 associée à l'objet créé ?

Page 35: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 35

Tableaux

➢ tableau : un objet qui peut contenir plusieurs– objets – variables de type simple.

➢ Après avoirs déclaré un tableau, il faut l'instancier en utilisant l'opérateur new.

➢ Exemples de déclarations :int[] tabInt ; // on déclare une variable tabInt qui pourra contenir une adresse pointant vers un tableau d'entierstabInt = new int[10] ; //on réserve un espace mémoire pour stocker un tableau de 10 entiers, on enregistre l'adresse du tableau dans tabIntouint[] tabInt=new int[10] ;

➢ Comme en C : 1er élément d'un tableau : indice 0. Le dernier élément a pour indice la dimension du tableau diminuée de 1.

➢ Champ length– égal à la dimension du tableau.

int i;for (i=0;i<tabInt.length;i++) {

tabInt[i]=5*i;}

➢ IndexOutOfBoundsException : quand on tente d'accéder à un élément dont l'indice est en dehors de la plage permise. (Non obligatoire à capturer).

try {j=tabInt[i];

} catch (IndexOutOfBoundsException excp) {System.out.println ("Indice incorrect"=excp) ;

Page 36: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 36

Tableaux exercices

➢ On s'intéresse ici à la création d'une classe Notes gérant des notes d'élèves. Les notes seront stockées dans un tableau.

➢ La classe Notes possèdera les méthodes suivantes :– nombreNotes qui renvoie le nombre de notes stockées– ajouterNote qui rajoute une note à la fin du tableau– insérerNote qui rajoute une note à l'endroit indiqué par

un index– moyenne qui renvoie la moyenne des notes dans le

tableau– maxNote qui renvoie la note maximale– afficheNote qui affiche toutes les notes enregistrées

dans le tableau

➢ Ecrire le code de la classe TestNotes qui enregistrera 6 notes dans un tableau, puis en insère une 7ème en position 3. La classe TestNotes devra permettre de tester toutes les fonctionnalités de la classe Notes.

Page 37: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 37

Chaines de caractères classe String

Exercice

➢ Lire la documentation de la classe String.

➢ On souhaite créer un programme pour générer automatiquement des identifiants de login. Un identifiant de login est constitué de la première lettre du prénom et des 4 premières lettres du nom. Les caractères accentués (à, â, é, è, ê, ë, ù, û, î, ï) ne sont pas autorisés et l'identifiant doit obligatoirement être en minuscules.

➢ Tester votre programme en vous limitant pour l'instant à 4 utilisateurs dont le nom et le prénom sont stockés dans un tableau de chaînes de caractères (le nom et le prénom sont séparés par un espace). On considère que la liste des identifiants créés est stockées dans un tableau.

➢ Améliorer votre programme pour qu'il ne crée pas deux identifiants de login identique(ajout d'un numéro à la fin de l'identifiant).

➢ Remarques : – On ne demande pas ici de définir de classe, le code peut

directement être placé dans la méthode principale.– On utilisera un tableau de correspondance, pour définir

les caractères accentués et leur version sans accent.

Page 38: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 38

Chaine de caractères : classe StringBuffer

➢ Documentation Java de la classe String on peut lire : The String class represents character strings. All string literals in Java programs, such as "abc", are implemented as instances of this class. Strings are constant; their values cannot be changed after they are created. String buffers support mutable strings. Because String objects are immutable they can be shared.

➢ Peut-on changer la valeur d'une chaine de caractères ?

➢ On considère le code suivant : String chaine = "Bonjour";chaine = chaine + "monde";

➢ La valeur de chaine a-t-elle changée ? Essayer de trouver ce qu'a réellement fait Java.

➢ Pour avoir une meilleure efficacité (temps de calcul), on préfèrera utiliser la classe StringBuffer lorsque les manipulations sur du texte sont nombreuses.

Page 39: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 39

Méthodes et classes abstraites

➢ Une méthode est abstraite si seul son en-tête est donné (signature et type de retour) ==> corps de la méthode remplacé par un point-virgule.

➢ La méthode est alors de type abstract.

➢ Une classe qui possède une méthode abstraite est abstraite et doit être déclarée avec le modificateur abstract.

➢ Les classes abstraite ne permettent pas de créer des objets.

– Pour créer un objet, il faut créer une sous-classe dans laquelle toutes les méthodes abstraites sont définies.

➢ Utilité : Quand différentes classes possèdent certaines caractéristiques communes mais diffèrent par d'autres, il est commode de créer une super-classe commune abstraite qui possède des

– méthodes concrètes pour tous les comportements communs

– méthodes abstraites pour tous les autres.

➢ Exemple : Sur un échiquier sont disposés plusieurs pièces de types différents aux mouvements différents. On peut définir une classe générique pour les pièce sans spécifier la méthode de mouvement (dépend du type de pièce).

Page 40: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 40

Méthodes et classes abstraites

abstract class Piece {

int position_x; int position_y; boolean couleur;

abstract void deplace (int x, int y);

}

class Pion extends Piece {

void deplace (int x, int y) { ... }

}

Page 41: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 41

Interfaces

➢ Interfaces : niveau d'abstraction supérieur à celui des classes abstraites. ATTENTION, rien à voir avec les interfaces graphiques.

➢ Une interface en langage Java, est une classe abstraite ayant les caractéristiques suivantes :

– Toutes les méthodes sont abstraites et publiques– Les seules variables qui peuvent figurer dans une

interface sont des constantes (static final). Pas de champs dans une interface.

➢ Une interface est définie par le mot clé interface et non par class.

➢ Java : chaque classe ne peut hériter que d'une classe : héritage simple.

➢ Java permet à une classe dérivée qui hérite donc déjà d'une classe d'implémenter une ou plusieurs interfaces.

➢ Si une classe hérite d'une interface, il faut le mentionner avec le mot clé implements.

Page 42: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 42

Interface exemple

//fichier A.javapublic class A {protected int taille;public A(int taille) {this.taille=taille;}public String toString () {return "A :" +taille;}}//fichier Modifiable.javapublic interface Modifiable {static final int MIN = -5;static final int MAX = 5;void zoomer (int n);}//fichier AA.javapublic class AA extends A implements Modifiable {String nom;public AA (String nom, int taille) {super(taille);this.nom=nom;}void incrementer () { taille ++ ; }public String toString () {return "AA : "+super.toString()+", AA:"+nom;}//Méthode de l'interface modifiable redéfinie pour AApublic void zoomer(int n) {// TODO Auto-generated method stubif (n<MIN) n=MIN;if (n>MAX) n=MAX;if (n==0) n=1;//n>0, on multiplie par n//n<0, on divise par |n|taille =n >0 ? taille *n : (int)(taille/(double) -n);}}

Page 43: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 43

Interface exemple

➢ On note que si on définit pas le contenu de la méthode zoomer dans AA alors Java nous indique une erreur.

➢ Cette façon de programmer protège le développeur contre les oublis pendant le développement.

Page 44: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 44

Exceptions

➢ Des erreurs peuvent êtres commises lors de la saisie des données ou lors de l'exécution du programme (exemple : tentative d'ouverture d'un fichier qui n'existe pas, écriture dans un fichier sur un disque plein ...).

➢ Quand le programme détecte une situation anormale ou une erreur il lève ou lance (throw en anglais) une exception. Cette exception doit ensuite être capturée.

➢ Java propose un traitement systématique des erreurs :– Lorsqu'une erreur se produit, un objet est créé : il s'agit

d'une instance d'une classe dérivée de la classe Exception. L'objet ainsi créé représente l'erreur commise. On dit qu'une exception est levée.

– L'exécution de la méthode est alors interrompue. Si l'objet qui représente l'erreur est reconnu, l'exception est « capturée », et le traitement de l'erreur est déclenché. A la fin du traitement, la méthode interrompue reprend son exécution.

public class Voiture {int distanceparcourue=0;int heure_depart, heure_arrivée;public double vitesse() {

return distanceparcourue/(heure_arrivée-heure_depart);

}}

public class Voiture_test {

public static void main(String[] args) {Voiture v1=new Voiture();double vitesse=v1.vitesse();System.out.println (vitesse);

}}

Page 45: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 45

Exceptions

➢ Que se passe-t-il lorsqu'on lance Voiture_test ?

➢ Comment capturer une exception ?try {....}catch () {...}

➢ Exemplepublic class Voiture_test {

public static void main(String[] args) {Voiture v1=new Voiture();double vitesse;try {

vitesse=v1.vitesse();}catch (ArithmeticException e) {

System.out.println ("Impossible de calculer la vitesse");

vitesse=0;}System.out.println (vitesse);

}}

➢ Qu'affiche le programme maintenant ?

Page 46: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 46

Exceptions en Java

➢ Dans l'exemple précédent, le programmeur de la classe voiture sait que la méthode vitesse peut générer une exception par contre le programmeur qui utilise la classe voiture ne le sait pas forcément. Pour faciliter le travail et les erreurs c'est au développeur de voiture de gérer les éventuelles exceptions.

➢ Le programmeur de la classe voiture peut :– Soit gérer l'exception lui même bloc try/catch en interne.– Soit indiquer au futur utilisateur de sa classe que la

méthode vitesse est susceptible de générer une exception. Il déclare la méthode avec un throws Exception. Le compilateur force alors l'utilisation de try/catch dans la méthode appelante.

➢ Ecrire le code de la classe voiture lorsque l'exception est gérée en interne. Quel problème peut se poser dans ce cas ?

➢ Ecrire le code de la classe voiture lorsque l'exception est renvoyée à la méthode appelante.

➢ Bonnes méthodes de gestion des exceptions : throw early, catch late.

Page 47: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 47

Exceptions : délégations de la capture

➢ Autre exemple : l'exception peut-être traitée en interne mais également signalée à la méthode appelante :

class ListeDesScores { // Ce code doit être complété pour pouvoir le compiler static void chargerTousLesScores() throws Exception { try { fichier.read(); // Cette ligne peut lever // une exception } catch (IOException e) { throw new Exception( "Cher ami, le fichier des scores a un problème."); } } public static void main(String[] args) { System.out.println("Scores"); try { chargerTousLesScores(); } catch(Exception e1) { System.out.println(e1.getMessage()); } } }

Page 48: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 48

La documentation d'un programme

➢ Java comporte des outils permettant de générer automatiquement des fichiers de documentation au format html.

➢ L'utilitaire pour générer la documentation est : javadoc.

➢ Certains mot-clés sont précédés du caractère @ afin de donner à l'utilitaire certaines précisions :

– author : nom de l'auteur– version : numéro de version– param : nom de l'argument suivi d'un commentaire– return : commentaire sur la valeur retournée– see : nom d'une classe à consulter

➢ Chaque classe, chaque champ et chaque méthode sont précédés d'un commentaire de documentation délimitée par /** et */, qui apparaît dans le fichier html. Dans l'index, seule la première ligne de commentaire est présentée.

/** * Classe définissant un Animal Familier * @author Florent * @version 1 */package animalFamiliercours;public class AnimalFamilier2 {

public static int animaux_créés;private int âge;private float poids;private float taille;private String couleur, nom;/** * Un animal peut dormir en souhaitant bonne nuit */ public void dormir () {

System.out.println("Bonne nuit");}

Page 49: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 49

Documentation Java

Page 50: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 50

Classes Enveloppes

➢ Les classe enveloppes (Wrappers) sont des classes qui encapsulent les données de type primitif, afin de pouvoir les utiliser comme des objets ordinaires. La correspondance est la suivante :

➢ Ces classes ont deux applications principales :– elles possèdent des méthodes de conversion relatives

au types simples– elles intègrent un type simple dans un objet

● La dernière propriété est utile quand une application n'accepte pas les types simples et requiert des objets.

➢ Les classes enveloppes admettent deux types de constructeurs :

– ClasseEnveloppe (typeSimple)– ClasseEnveloppe (String)

Page 51: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 51

Classes enveloppes

➢ Exemples :int i = 789;Double unDouble = new Double ("123,789");Integer unEntier = new Integer (i) ;

➢ Méthodes non statiques – Ces méthodes opèrent des conversions entre les

différents types numériques :– typeSimple typeSimpleValue()– Pour les types numériques toutes les conversions sont

autorisées. Pour Boolean seule booleanValue(boolean) est autorisée.

Integer unEntier = new Integer(123);short is;byte b;double x;int i;is=unEntier.shortValue();b=unEntier.byteValue();x=unEntier.doubleValue();i=unEntier.integerValue() ;

➢ Méthodes statiques– Toutes les classes enveloppes ont une méthode x

X.parseX(String s) qui essaie de convertir une chaîne de caractères en une donnée de type primitif, si c'est possible (lèvent une exception NumberFormatException sinon)

int i = Integer.parseInt("234");

– Les méthodes statiques valueOf() renvoie un objet, comme le font les constructeurs ayant une chaîne comme argument. Les différences sont les suivantes :● valueOf () n'existe pas pour la classe Character,● pour les nombres entiers, on peut préciser la base en

second argument, ce qui permet de travailler en base 2, 8 ou 16

Page 52: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 52

Classes enveloppes (suite)

Integer unEntier=Integer.valueOf("14672");

Integer unEntierbis=Integer.valueOf("1AF7C2",16);Double unréel = Double.value0f("1123.456");

Page 53: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 53

Entrées-Sorties

➢ Entrées-Sorties concernent la communication entre les programmes et le monde extérieur.

➢ Entrées : le clavier, un fichier, le réseau, un autre programme ...

➢ Sorties : l'écran, un fichier, le réseau, un autre programme …

Transmission de données par le biais des arguments du programme

➢ Même principe que pour le langage C.

➢ Les arguments sont récupérés sous la forme d'un tableau de chaine de caractères : String args [].

– Avantage pas besoin de recompiler si on change la valeur des données

– Inconvénient aucune convivialité, pas d'interactivité

➢ Attention l'argument 0 est bien le premier argument passé et non le nom de l'exécutable comme en C.

Page 54: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 54

Entrées – Sorties – Les arguments d'un prog

➢ Exemplepublic class Poisson_test {public static void main (String args[]) {

int profondeur; // la profondeur est un entier cf classe poisson

//On vérifie que l'utilisateur a bien fournit 2 arguments

if (?_________________){System.out.println ("Donner le nom du poisson et la

profondeur en argument");System.exit(2);}

// On convertit la chaine de caractères en entier. Il faut penser au fait que l'utilisateur risque de saisir autre chose qu'un entiertry {

profondeur=_______________________}catch (_________________________) {

System.out.println("Veuillez saisir un entier pour la profondeur");

System.exit(2);}Poisson2 nemo=new Poisson2

(2,1.5f,0.3f,"rouge",args[0],profondeur);....

}}

Page 55: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 55

Les flux

➢ Tout transfert d'informations est géré par un flux (stream en anglais).

➢ Les flux sont des objets qui servent à opérer des lectures ou des écritures.

➢ Objectif des flux : généraliser la notion de périphérique d'entrée-sortie et ce quel que soit le périphérique utilisé (clavier, disque dur, disquette, réseau ...).

➢ En java, les flux peuvent être divisés en plusieurs catégories :

– les flux d'entrée (InputStream, Reader) et les flux de sortie (OutputStream, Writer)

– les flux de traitement de caractères(Reader, Writer) et les flux de traitement d'octets (InputStream, OutputStream)

➢ Java définit des classes pour : – lire ou écrire des données – mais aussi des classes qui permettent de faire des

traitements sur les données du flux. Ces classes sont considérées comme des filtres. Ex : filtre qui permet de mettre les données traitées dans un tampon (buffer) pour les traiter par lots.

➢ Toutes ces classes sont regroupées dans le paquetage java.io.

Page 56: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 56

Les flux

Les classes de gestion de flux

➢ Pb dans l'utilisation de ces classes :– leur nombre – difficulté de choisir celle qui convient le mieux en

fonction des besoins

BufferedInputStreamBufferedOutputStreamBufferedReaderBufferedWriterByteArrayInputStreamByteArrayOutputStreamCharArrayReaderCharArrayWriterConsoleDataInputStreamDataOutputStreamFileFileDescriptorFileInputStreamFileOutputStreamFilePermissionFileReaderFileWriterFilterInputStreamFilterOutputStreamFilterReaderFilterWriterInputStreamInputStreamReaderLineNumberInputStreamLineNumberReaderObjectInputStreamObjectInputStream.GetFieldObjectOutputStreamObjectOutputStream.PutField

ObjectStreamClassObjectStreamFieldOutputStreamOutputStreamWriterPipedInputStreamPipedOutputStreamPipedReaderPipedWriterPrintStreamPrintWriterPushbackInputStreamPushbackReaderRandomAccessFileReaderSequenceInputStreamSerializablePermissionStreamTokenizerStringBufferInputStreamStringReaderStringWriterWriter

Page 57: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 57

Les Flux

➢ Pour faciliter le choix : le nom des classes se décompose en un préfixe et un suffixe :

– Quatre suffixes possibles en fonction du type de flux (flux d'octets ou de caractères) et du sens du flux (entrée ou sortie)● InputSream● OutputStream● Reader● Writer

– Sous classes de Reader : flux en lecture sur des ensembles de caractères

– Sous classes de Writer : flux en écriture sur des ensembles de caractères

– Sous classes de InputStream : flux en lecture sur des ensembles d'octets

– Sous classes de OutputStream : flux en écriture sur des ensembles d'octets

➢ Pour le préfixe, il faut distinguer les flux et les filtres :– les flux, le préfixe contient la source ou la destination

selon le sens du flux.● ByteArray : tableau d'octets en mémoire● CharArray : tableau de caractères en mémoire● File : fichier● Object : objet● Pipe : pipeline entre deux threads● String : chaîne de caractères

➢ les filtres, le préfixe contient le type de traitement qu'il effectue

Page 58: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 58

Les flux

Donner le nom de la classe qui permet de transformer un flux d'octets en flux de caractères.

Donner le nom de la classe qui permet d'écrire des données binaires dans un fichier.

Page 59: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 59

Les flux - Les flux de caractères

Page 60: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 60

La classe Reader

➢ public abstract class Reader extends Object implements Readable, Closeable

➢ Abstract class for reading character streams. The only methods that a subclass must implement are read(char[], int, int) and close(). Most subclasses, however, will override some of the methods defined here in order to provide higher efficiency, additional functionality, or both.

➢ Méthodes :

➢ Méthodes – public int read(CharBuffer target) throws

IOException : Attempts to read characters into the specified character buffer. The buffer is used as a repository of characters as-is: the only changes made are the results of a put operation. No flipping or rewinding of the buffer is performed.

– public int read() throws IOException : Reads a single character. This method will block until a character is available, an I/O error occurs, or the end of the stream is reached. Subclasses that intend to support efficient single-character input should override this method.● Returns : The character read, as an integer in the

range 0 to 65535 (0x00-0xffff), or -1 if the end of the stream has been reached

Page 61: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 61

Les méthodes de la classe Reader

– abstract void close () : ferme le flux et libère les ressources qui lui étaient associées

– public boolean markSupported() : indique si le flux supporte la possibilité de marquer des positions

– public void mark(int readAheadLimit) throws IOException : Marks the present position in the stream. Subsequent calls to reset() will attempt to reposition the stream to this point. Not all character-input streams support the mark() operation.

– ....

Classe Writer

Page 62: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 62

Les méthodes de la classe Writer

Page 63: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 63

1

FileReader FileWriter

FileReader

FileWriter

Page 64: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 64

Exercice Flux

➢ Exercice : compléter la classe ci-dessous pour qu'elle ouvre le fichier c:\monfichier et qu'elle affiche les 5 premiers caractères.

?____________

class Fichier1 {

public static void main (String [] args) {FileReader fichier;char [] lu = new char [5];int nb_lu;

try {__________________________} catch (FileNotFoundException e) {

// TODO Auto-generated catch blocke.printStackTrace();}

try {_________________________}

}}

Page 65: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 65

Classes Buffered

Les flux de caractères tamponnés avec un fichier.

➢ Pour améliorer les performances des flux sur un fichier, la mise en tampon des données lues ou écrites permet de traiter un ensemble de caractères représentant une ligne plutôt que de traiter les données caractères par caractères. Le nombre d'opérations est ainsi réduit.

➢ Les classes BufferedReader et BufferedWriter permettent de gérer des flux de caractères tamponnés avec des fichiers.

➢ Exemple de méthode :

Page 66: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 66

Exercie Buffer

➢ Exercice : Ecrire une classe Fichier2 qui accède au fichier texte c:\monfichier via un flux bufferisé et qui affiche les deux premières lignes de ce fichier

Page 67: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 67

Les flux d'octets

Page 68: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 68

System.in - System.out - System.err

➢ System.in, System.out, and System.err are also common sources or destinations of data. Most commonly used is probably System.out for writing output to the console from console programs.

➢ These 3 streams are initialized by the Java runtime when a JVM starts up, so you don't have to instantiate any streams yourself (although you can exchange them at runtime).

➢ System.in– System.in is an InputStream which is typically

connected to keyboard input of console programs. System.in is not used as often since data is commonly passed to a command line Java application via command line arguments, or configuration files. In applications with GUI the input to the application is given via the GUI. This is a separate input mechanism from Java IO.

➢ System.out– System.out is a PrintStream. System.out normally

outputs the data you write to it to the console. This is often used from console-only programs like command line tools. This is also often used to print debug statements of from a program (though it may arguably not be the best way to get debug info out of a program).

➢ System.err– System.err is a PrintStream. System.err works like

System.out except it is normally only used to output error texts. Some programs (like Eclipse) will show the output to System.err in red text, to make it more obvious that it is error text.

Page 69: ETRS506 Initiation Programmation Objet Javaflorent.lorne.free.fr/pdf/L3TR/ETRS506/Transparents Cours ETRS506.pdf · – Vous passez des variables à des procédures qui ... Classe

COURS ETRS506 69

Lecture clavier

➢ Ecrire la classe LectureClavier qui permet de lire les valeurs saisies par l'utilisateur et qui renvoie le résultat sous forme d'une chaine de caractères. Pour vous aider, répondre aux questions suivantes.

– Quel est le type de flux de System.in ?– Comment fait-on pour convertir le flux System.in en flux

de caractères ?– Comment fait-on pour convertir un flux de caractères en

flux de caractères avec tampons ?