classes et objets - lisicfonlupt/enseignement/java/java-03.pdf · – cobol, fortran, c, etc... ......

60
Classes et Objets

Upload: vankhue

Post on 16-Sep-2018

218 views

Category:

Documents


0 download

TRANSCRIPT

Classes et Objets

Les concepts de l'OO

• L'OO en quelques mots– Une boite noire

– Un objet sans classe n'a pas de classe

– Les objets parlent aux objets

– Héritage

– Le modèle devient la référence → UML

– Avantages de l'OO

Aux origines de l'informatique

• Programmation dictée par le fonctionnement des processeurs

• Programme = succession d'instructions

• Organisation du programme et nature des instructions le plus proche possible de la façon dont le processeur les exécute

➔ Modification des données mémorisées➔ Déplacement des données d'un emplacement à un autre➔ Opérations arithmétiques et de logique élémentaires

● Programmation en langage « machine »● Exemple : « c = a + b » se programme

➔ LD A, REG1➔ LD B, REG2➔ ADD REG3, REG1, REG2➔ MV c, REG3

Langages procéduraux

• Mise au point d'algorithmes plus complexes

• Nécessité de simplifier la programmation– Distance par rapport au fonctionnement des processeurs

• Apparition des langages procéduraux– Cobol, Fortran, C, etc...

• Le raisonnement reste néanmoins conditionné par la conception des traitements et leur succession

➔ Éloigné de la manière humaine de poser et résoudre les problèmes➔ Mal adapté à des problèmes de plus en plus complexes (sauf pour les

étudiants très brillants!)

Avènement de l'objet

• Libérer la programmation des contraintes liées au fonctionnement des processeurs

• Rapprocher la programmation du mode cognitif de résolution des problèmes

• Mise au point d'un nouveau style de langage de programmation– Simula, Smalltalk, C++, EIffel, Java, C#, Delphi

• Idée centrale :– Placer les entités, objets ou acteurs du problème à la base de la

conception

– Étudier les traitements comme des interactions entre les entités

– Penser aux données AVANT de penser aux traitements

Une boite noire

• Un objet est une boite noire qui reçoit et envoie des messages

Classe

• Une classe est constituée de descriptions de :– données : que l'on nomme attributs

– procédures et fonctions : que l'on nomme méthodes

• Une classe est uniquement un modèle de représentation d'objets– ayant même structure (même ensemble d'attributs)

– ayant même comportement (même ensemble de méthodes)

• Les objets sont des représentations, on parle d'instances du modèle défini dans les classes– une classe permet d'instancier (créer) plusieurs objets

– en général, un objet est instance d'une classe

Exemple de classe

La classe Étudiant

Etudiant

nom : Stringprenom : StringanneNaissance : intNbNotes: intnotes : [] int

nom de la classe

attributs

méthodes

Syntaxe java

Les attributs sont des variables dites « d'instances » qui serontdisponibles dans toutes les instances de la classe Etudiant.Attention, ces variables seront très certainement différentesd'une instance de Etudiant à une autre.Les attributs peuvent être utilisés dans toutes les méthodesdéfinies par la classe.

attributs

Attributs de classeattribut non initialisé

• La déclaration d'un attribut se fait grâce à la syntaxe suivante :– type nomAttribut ;

ou

– type attribut = expression ;

• type peut soit être un type primitif (char, int, byte, …) soit être un type structuré (un objet)

attribut automatiquement initialisé

public class Vecteur2d{float x ;float y ;}

Déclaration des méthodes

• Une méthode définit du code exécutable qui peut être invoqué par les objets

• On distingue 3 types de méthodes:– Les constructeurs : méthodes servant à créer des objets

– Les accesseurs : méthodes servant à accéder aux données de nos objets

– Les méthodes de classe : méthodes servant à la gestion des objets

Constructeurs

• Méthode appelée automatiquement lors de la création d'une instance de classe (mot-clef new)

• Une classe permet de créer un nombre quelconque d'objets (instance)

• Chaque instance est engendrée par une classe– Pour notre classe Etudiant

• Un constructeur générique (nom inconnu, …)

• Un constructeur explicite. On fournit dans ce cas le nom de l'étudiant, son prénom, sa date de naissance, ...

Accesseurs

• Permet d'accéder aux différents attributs d'une classe

• Récupération des attributs d'une classe

• Modification des attributs d'une classe– Pour la classe Etudiant :

• Récupération du nom

• Modification de la date de naissance en cas d'erreur de saisie

CommentairesL'outil javadoc permet de récupérer automatiquement les commentaires des méthodes Il faut donc OBLIGATOIREMENT commenter les méthodes

paramètres

javadoc

