Université Lumière Lyon 2 Faculté de Sciences Economiques et Gestion KHARKIV National University of Economic Classes et objets en Java Master Informatique 1 ère année Julien Velcin http://mediamining.univ-lyon2.fr/velcin Concept de classes (1) Calculer le prix de la location d un véhicule : Il existe 2 catégories de véhicules (tourisme, utilitaire). En fonction de ces catégories, le prix de base est le suivant : tourisme : 50 Є + 30 Є / jour + 0.50 Є / km utilitaire : 50 Є + 40 Є / jour + 0.60 Є / km Pour les véhicules tourismes, il est possible de réserver : une galerie (+5 Є) et un porte vélo (+3 Є). Pour les véhicules utilitaire, le prix dépend de la charge utile. - Demander les informations nécessaires au calcul du prix de la location. - Afficher le prix de cette location. Concept de classes (2) Enoncé spécifications location = ce que l on doit gérer Une location est définie par : type de véhicule loué (tourisme, utilitaire) nombre de jours de la location nombre de kilomètres prix galerie, porte-vélo charge Une location a une «vie», elle agit : elle doit demander les valeurs aux utilisateurs. elle doit calculer le prix. elle doit afficher ce prix. Données Fonctions Concept de classes (3) Objectifs : Regrouper les infos d une même entité : les données (variables) : champs = propriétés. les fonctions : méthodes. location Propriétés : type, km, jours, prix, gallerie, velo, charge Méthodes : saisieinfos(), calculprix(), afficheprix() ClasseA Champs Méthodes - int type - int nb_km - int nb_jours - double prix - boolean gallerie saisieinfos() calculprix()
Concept de classes (4) public class { public int type; public int km; public int nb_jours; public double prix; public boolean a_porte_velo; public double calculprix() {.java Propriétés/Champs Concept de classes (5) Propriétés accessibles dans chaque méthode. Initialiser les propriétés : public double km = 1000; public void saisieinfos() { km = Lire.i(); Méthodes public void afficheprix() { System.out.println(prix); (fin de la classe).java Définition : Objets (1) Un objet = instance de classe variable de type classe La classe prend une valeur particulière. Ex : location tourisme pour 3 jours, sans km supplémentaire... Instanciation : Syntaxe : NomClasse nom_objet; () nom_objet = new NomClasse(); ou directement déclaration + instanciation NomClasse nom_objet = new NomClasse(); l1; l2; l1 = new (); L2 = new (); l = new (); l est donc un pointeur. Objets (2) l type km jour prix charge Réserve un espace mémoire.
Objets (3) Accès aux champs et méthodes : Syntaxe : nom_objet.champ nom_objet.méthode(argument,...) public class LeMain { public static void main(string [] arg) { l = new (); Déclaration + Instanciation l.prix = 0; l.saisieinfos(); Affecter une propriété Appeller une méthode Objets (4) Programme principale : classe avec main(). Il n est pas nécessaire d instancier cette classe. Accessibilité : mettre les différentes classes dans le même répertoire. Désallocation : automatique (c.f. Garbage Collector). Principal void main(string []) Principal.java.java int type int km... saisieinfos() calculprix() Constructeur (1) Rappel, calcul du prix d'un location : tourisme : 50 Є + 30 Є / jour + 0.50 Є / km Change régulièrement! Champ (variable) mais : valeur non demandée à l utilisateur, valeur par défaut obligatoire. Constructeur (2) Objectifs : initialiser l objet et l ensemble de ces champs. Exemple (rappel): - double prix_jour - double forfait - double prix_km + double calculprix() donner une valeur par défaut à ces champs. Démarche et mécanisme : méthode appelée systématiquement à l initialisation (new)
Constructeur (3) Implémentation : constructeur = méthode pas de type de retour nom identique à la classe plusieurs constructeurs possibles Syntaxe: public class NomClasse { public NomClasse (type param,) { Constructeur par défaut Non static (cf. cours ultérieur sur les portées) public class LocaTourisme { double prix_km; Constructeur (4) public LocaTourisme(double p_prix_km){ prix_km = p_prix_km; public double calculprix() {... public static void main(... ) { double le_prix_km = 0.9; LocaTourisme l = new LocaTourisme(le_prix_km); Accesseurs - mutateurs Démarche et mécanisme : o empêcher l accès direct aux champs. accesseurs : méthodes d accès à un champ. mutateurs : méthodes de modification d un champ. o définir la porté des méthodes. public class Vecteur { private int price; public void setprice(int val) { if (val > 0) price = val; public int getprice() { return price; champs price caché mutateur accesseur Dans l'exemple précédent : Héritage (1) Il existe plusieurs types de location. Pour chaque type, les informations et les calculs sont différents locations tes classes tes Mais chaque type a également des points communs :! notion d héritage locatourisme locautilitaire
Héritage (2) Héritage (3) - double prix - int nb_km - int nb_jours locatourisme - boolean a_velo - boolean a_gallerie locautilitaire double charge Généralisation Objectifs : o Centraliser le code. o Structurer le programme. o Faciliter la maintenance. Démarche et mécanisme : o Une (super) classe ancêtre / mère : + générale. o Des classes héritières / filles : " + spécifiques. " héritent des champs et méthodes. " définissent de nouveaux champs / méthodes. " modifient les méthodes existantes. Généralisation ClasseMère ClasseFille Syntaxe : Héritage (4) public class NomClasseFille extends NomClasseMere { LeMain void main(string []) LocaTourisme prix, km, jours saisieinfos() afficherprix(); Utilitaire Héritage (5) - surcharge Mécanisme associé : surcharge Exemple: int i=4; double d=7.0; System.out.println(d); System.out.println(i); System.out.println("les deux marchent"); Pourquoi? Plusieurs méthodes println sont définies : public void println(double x) { public void println(string x) { (etc.) a_velo charge! La méthode println est dite surchargée.
Héritage (6) - surcharge a) Objectifs: o étendre le domaine d application des méthodes, o permettre une meilleure cohérence des dénominations. Signature d une méthode = nom + paramètres + ordre des paramètres ce qui rend la méthode unique. b) Démarche et mécanismes : o entre méthodes d une même classe ou d une hiérarchie o nom identique o paramètres différents! signatures différentes Syntaxe : Héritage (7) - surcharge public static int nomfonction (int param1) { public static int nomfonction (float param1) { public static int nomfonction (int param1) { public static float nomfonction (int param1) { Erreur de Compilation! c) Avantage : Utilisation intuitive des méthodes par d autres programmeurs. Héritage (8) - outrepassement Mécanisme associé : Outrepassement LocaTourisme LocaUtilitaire Héritage (9) - outrepassement public class { public double calculprix() { return 50 + prix;... commun public class LocaTourisme extends { public double calculprix() { prix = 30*jours + 0,5*km; particulier return super.calculprix();...
Héritage (10) - outrepassement a) Objectifs : o cacher la méthode mère par la méthode fille, o étendre ou modifier le corps de la méthode. b) Démarche et mécanismes : o redéclaration d une méthode de la classe mère, o signatures identiques, o modificateurs d accès moins restrictifs (cf. modificateurs). o La méthode mère doit être accessible (cf. protection et portée). o Le mot clef super donne l accès à la méthode de la classe mère. Objectifs : Polymorphisme (1) o généraliser le code, o simplifier l écriture du programme (minimiser Ctrl+C/Ctrl+V), o obtenir des exécutions différentes suivant le contexte. Démarche et mécanisme : o le type effectif d une variable = type de l instanciation public class MainVoiture { Polymorphisme (2) public static void main (String [] arg) { System.out.println("Categorie de voiture?"); int categ=lire.i(); l=null; Contexte Déclaration type le + générique Transtypage (1) La classe déclarée d un objet n est pas forcément la classe instanciée. + générique + détaillée Comment accéder aux champs/méthodes? if (categ==1) l= new LocaTourisme(); else l= new LocaUtilitaire(); l.saisieinfos(); l.calculprix(); l.afficheprix(); nécessite une relation d héritage. Instanciation 1 seul traitement Object o = new LocaVoiture(); o.calculprix(); o.calculprix(); Faux : Object ne définit pas de méthode calculprix()!
Transtypage (2) La classe déclarée d un objet n est pas forcément la classe instanciée. Packages API Java https://docs.oracle.com/javase/8/docs/api/ Description de la classe + générique + détaillée Comment accéder aux champs/méthodes? Object o = new LocaVoiture(); LocaVoiture lv = (LocaVoiture)o; lv.calculprix(); transtypage Classes