Cours du 5 novembre.

Slides:



Advertisements
Présentations similaires
Cours n° 4 Objets, classes, interfaces et héritage
Advertisements

Spécialisation/généralisation Héritage Polymorphisme.
Spécialisation/généralisation Héritage Polymorphisme
1 Quelques précisions sur l'héritage. 2 Signification de super.f() appel à la méthode f() masquée super : désigne l'objet appelant comme s'il était de.
Introspection et Réflexion Manipulation dynamique de code Java.
SI3 MAM3 Hydro Nathan Cohen Igor Litovsky Christophe Papazian
F. Voisin : Introduction à Java 1 Introduction à Java - lhéritage - Frédéric VOISIN FIIFO - « Remise à Niveau »
Programmer en JAVA par Tama
Programmation Objet en JAVA Cours 2 : Réutilisation, Héritage 1 Agrégation, composition, héritage, Hiérarchie, Constructeurs, Transtypage.
Tarak Chaari, Stéphane Frénot, Frédérique Laforest, Frédéric Le-Mouël JAV1 JAV – TD 5 Lhéritage en Java.
Leçon 3 : Héritage IUP 2 Génie Informatique
Chapitre IV Object, interfaces, classes imbriquées.
Chapitre III Héritage (début)
VI) exemple: Les astres…
Programmation orientée objet
POO-L3 H. Fauconnier1 Chapitre IV 1. classe Object, clonage 2. interfaces 3. classes internes et imbriquées.
Langage Oriente Objet Cours 4.
Cours du 19 octobre. POO-L3 H. Fauconnier2 E) Constructeurs et héritage Le constructeurs ne sont pas des méthodes comme les autres: le redéfinition na.
POO-L3 H. Fauconnier1 C) Méthodes: Redéfinition Un classe hérite des méthodes des classes ancêtres Elle peut ajouter de nouvelles méthodes Elle peut surcharger.
POO-L3 H. Fauconnier1 Tableau et héritage Y[] yA=new Y[3]; X[] xA=yA; //ok xA[0]=new Y(); xA[1]=new X(); //non xA[1]=new Z(); //non Object XX[]int[] YZY[]Z[]
Premier cours (23 septembre). Cours programmation- orientée objet en Java Licence dinformatique Hugues Fauconnier
Chapitre VII Généricité. POO-L3 H. Fauconnier2 Chapitre VII 1. Principes généraux 2. Types génériques imbriqués 3. Méthodes génériques 4. Types paramètres.
Chapitre III Héritage. POO-L3 H. Fauconnier2 Chapitre III: Héritage A) Extensions généralités Affectation et transtypage B) Méthodes Surcharge et signature.
Introduction au paradigme objet Concepts importants surcharge (overload) redéfinition (override) Définition d’une classe Définition des attributs.
Java Héritage, interfaces.
77 Utilisation des classes (suite). 7-2 Objectifs A la fin de ce cours, vous serez capables de : Définir des méthodes surchargées dans une classe Fournir.
Langage Oriente Objet Cours 3.
Classes abstraites et Interfaces
POO : Objets et classes (Rappels)
Rappels sur la Programmation java
66 Utilisation des classes et des objets. 6-2 Objectifs A la fin de ce cours, vous serez capables de : Créer de nouvelles classes à laide de Eclipse Utiliser.
Introduction à la Programmation Orientée Objet Retour sur les principaux concepts SI3 MAM3 Hydro Nathan Cohen
Introduction au paradigme orienté-objet (suite)
POO-L3 H. Fauconnier1 Supplément gratuit…. POO-L3 H. Fauconnier2 Entrée-sortie public static void main(String[] args) { // sortie avec printf ou double.
Design Pattern: Decorator
1 Les paquetages («packages»). 2 L'objectif avec les paquetages («packages») est de rendre accessibles aux utilisateurs des classes définies par d'autres.
1 IFT 6800 Atelier en Technologies dinformation Le langage de programmation Java chapitre 3 : Classes et Objects.
Cours 6 Interfaces, classes imbriquées (début). Chapitre IV Interfaces, classes imbriquées, Object.
Chapitre III Héritage. POO-L3 H. Fauconnier2 Chapitre III: Héritage A) Extensions généralités Affectation et transtypage B) Méthodes Surcharge et signature.
Chapitre III Héritage. POO-L3 H. Fauconnier2 Chapitre III: Héritage A) Extensions généralités Affectation et transtypage B) Méthodes Surcharge et signature.
Cours 4 Héritage (suite).
Cours 8 (18 novembre 2011) exceptions. héritagePOO-L3 H. Fauconnier2 Tableau et héritage Y[] yA=new Y[3]; X[] xA=yA; //ok xA[0]=new Y(); xA[1]=new X();
Cours 5 Héritage, Interfaces, classes internes. POO-L3 H. Fauconnier2 La classe Object Toutes les classes héritent de la classe Object Object méthodes:
COURS DE PROGRAMMATION ORIENTEE OBJET :
Héritage Lhéritage permet de spécialiser une classe en définissant une relation de type « est une sorte de ». #include comptebancaire.h class CompteEpargne.
CSI1502 Principes fondamentaux en conception des logiciels
99 Réutilisation du code grâce à l'héritage. 9-2 Objectifs À la fin de ce cours, vous serez capables de : Définir l'héritage Utiliser l'héritage pour.
Héritage et composition
Objectifs À la fin de ce cours, vous serez capables de :
LIFI-Java 2004 Séance du Mercredi 22 sept. Cours 3.
Cours n°3 rappels. POO-L3 H. Fauconnier2 Entrée-sortie public static void main(String[] args) { // sortie avec printf ou double a = 5.6d ; double b =
La notion de type revisitée en POO
Cours 9 Exceptions (fin) Généricité. POO-L3 H. Fauconnier2 Chaînage d'exceptions  Une exception peut être causée par une autre.  il peut être utile.
Programmation objet. Les classes Une classe représente un concept Une classe est :  un module : elle regroupe la déclaration de données et les opérations.
11/04/ L'héritage Cours 7 Cours 7.
Variables et accès en Java. Déclaration des variables final transient static private Printer hp; transient => ne doivent pas être sérialisées volatile.
Cours 7 Classes locales Clonage Divers: tableaux.
Tutorat en bio-informatique
Les classes présenté par: RAHMOUNE RIME / ZEKRI SELMA.
Les classes et les objets Les données finales class A { … private final int n = 20 ; // la valeur de n est définie dans sa déclaration … } class A { public.
Héritage H. Batatia. plan Notion (que signifie l’héritage) Ecriture en java Héritage multiple (interdit) Instanciation (partie propre et partie héritée)
Cours 4 (14 octobre) Héritage. Chapitre III Héritage.
Introduction à la programmation objet avec java
Héritage Conception par Objet et programmation Java
Cours 3 Héritage (début). classes et objetsPOO-L3 H. Fauconnier2 Passage par valeur public class ParamParVal { public static void parVal(int i){ i=0;
Classes abstraites, interface Classe interne Classes enveloppes
E) Constructeurs et héritage
Transcription de la présentation:

Cours du 5 novembre

C) Méthodes: Redéfinition Un classe hérite des méthodes des classes ancêtres Elle peut ajouter de nouvelles méthodes Elle peut surcharger des méthodes Elle peut aussi redéfinir des méthodes des ancêtres. POO-L3 H. Fauconnier

Exemple class Mere{ void f(int i){ System.out.println("f("+i+") de Mere"); } void f(String st){ System.out.println("f("+st+") de Mere"); POO-L3 H. Fauconnier

Exemple (suite) class Fille extends Mere{ void f(){ //surcharge System.out.println("f() de Fille"); } // char f(int i){ // même signature mais type de retour différent // } void g(){ //nouvelle méthode System.out.println("g() de Fille"); f(); f(3); f("bonjour"); void f(int i){ // redéfinition System.out.println("f("+i+") de Fille"); POO-L3 H. Fauconnier

Exemple public static void main(String[] args) { Mere m=new Mere(); Fille f=new Fille(); m.f(3); f.f(4); m=f; m.f(5); //m.g(); ((Fille)m).g(); f.g(); } POO-L3 H. Fauconnier

Résultat f(3) de Mere f(4) de Fille f(5) de Fille g() de Fille f(bonjour) de Mere POO-L3 H. Fauconnier

D) Conséquences Et les variables? Un principe: Une méthode (re)définie dans une classe A ne peut être évaluée que dans le contexte des variables définies dans la classe A. Pourquoi? POO-L3 H. Fauconnier

Exemple class A{ public int i=4; public void f(){ System.out.println("f() de A, i="+i); } public void g(){ System.out.println("g() de A, i="+i); class B extends A{ public int i=3; System.out.println("f() de B, i="+i); g(); POO-L3 H. Fauconnier

Exemple suite: A a=new B(); a.f(); System.out.println("a.i="+a.i); System.out.println("((B) a).i="+((B)a).i); Donnera: f() de B, i=3 g() de A, i=4 a.i=4 ((B) a).i=3 POO-L3 H. Fauconnier

Remarques: La variable i de A est occultée par la variable i de B La variable i de A est toujours présente dans tout objet de B Le méthode g de A a accès à toutes les variables définies dans A (et uniquement à celles-là) La méthode f de B redéfinit f. f() redéfinie a accès à toutes les variables définies dans B POO-L3 H. Fauconnier

E) Divers super Le mot clé super permet d’accéder aux méthodes de la super classe En particulier super permet dans une méthode redéfinie d’appeler la méthode d’origine (exemple: super.finalize() appelé dans une méthode qui redéfinit le finalize permet d'appeler le finalize de la classe de base) POO-L3 H. Fauconnier

Exemple class Base{ protected String nom(){ return "Base"; } class Derive extends Base{ return "Derive"; protected void print(){ Base maref = (Base) this; System.out.println("this.name():"+this.nom()); System.out.println("maref.name():"+maref.nom()); System.out.println("super.name():"+super.nom()); ------------- this.name():Derive maref.name():Derive super.name():Base POO-L3 H. Fauconnier

Contrôle d’accès protected: accès dans les classes dérivées Le contrôle d’accès ne concerne pas la signature Une méthode redéfinie peut changer le contrôle d’accès mais uniquement pour élargir l’accès (de protected à public) Le contrôle d’accès est vérifié à la compilation POO-L3 H. Fauconnier

Interdire la redéfinition Le modificateur final interdit la redéfinition pour une méthode (Bien sûr une méthode de classe ne peut pas être redéfinie! Mais, elle peut être surchargée) Une variable avec modificateur final peut être occultée POO-L3 H. Fauconnier

E) Constructeurs et héritage Le constructeurs ne sont pas des méthodes comme les autres: le redéfinition n’a pas de sens. Appeler un constructeur dans un constructeur: super() appelle le constructeur de la super classe this() appelle le constructeur de la classe elle-même Ces appels doivent se faire au début du code du constructeur POO-L3 H. Fauconnier

Constructeurs Principes: Quand une méthode d’instance est appelée l’objet est déjà créé. Création de l’objet (récursivement) Invocation du constructeur de la super classe Initialisations des champs par les initialisateurs et les blocs d’initialisation Une fois toutes ces initialisations faites, appel du corps du constructeur (super() et this() ne font pas partie du corps) POO-L3 H. Fauconnier

Exemple class X{ protected int xMask=0x00ff; protected int fullMask; public X(){ fullMask = xMask; } public int mask(int orig){ return (orig & fullMask); class Y extends X{ protected int yMask = 0xff00; public Y(){ fullMask |= yMask; POO-L3 H. Fauconnier

Résultat xMask yMask fullMask Val. par défaut des champs Appel Constructeur pour Y Appel Constructeur pour X Initialisation champ X 0x00ff Constructeur X 0x00FF Initialisation champs de Y 0xFF00 Constructeur Y 0xFFFF POO-L3 H. Fauconnier

La classe Objet Toutes les classes héritent de la classe Object méthodes: public final Class<? extends Object> getClass() public int hashCode() public boolean equals(Object obj) protected Object clone() throws CloneNotSupportedException public String toString() protected void finalize() throws Throwable (wait, notify,notfyall) Remarques: Pour le même objet même hachage Si deux objets sont égaux pour equals ils devraient avoir le même hachage En principe le hachage est différent pour des objets différents (exemple de hachage: l'adresse interne de l'objet) toString retourn le nom de l'objet (getClass().getName())@ Integer.toHexString(hashCode()) POO-L3 H. Fauconnier

Exemple class A{ int i; int j; A(int i,int j){ this.i=i;this.j=j;} } class D <T>{ T i; D(T i){ this.i=i; POO-L3 H. Fauconnier

Suite public static void main(String[] args) { A a=new A(1,2); A b=new A(1,2); A c=a; if (a==b) System.out.println("a==b"); else System.out.println("a!=b"); if (a.equals(b)) System.out.println("a equals b"); System.out.println("a not equals b"); System.out.println("Objet a: "+a.toString()+" classe "+a.getClass()); System.out.println("a.hashCode()"+a.hashCode()); System.out.println("b.hashCode()"+b.hashCode()); System.out.println("c.hashCode()"+c.hashCode()); D <Integer> x=new D<Integer>(10); System.out.println("Objet x: "+x.toString()+" classe "+x.getClass()); } a!=b a not equals b Objet a: A@18d107f classe class A a.hashCode()26022015 b.hashCode()3541984 c.hashCode()26022015 Objet x: D@ad3ba4 classe class D POO-L3 H. Fauconnier

Résultat: a!=b a not equals b Objet a: A@18d107f classe class A a.hashCode()26022015 b.hashCode()3541984 c.hashCode()26022015 Objet x: D@ad3ba4 classe class D POO-L3 H. Fauconnier

En redéfinissant equals class B{ int i; int j; B(int i,int j){ this.i=i;this.j=j; } public boolean equals(Object o){ if (o instanceof B) return i==((B)o).i && j==((B)o).j; else return false; POO-L3 H. Fauconnier

Suite B d=new B(1,2); B e=new B(1,2); B f=e; if (d==e) System.out.println("e==d"); else System.out.println("d!=e"); if (d.equals(e)) System.out.println("d equals e"); System.out.println("a not equals b"); System.out.println("Objet d: "+d.toString()); System.out.println("Objet e: "+e.toString()); System.out.println("d.hashCode()"+d.hashCode()); System.out.println("e.hashCode()"+e.hashCode()); d!=e d equals e Objet d: B@182f0db Objet e: B@192d342 d.hashCode()25358555 e.hashCode()26399554 POO-L3 H. Fauconnier

Résultat: d!=e d equals e Objet d: B@182f0db Objet e: B@192d342 d.hashCode()25358555 e.hashCode()26399554 POO-L3 H. Fauconnier

Interfaces, classes imbriquées, Object Chapitre IV Interfaces, classes imbriquées, Object

Chapitre IV Interfaces Classes imbriquées Objets, clonage POO-L3 H. Fauconnier

classes abstraites abstract class Benchmark{ abstract void benchmark(); public final long repeat(int c){ long start =System.nanoTime(); for(int i=0;i<c;i++) benchmark(); return (System.nanoTime() -start); } class MonBenchmark extends Benchmark{ void benchmark(){ public static long mesurer(int i){ return new MonBenchmark().repeat(i); POO-L3 H. Fauconnier

suite Résultat: temps=6981893 public static void main(String[] st){ System.out.println("temps="+ MonBenchmark.mesurer(1000000)); } Résultat: temps=6981893 POO-L3 H. Fauconnier

Interfaces Il n'y a pas d'héritage multiple en Java: une classe ne peut être l'extension que d'une seule classe Par contre une classe peut implémenter plusieurs interfaces (et être l'extension d'une seule classe) Une interface ne contient (essentiellement) que des déclarations de méthodes Une interface est un peu comme une classe sans données membres et dont toutes les méthodes seraient abstraites POO-L3 H. Fauconnier

Héritage "multiple" en java POO-L3 H. Fauconnier

Exemple: interface Comparable<T>{ int compareTo(T obj); } class Couple implements Comparable<Couple>{ int x,y; // public int compareTo(Couple c){ if(x<c.x)return 1; else if (c.x==x) if (c.y==y)return 0; return -1; POO-L3 H. Fauconnier

Remarques… Pourquoi, a priori, l'héritage multiple est plus difficile à implémenter que l'héritage simple? Pourquoi, a priori, implémenter plusieurs interfaces ne pose pas (trop) de problèmes? (Comment ferait-on dans un langage comme le C?) POO-L3 H. Fauconnier

Quelques interfaces… Cloneable: est une interface vide(!) un objet qui l'implémente peut redéfinir la méthode clone Comparable: est une interface qui permet de comparer les éléments (méthode compareTo) runnable: permet de définir des "threads" Serializable: un objet qui l'implémente peut être "sérialisé" = converti en une suite d'octets pour être sauvegarder. POO-L3 H. Fauconnier

Déclarations une interface peut déclarer: des constantes (toutes les variables déclarées sont static public et final) des méthodes (elles sont implicitement abstract) des classes internes et des interfaces POO-L3 H. Fauconnier