Cours13.java

Méthodes de classe

• Permet de travailler directement sur les instances de classe

• Gestion, édition, affichage, calcul sur les objets

• Pour notre classe Etudiant :– Calcul de la moyenne

– Ajout d'une note dans un examen

• Pour la classe String– toUpper() mise en majuscules

– subString() récupération d'une sous-chaîne

Les constructeurs

• Un constructeur est une méthode qui va se charger de créer un objet et, le cas échéant d'initialiser ses variables de classe

• Un constructeur n'est pas obligatoire, car il existe un constructeur par défaut qui créera l'objet

• Il peut y avoir plusieurs constructeurs pour une même classe (cf plus loin)mais

• Le (les) constructeur(s) doit (doivent) toujours porter le même nom que la classe sans valeur de retour

Méthode de classes

• Déclaration d'une méthode<typeRetour> nomMethode ( <liste de paramètres> ) {

<corps de la méthode>}

• Le principe est très semblable à celui des méthodes statiques

Paramètres de classes

• Déclaration d'une méthode<typeRetour> nomMethode ( <liste de paramètres> ) {

<corps de la méthode>}

• <liste de paramètres>– Vide si la méthode n'a pas de paramètres

• int nextInt() de la classe Scanner

• String nextLine() de la classe Scanner

– Une suite de couples type identificateur séparés par des virgules• int max3(int a, int b, int c)

• Int sort(int [] t) de la classe Arrays

Corps de la méthode

• Déclaration d'une méthode<typeRetour> nomMethode ( <liste de paramètres> ) {

<corps de la méthode>}

• <corps de la méthode>– Même principe que pour les méthodes statiques

– Si la méthode a un type de retour, le corps de la méthode doit contenir au moins une instruction return expression où expression délivre une valeur du type retourné

Corps de la méthode

• Déclaration d'une méthode<typeRetour> nomMethode ( <liste de paramètres> ) {

<corps de la méthode>}

• <corps de la méthode>– Suite de déclaration de variables locales et d'instructions (cf méthodes

statiques)

– Les variables déclarées à l'intérieur de la méthode sont des variables locales

– Elles ne sont accessibles que dans la méthode où elles sont déclarées

Visibilité des variables

Méthodes

Méthodes statiques

Méthodes

• 2 types de méthodes en java– Opérations sur les objets :

• String str = "coucou" ;

• str.toUpperCase() ; // mise en majuscules

– Opérations statiques (méthodes de classe)• Math.sin(double a) // méthode sin de la classe Math

• Math.max(int a, int b) // méthode max de la classe Math

• Files.delete(c:\temp\toto.txt") // méthode delete

– Pour le moment, nous nous intéressons aux méthodes statiques qui sont des outils

Méthodes statiques

• En java, les méthodes dites « statiques » doivent être vues comme des outils offerts par une classe

• Une méthode statique ne s’applique pas sur un objet à la différente des méthodes d'objets

• Les méthodes statiques s'appliquent en dehors des objets

• C'est ce qui se rapproche le plus des fonctions des langages impératifs (C, Ada, ...)

Déclaration

• static <typeRetour> nomMethode ( <liste de paramètres>) {<corps de la méthode>}

• <typeRetour>

– quand la méthode renvoie une valeur, indique le type de valeur retournée

• static int max3(int a, int b, int c) // retourne un entier

• static int [ ] fibonacci(int n) // retourne un tableau d'entiers

– void si la méthode ne retourne pas de valeur

• static void dessinerCercle(Point p, int rayon)

Déclaration

• static <typeRetour> nomMethode ( <liste de paramètres>) {<corps de la méthode>}

• <corps de la méthode>– suite de déclaration de variables (types primitifs ou objets) et

d'instructions

– si la méthode retourne une valeur, le corps de la méthode doit contenir l'instruction return expression ; où expression délivre une valeur du type attendu en retour

static int abs(int a) {if (a < 0) return -a ;else return a ;}

Déclaration

• static <typeRetour> nomMethode ( <liste de paramètres>) {<corps de la méthode>}

• <corps de la méthode>– return est indispensable lorsque la méthode retourne une valeur

– return est facultatif si la méthode ne retourne pas de valeur (void), toutes les instructions suivant le return sont ignorées. Quitte le bloc et retourne ) la fonction appelante

static void sauteLignes(int a) {if (a <= 0) return ;int i ;for (i = 0 ; i < a ; i++) System.out.println("") ;}

Notes sur les variables

• static <typeRetour> nomMethode ( <liste de paramètres>) {<corps de la méthode>}

• <corps de la méthode>– elles conservent les données qui sont manipulées par la méthode

