Java et la POO - WordPress.com...Pourquoi la POO ? Rappel de concevoir l’organisation de grands...

Post on 26-Sep-2020

1 views 0 download

Transcript of Java et la POO - WordPress.com...Pourquoi la POO ? Rappel de concevoir l’organisation de grands...

Java et la POO

S. Rital

Plan

● Pourquoi la POO ? Rappel.● Votre première classe● L'héritage● Modéliser avec UML● Les packages● Classe abstraite et Interface● Le pattern Strategy

Pourquoi la POO ? Rappel

● de concevoir l’organisation de grands projets informatiques autour d’entités précisément structurés, mêlant données et fonctions (les objets) facilitant la modélisation de concepts sophistiqués ;

● d’améliorer la sûreté des logiciels en proposant un mécanisme simple et flexible des données sensibles de chaque objet en ne les rendant accessibles que par le truchement de certaines fonctions associées à l’objet (encapsulation) afin que celles-ci ne soient pas accessibles à un programmeur inattentif ou malveillant.

● de simplifier la réutilisation de code en permettant l’extensibilité des objets existants (héritage) qui peuvent alors être manipulés avec les même fonctions (polymorphisme).

Votre première Classe

✗ Structure de base✗ Les constructeurs✗ Encapsulation✗ Accesseurs et mutateurs✗ Les variables de classes✗ Résumé

Structure de base

public class Test {

public static void main(String[] args) {

System.out.println("Hello tii !");

}

}

● public :la portée de la classe.

● public class xxxx et class xxxx sont équivalents.

● public → méthode X dans une classe Y signifie → la méthode X est accessible depuis partout dans le programme.

● private → méthode X → elle accessible que depuis la classe seulement (si on veux cacher une implémentation:=) ).

Structure de base

● Créer une classe Ville avec Eclipse.● Ajouter quelques propriétés :

– nomVille → String

– nomPays → String

– nbreHabitants → int

Structure de base

● nomVille, nomPays et nbreHabitants → variables de portées public

Structure de base

● Dans une classe, il existe trois types de variables :

– Variable de classe

– Variable d'instance

– Variable locale

● Dans la classe Ville, nbreHabitants, nomVille et nomPays sont des variables d'instances.

● Tout objet de la classe Ville possède ces propres variables nbreHabitants, nomVille et nomPays

Structure de base

Les variables d'instances de l'objet 'paris' sont :

● null pour – NomVille

– NomPays

● 0 pour – nbreHabitants

Comment initialiser les variables d'instances ?

Constructeurs

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

● Cette méthode a pour rôle de signaler à la JVM qu'il faut réserver de la mémoire pour notre futur objet et donc, par extension, d'en réserver pour toutes ses variables.

Constructeurs

Le mot clé 'thisthis' désigne l'objet courant.

Lorsque l'on développe une classe, on code le comportement que devra avoir l'objet lorsqu'il sera utilisé, si dans une méthode un objet doit s'utiliser lui même, alors il est nécessaire de connaître sa propre référence, qui nous ai donné par la valeur de this.

Constructeurs

● Un constructeur est une méthode de la classe● Le constructeur d'une classe doit porter le

même nom que la classe.● Un constructeur n'envoie rien même pas void● Un constructeur peut être surchargé.

Constructeurs

Constructeurs

● Surcharger un constructeur.Ville ville3 = new Ville("Marseille", 123456789, "France");

Constructeurs

Constructeurs

● Depuis la classe Test modifier le nom d'une ville.

● N'importe quel développeur peut changer le contenu de mes variables !!

Encapsulation

● Ajouter la porté private pour les attributs de votre classe Ville ! Et compiler à nouveau !

Encapsulation

Le premier avantage de la POO

Accesseurs et mutateurs

Accesseurs et mutateurs

● Un accesseur est une méthode qui va nous permettre d'accéder aux variables de nos objets en lecture, et un mutateur nous permettra d'en faire de même en écriture !

● Grâce aux accesseurs, vous pourrez afficher les variables de vos objets, et grâce aux mutateurs, vous pourrez les modifier.

● Porté public

Accesseurs et mutateurs

// ******************* Mutateurs ***********************

public void setNom(String pNom){

this.nomVille = pNom;

}