– elles ne sont accessibles que dans le bloc dans lequel elles ont été déclarées, et leur valeur est perdue lorsque la méthode termine son exécution

static int methode1(...){ double x ; int [ ] t = new int[10] ; double a ;…}

static int methode2(...){ double y ; int [ ] t = new int[10] ; double a ;…}

on peut utiliser le

même identificateur

dans 2 méthodes distinctes.Variables locales

Appel des méthodes statiques

• Déclaration

• Appel– <liste des paramètres effectifs>

– liste d'expressions séparées par des virgules et dont le nombre et le type correspond au nombre et au type des paramètres de la méthode

nomMethode( <liste des paramètres effectifs>)

static <typeRetour> nomMethode ( <liste de paramètres>) {<corps de la méthode>}

déclaration Appel

static void sauteLignes(int a) {}

sauteLignes(10) ;

static int abs(int a){}

n = abs(-5) ;b = abs(x) ;

static int [ ] fibonacci(int n){}

int [ ] t = new int[10] ;t = fibonacci(6) ;

Passage de paramètres

• Comme en C, le passage de paramètres se fait par valeur– seule une copie des variables est transmise aux méthodes statiques

– ces paramètres sont considérées comme des variables locales à l'intérieur de la méthode

– cf Cours11.java et Cours12.java

Appel des méthodes

• Toute méthode statique d'une classe peut être invoquée depuis n'importe quelle autre méthode statique de la classe– l'ordre de déclaration des méthodes n'a pas

d'importance

– pour invoquer une méthode d'une autre classe, il faut la préfixer par le nom de la classe où elle est déclarée

– ex :• Math.random() Arrays.fill(t, 17)

– Il est donc possible d'avoir des méthodes de nom identique dans des classes différentes

Nom des classes oùles méthodes sont déclarées

Objets

• Un objet est une instance d'une seule classe :– Chaque attribut déclaré dans la classe de l'objet admet une valeur

propre dans chaque instance

– Ces valeurs caractérisent l'état de l'objet

– Les méthodes de classes agissent sur les instances. Attention, les méthodes statiques sont indépendantes des objets. Ce sont en général des boites à outils

Objets: Etudiant

• Chaque instance de la classe Etudiant possédera ses propres attributs (nom, prénom, ...)

Etudiant

e2 : Etudiante1 : Etudiant e3 : Etudiant

Nom : alfred Nom : paul Nom : jean

Décomposition d'un objet

• Un objet est en général constitué d'une partie dynamique et d'une partie statique– La partie statique est :

• commune à toutes les instances

• Un seul exemplaire pour l'ensemble des classes

– La partie dynamique est :• Propre à chaque instance

• Varie durant la vie d'un objet

nom : alfred nom : paul

prénom : prénom :

Partie statique

float calculerMoyenne()

Création d'objets en java

• Le mot a déjà été utilisé de nombreuses fois. La création d'un objet java à partir de son modèle (sa classe) s'appelle instanciation

• L'instanciation en java comporte trois parties :– Création de l'espace mémoire nécessaire pour la nouvelle instance

– Appel à une méthode ou à des méthodes particulières appelées constructeurs

– Renvoi d'une référence sur l'objet créé

Instanciation en java

• new constructeur (< liste de paramètres>)

• Les constructeurs ont le même nom que la classe

• Il existe toujours un constructeur par défaut qui ne fait que l'action 1 du processus d'instanciation, c'est-à-dire allocation de la mémoire pour l'objet– Sans paramètre

Etudiant e1 ;e1 = new Etudiant()Etudiant e2, e3 ;e2 = new Etudiant() ;e3 = e2 ;

Gestion de la mémoire

• L'instanciation provoque une allocation dynamique de la mémoire

• En Java, le programmeur n'a pas à se soucier de la gestion de la mémoire– Si un objet n'est plus référence (n'est plus utilisé par aucune référence),

la mémoire allouée est libérée automatiquement. Ce processus de libération de la mémoire est appelé « garbage collector » ou « ramasse-miettes »

Constructeur par défaut

RIEN ! Mais ça marche

Références en Java

• Déclarations de références

• Par défaut à la déclaration une référence vaut null– Etudiant e1; ↔ Etudiant e1 = null;

Etudiant e1;Etudiant e2, e3;

Nom de la classe

Identificateur(références)

Créer une instance de Ville

• Utilisation du mot-clef new– rappel String toto = new String() ;

– création d'une instance de l'objet String appelé toto

• Même principe que pour String

public class Test1{ public static void main(String[] args){ Ville v = new Ville(); } }

v est de type Ville

cf Cours14.java

Un constructeur plus élaboré

constructeur de laclasse Etudiant

Plusieurs constructeurs

• Une classe peut avoir plusieurs constructeurs

• C'est le principe dit de la surcharge, le constructeur sera choisi suivant les paramètres

• Cf Cours15.java

Les méthodes des objets

• Pour exécuter une méthode d'un objet, on parle dans le cadre de la POO d'envoi de messages

• Un message est composé de 3 parties :– Une référence (nom de l'instance) qui permet de déterminer l'objet à qui

le message est envoyé

– Le nom de la méthode à exécuter (cette méthode doit bien entendue être décrite dans la classe de l'objet)

– Les éventuels paramètres de la méthode

• Envoi de message est similaire à l'exécution d'une fonction mais les méthodes ne sont disponibles que pour un objet donné

syntaxe

• nomObjet.nomMéthode(< liste de paramètres>)

Paramètre des méthodes

• Un paramètre d'une méthode peut être– Une variable de type simple, type primitif, déjà vu

– Une référence à une classe (par exemple String, mais également Dossier qui peut être le dossier d'un étudiant)

/** * teste si un étudiant est plus vieux que l'étudiant courant * * @param e étudiant * * @return vrai si l'étudiant courant est plus agé que celui passé en paramètre */ boolean plusVieux(Etudiant e){

if (anneeNaissance < e.anneeNaissance) return true;else return false;

}

Comment utiliser cetteméthode ?

L'objet « this »

• En java, l'accent est mis sur l'objet (et non pas sur l'appel de fonction)– e1.ajouterNote(17)

– e1.plusVieux(e2)

• L'objet qui reçoit un message est implicitement passé comme argument à la méthode invoquée

• Cet argument implicite défini par le mot-clef this– Désigne l'objet courant (objet récepteur du message)

– Peut être utilisé pour rendre explicite l'accès aux propres attributs et méthodes définis dans la classe

– Est en général facultatif

Réécriture de Etudiant

Cf classe EtudiantThis

Accès aux attributs d'un objet

• Pour accéder aux attributs d'un objet, on utilise la notation :– nomObjet.nomAttribut

Etudiant e1;e1 = new Etudiant();Etudiant e2 = new Etudiant;Etudiant e3 = e2;e1.nom = "toto";e2.nom = "alfred";e3.anneeNaissance = 2000;

e1

e2

e3

toto

alfred

Encapsulation

• Accès direct aux variables d'un objet possible en java

• Mais... n'est pas recommandé car contraire aux principes des langages orientés-objets– Les données d'un objet doivent être privées (c'est-à-dire protégées et

accessibles qu'au travers de méthodes prévues à cet effet)

• En Java, on peut définir de manière assez précise la visibilité des membres (attributs et méthodes) d'une classe vis-à-vis d'une autre– private

– public

– protected

Encapsulation

• public/private

La classe peut être utilisée dans n'importe quelle classe

Attribut accessible depuis n'importe quelle classeClasse.attribut

Attribut accessible uniquement dans la classe où il est défini

Méthode pouvant être invoquée depuis n'importe quelle classeClasse.methode(...)

Méthode utilisable uniquement dans la classe où elle est définie

public private

classe

attribut

méthode

Exemple d'attributs private

private (suite)

Ne foncti

onne plus

Car anneNaiss

ance est

Maintenant un attri

but

private

Intérêt

• On accède aux données seulement à travers des méthodes définies dans le code de la classe. On obtient ainsi un code robuste

• Cela maque l'implémentation et facilite l'évolution du logiciel

• Les méthodes qui accèdent aux attributs sont appelées accesseurs

• Les méthodes qui modifient les attributs sont appelées modificateurs

Accesseurs

• Les accesseurs sont conventionnellement préfixés par get

Modificateurs

Rap

pels

classe

attributs

méthodes

constructeur

Questions

• Inutile d'aller plus loin– Quelle est la différence entre une classe et une instance ?

– Qu'est-ce qu'un constructeur ?

– Qu'est-ce qu'une méthode ?

– Un constructeur est-il une méthode ?

– Qu'est-ce qu'un attribut ?

• Construire une classe Voiture– Année (millésime)

– Marque

– Couleur

– Neuve (booléen)

Questions

• Inutile d'aller plus loin– Quelle est la différence entre une classe et une instance ?

– Qu'est-ce qu'un constructeur ?

– Qu'est-ce qu'une méthode ?

– Un constructeur est-il une méthode ?

– Qu'est-ce qu'un attribut ?

• Construire une classe Voiture– Année (millésime)

– Marque

– Couleur

– Neuve (booléen)

Rajouter maintenant un constructeur plus élaboré que le constructeurde base

• Année, marque, couleur, neuve• Valeurs passées en paramètres