//******************* Accesseurs ***********************

public String getNom(){

return this.nomVille;

}

● Faite les autres !

● Créer deux villes v1,v2

– Marseille, 123456, France

– Rio, 321654, Brésil● Interchanger v1 et v2

● Changer leurs noms.

Accesseurs et mutateurs avec Eclipse

● Commencer par définir vos variables d'instances

● A l’intérieur de votre classe Ville, clique bouton droite de la souris, puis sélectionner source.

● Ensuite, choisissez « Generate getters & setters ».

● Sélectionner les variables, ainsi que les portées des méthodes : public

● OK

Accesseurs et mutateurs

Accesseurs et mutateurs

● Dans une classe– Les constructeurs

– Les accesseurs / mutateurs

– Les méthodes d'instance

● Gestion des objets (comportements)

Accesseurs et mutateurs

● A vous !– Système de catégorie des villes

● A → < 1000 , B → < 10000, ...

– Description de la ville

– Comparer deux villes (nbr d'habitants).

Accesseurs et mutateurs

//Définit la catégorie de la ville

private void setCategorie() {

int bornesSuperieures[] = {0, 1000, 10000, 100000, 500000, 1000000, 5000000, 10000000};

char categories[] = {'?', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'};

int i = 0;

while (i < bornesSuperieures.length &&

this.nbreHabitants >= bornesSuperieures[i])

i++;

this.categorie = categories[i];

}

Accesseurs et mutateurs

//Retourne la description de la ville

public String decrisToi(){

return "\t"+this.nomVille+" est une ville de "+this.nomPays+

", elle comporte : "+this.nbreHabitants+

" habitant(s) => elle est donc de catégorie : "+this.categorie;

}

//Retourne une chaîne de caractères selon le résultat de la comparaison

public String comparer(Ville v1){

String str = new String();

if (v1.getNombreHabitants() > this.nbreHabitants)

str = v1.getNom()+" est une ville plus peuplée que "+this.nomVille;

else

str = this.nomVille+" est une ville plus peuplée que "+v1.getNom();

return str;

}

Les variables de classe

● Nous avons manipulés les variables d'instances

● Les variables de classes sont communes à toutes les instances d'une classe

● Compter le nbr d'instance de l'objet Ville● Un taux de TVA dans une classe pour calculer

le prix TTC.

Les variables de classe

private static int nbreInstances

public static int getNombreInstances(){

return nbreInstances ;

}

Toute les méthodes n'utilisant que des variables de classe doivent être déclarées static

On les appelle des méthodes de classe.

Les variables de classepublic class Ville {//Variables publiques qui comptent les instancespublic static int nbreInstances = 0;//Variable privée qui comptera aussi les instancesprivate static int nbreInstancesBis = 0;//Les autres variables n'ont pas changépublic Ville(){//On incrémente nos variables à chaque appel aux constructeursnbreInstances++;nbreInstancesBis++;//Le reste ne change pas.}public Ville(String pNom, int pNbre, String pPays){//On incrémente nos variables à chaque appel aux constructeursnbreInstances++;nbreInstancesBis++;//Le reste ne change pas}

public static int getNombreInstancesBis(){return nbreInstancesBis;}//Le reste du code est le même qu'avant}

Résumé

● Une classe permet de définir des objets. Ceux-ci ont des attributs (variables d'instance) et des méthodes (méthodes d’instance + accesseurs).

● Les objets permettent d'encapsuler du code et des données.

● Le ou les constructeurs d'une classe doivent porter le même nom que la classe et n'ont pas de type de retour.

● L'ordre des paramètres passés dans le constructeur doit être respecté.

● Il est recommandé de déclarer ses variables d'instance private, pour les protéger d'une mauvaise utilisation par le programmeur.

● On crée des accesseurs et mutateurs (méthodes getters et setters) pour permettre une modification sûre des variables d'instance.

● Dans une classe, on accède aux variables de celle-ci grâce au mot clé this.

● Une variable de classe est une variable devant être déclarée static.

● Les méthodes n'utilisant que des variables de classe doivent elles aussi être déclarées static.

● On instancie un nouvel objet grâce au mot clé new.

Héritage

✗ Pourquoi ?✗ Comment ?✗ Polymorphisme✗ Résumé

Pourquoi ?

RIO

RabatParis

Dijon

Lyon

Madrid

Genova

MarrakechSao Paulo

New York

Montreal

Chicago

Pourquoi ?

Rabat Paris Madrid

Ottawa Pékin Panama

Moscou

Classe Capitale → Nom Ville, Nombre d'habitants , Pays et Monuments

Duplication !

Pourquoi ?

Classe Capitale → Nom Ville, Nombre d'habitants , Pays et Monuments

Exploiter Classe Ville dans classe Exploiter Classe Ville dans classe Capitale → par héritage Capitale → par héritage

Une Capitale estest une Ville

Pourquoi ?

Exploiter Classe Ville dans classe Exploiter Classe Ville dans classe Capitale → par héritage Capitale → par héritage

Ville

Capitale

Classe mère

Classe dérivée

UneAutreClasse

EncoreUneClasse

Pas d'héritage multiplePas d'héritage multiple

Comment ?

public class Capitale extends Ville {}

Capitale cap = new Capitale() ;

System.out.println(cap.decrisToi()) ;

cap possède les propriétés de la classe Ville

Comment ?

public class Capitale extends Ville {

public Capitale(){

this.nomVille = "toto";

}

}

Comment ?

public class Ville {

protected String nomVille ;

...

}

Comment ?

public class Capitale extends Ville {

private String monument;

public Capitale()

{

supersuper();();

this.monuments = "aucun";

}

}

public class Capitale extends Ville {

private String monument;

public Capitale( parametres )

{

supersuper( parametres );( parametres );

this.monuments = "aucun";

}

}

super() le constructeur de la classe mère. Utilisation d'un constructeur de la classe mère

Comment ?public class Capitale extends Ville {

private String monument;

public Capitale(){

super();

this.monument = "aucun";

}

public Capitale(String nom, int hab, String pays, String monument){

super(nom,hab,pays);

this.monument = monument;

}

public String decrisToi(){

String str = super.decrisToi() + "\n \t ==>> " + this.monument + "en est un monument";

return str;

}

}

Redéfinition des méthodes héritées

Comment ?

Polymorphisme

● Toute classe hérite de la classe Object● Nous pouvons redéfinir l'ensemble des

méthodes de la classe Object.● toString() ?● System.out.println(v) ↔ System.out.println(v.toString())

for(Object v : Ville )

System.out.println(v.decrisToi()) ;

Polymorphisme

Redéfinition de méthodes dans les sous-classes : POLYMORPHISME

Polymorphisme

● hashCode() et equals()– public boolean equals() permet de vérifier si un

objet est égal à un autre.

– public hashCode() attribue un code de hashage à un objet (un identifiant)

Ce n'est pas parce que deux objets on un même code de hashage qu'ils sont égaux.

Deux objets égaux ont forcément le même code de hashage !

Polymorphisme

public boolean equals(Ville v)

{

return (this.hashCode() == v.hashCode() && this.getNombreHabitants() == v.getNombreHabitants());

}

public int hashCode(){

return (this.nomVille.hashCode()+this.nomPays.hashCode());

}

Résumé

● Une classe hérite d'une autre classe par le biais du mot clé extends.

● Une classe ne peut hériter que d'une seule classe.

● Si aucun constructeur n'est défini dans une classe fille, la JVM en créera un et appellera automatiquement le constructeur de la classe mère.

● La classe fille hérite de toutes les propriétés et méthodes public et protected de la classe mère.

● Les méthodes et les propriétés private d'une classe mère ne sont pas accessibles dans la classe fille.

● On peut redéfinir une méthode héritée, c'est-à-dire qu'on peut changer tout son code.

● On peut utiliser le comportement d'une classe mère par le biais du mot clé super.

● Si une méthode d'une classe mère n'est pas redéfinie ou « polymorphée », à l'appel de cette méthode par le biais d'un objet enfant, c'est la méthode de la classe mère qui sera utilisée.

● Vous ne pouvez pas hériter d'une classe déclarée final.

● Une méthode déclarée final n'est pas redéfinissable.

Modéliser avec UML

✗ Exemple → Digramme de Classes JAdID✗ Pourquoi ?✗ Modéliser ses objets✗ Modéliser les liens entre les objets✗ Logiciels✗ Résumé

Exemple. Projet JAdID

Exemple. Projet JAdID

Pourquoi ?

● Pour des projets (à taille moyenne ou plus)● Pour des projets impliquant plusieurs

développeurs (>= 2)

Il faut impérativement un digramme de classe UMLqui représente les objets et les relations entre les objets.

Pourquoi ?

● UML ne se limite pas au Digramme de Classe mais ...

Modéliser ses objets

Modéliser les liens entre les objets

Modéliser les liens entre les objets

Logiciels

ArgoUML & Eclipse

● Help → install new software

ArgoUML & Eclipse

ArgoUML & Eclipse

ArgoUML & Eclipse

ArgoUML & Eclipse

Résumé

● UML vous permet de représenter les liens entre vos classes.

● Vous pouvez y modéliser leurs attributs et leurs méthodes.

● Vous pouvez représenter l'héritage avec une flèche signifiant « est un ».

● Vous pouvez représenter l'appartenance avec une flèche signifiant « a un ».

● Vous pouvez représenter la composition avec une flèche signifiant « est composé de ».

Les packages

✗ Pourquoi ?✗ Création d'un package✗ Droits d'accès entre les packages✗ Résumé

Pourquoi ?

● Structuration des codes en dossiers et sous dossiers.

Création d'un package

Création d'un package

Droits d'accès entre les packages

● Ajouter deux classes dans le package :– fr.learningjava.tp1

Eclipse est content

Droits d'accès entre les packages

● Ajouter deux classes dans le package :– fr.learningjava.tp1

Les classes abstraites & les interfaces

✗ Les classes abstraites✗ Les interfaces✗ Exemple✗ Pattern Strategy✗ Résumé

Les classes abstraites

● Une classe abstraite est quasiment identique à une classe normale.

● Une particularité : vous ne pouvez pas l'instancier !

● Pourquoi ?

Les classes abstraites

Les classes abstraites

● Je ne sais pas ce que mange un objet Animal. ● Toutes les classes ne sont pas bonnes à être

instanciées !● Ces classes servent à définir une

superclasse : servent essentiellement à créer un nouveau type d'objets.

Les classes abstraites

abstract class Animal {}

abstract class Animal {

abstract void manger() ; // une méthode abstraite

}

Une méthode abstraite est composée de l'entête suivie par un point-virgule.

Une classe qui comporte au moins une méthode abstraite est une classe abstraite.

Les classes dérivées sont obligé d’implémenter les méthodes abstraites.

Les classes abstraites

Polymorphisme

Correct ?

Non correct ! Pourquoi ?

Les classes abstraites

● Réaliser ce projet.

Les classes abstraites

Les interfaces

Cher collègue. J'aimerai bien utiliser la classe chien.

Par contre, je veux que Tu m'ajoute certains comportement :

Le chien doit faire le beauFaire des câlins

….

Les interfaces

● public interface I {}

Une interface est une classe 100 % classe abstraite.

Les interfaces

Exemple

Pattern Strategy

Résumé

● Une classe est définie comme abstraite avec le mot clé abstract.

● Les classes abstraites sont à utiliser lorsqu'une classe mère ne doit pas être instanciée.

● Une classe abstraite ne peut donc pas être instanciée.

● Une classe abstraite n'est pas obligée de contenir de méthode abstraite.

● Si une classe contient une méthode abstraite, cette classe doit alors être déclarée abstraite.

● Une méthode abstraite n'a pas de corps.

● Une interface est une classe 100 % abstraite.

● Aucune méthode d'une interface n'a de corps.

● Une interface sert à définir un supertype et à utiliser le polymorphisme.

● Une interface s'implémente dans une classe en utilisant le mot clé implements.

● Vous pouvez implémenter autant d'interfaces que vous voulez dans vos classes.

● Vous devez redéfinir toutes les méthodes de l'interface (ou des interfaces) dans votre classe.

● Le pattern strategy vous permet de rendre une hiérarchie de classes plus souple.

● Préférez encapsuler des comportements plutôt que de les mettre d'office dans l'objet concerné.