L3 MIASHS. INF F5 Héritage.

Documents pareils
Polymorphisme, la classe Object, les package et la visibilité en Java... 1

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

Héritage presque multiple en Java (1/2)

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

Objets et Programmation. origine des langages orientés-objet

Généralités sur le Langage Java et éléments syntaxiques.

Programmation par les Objets en Java

Langage et Concepts de Programmation Objet. 1 Attributs et Méthodes d instance ou de classe. Travaux Dirigés no2

P r ob lé m a t iq u e d e la g é n é r icit é. Pr in cip e d e la g é n é r icit é e n Ja v a ( 1 /3 )

TP1 : Initiation à Java et Eclipse

2 e édition JAVA 5 et 6. Jérôme Bougeault. TSoft et Groupe Eyrolles, 2003, 2008, ISBN :

Programmer en JAVA. par Tama

TD/TP PAC - Programmation n 3

Diagramme de classes

Une introduction à Java

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Langage Java. Classe de première SI

TD/TP PAC - Programmation n 3

Initiation à JAVA et à la programmation objet.

Chapitre VI- La validation de la composition.

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

C++ COURS N 2 : CLASSES, DONNÉES ET FONCTIONS MEMBRES Classes et objets en C++ Membres d'une classe Spécification d'une classe Codage du comportement

Chapitre 10. Les interfaces Comparable et Comparator 1

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Projet de programmation (IK3) : TP n 1 Correction

Cours 1: Java et les objets

Java Licence Professionnelle CISII,

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

JAVA TD0. Prise en main du langage Environnement de base JAVA 1

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Généralités. javadoc. Format des commentaires. Format des commentaires. Caractères spéciaux. Insérer du code

Support de cours et TD Programmation Orientée Objet

Aide mémoire UML & Java 1ère partie : Introduction. marc.lemaire@u-cergy.fr

Programmation Orientée Objet application au langage Java Version Novembre 2007

Introduction à l héritage en C++

Page 1 sur 5 TP3. Thèmes du TP : l la classe Object. l Vector<T> l tutorial Interfaces. l Stack<T>

Info0604 Programmation multi-threadée. Cours 5. Programmation multi-threadée en Java

Apprendre la Programmation Orientée Objet avec le langage Java (avec exercices pratiques et corrigés)

Programmation Orientée Objet en C#

Bases Java - Eclipse / Netbeans

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

4. Groupement d objets

PROGRAMMATION PAR OBJETS

Facultés Universitaires Notre-Dame de la Paix. Conception et Programmation Orientées- Object

Chapitre 2. Classes et objets

Auto-évaluation Programmation en Java

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Programmation. fonctionnelle, impérative, logique et orientée objet

C++ Programmer. en langage. 8 e édition. Avec une intro aux design patterns et une annexe sur la norme C++11. Claude Delannoy

INITIATION AU LANGAGE JAVA

RMI le langage Java XII-1 JMF

Introduction au langage C

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Lambda! Rémi Forax Univ Paris-Est Marne-la-Vallée

basée sur le cours de Bertrand Legal, maître de conférences à l ENSEIRB Olivier Augereau Formation UML

Programmation Objet II

CPR Informatique. (poste 3159 ou 3164) Septembre 2002

Programmation en Java IUT GEII (MC-II1) 1

F. Barthélemy. 17 mai 2005

UML. Diagrammes de classes (suite) Delphine Longuet.

ACTIVITÉ DE PROGRAMMATION

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Chapitre V. Les classes : Object, Vector, etc.

Machines virtuelles fonctionnelles (suite) Compilation ML Java

et Programmation Objet

2. Comprendre les définitions de classes

Plan Pédagogique du cours

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

1 Définition d une classe en Java

Programmation Par Objets

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Utiliser Java sans BlueJ

Tp 1 correction. Structures de données (IF2)

Java c est quoi? Java pourquoi?

JAVA 8. JAVA 8 - Les fondamentaux du langage. Les fondamentaux du langage Java. Avec exercices pratiques et corrigés JAVA 8 29,90.

Programmation avec des objets : Cours 7. Menu du jour

Java 1.5 : principales nouveautés

Cours 14 Les fichiers

Le langage C++ est un langage de programmation puissant, polyvalent, on serait presque tenté de dire universel, massivement utilisé dans l'industrie

Généricité. en Java. (polymorphisme paramétrique) Philippe GENOUD UJF Janvier

Université de Bangui. Modélisons en UML

Polycopié Cours Programmation Orientée Objet sous Java Programme : Filière SMI S5

Présentation. Au programme. Fonctionnement. A l issue de ce module vous devriez...

Java 7 Les fondamentaux du langage Java

as Architecture des Systèmes d Information

Classes et Objets en Ocaml.

Premiers Pas en Programmation Objet : les Classes et les Objets

Plan. Exemple: Application bancaire. Introduction. OCL Object Constraint Language Le langage de contraintes d'uml

Algorithmique et Programmation, IMA

INF2015 Développement de logiciels dans un environnement Agile. Examen intra 20 février :30 à 20:30

Classe Interne, Anonyme & Enumération

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Introduction au langage Java

LANGAGUE JAVA. Public Développeurs souhaitant étendre leur panel de langages de programmation

ALGORITHMIQUE ET PROGRAMMATION ORIENTEE OBJET

Transcription:

L3 MIASHS INF F5 Héritage Daniel.Bardou@upmf-grenoble.fr

Sommaire Définitions Constructeurs et héritage Pseudo-variables Ajout d'attributs Ajouts et redéfinitions de méthodes Polymorphisme d'inclusion Modificateur final Modificateur abstract INF F5 2

Définitions INF F5 3

Héritage L'héritage est un mécanisme fondamental des langages de programmation par objets. Il permet d'obtenir, à partir de descriptions d'objets déjà existantes, de nouvelles descriptions d'objets plus spécifiques. En Java, l'héritage est spécifié entre classes et ce sont les propriétés d'instance (attributs et méthodes) qui sont héritées d'une classe à l'autre. INF F5 4

Super-classe et sous-classe Si la classe B hérite de la classe A, alors on dit que A est super-classe de B, B est une sous-classe de A. B hérite de A : les attributs (d'instance et de classe), les méthodes (d'instance et de classe). B n'hérite pas de A : les constructeurs, les blocs static. INF F5 5

Syntaxe En Java, l'héritage est spécifié en utilisant le mot réservé extends. Exemple : public class B extends A { // la classe B hérite de la classe A // INF F5 6

Héritage simple En Java, l'héritage est simple : toute classe admet une et une seule super-classe directe. La définition : public class A { // équivaut à : public class A extends Object { // INF F5 7

La classe Object Object est la racine de la hiérarchie d'héritage en Java : toute classe hérite (directement ou indirectement) de Object. Object détient des définitions de méthodes exécutables sur tout objet Java, notamment : public boolean equals(object obj) public String tostring() public Class getclass() INF F5 8

Modificateur protected Dans une classe, le modificateur de visibilité protected permet de rendre visible un attribut ou une méthode depuis les sous-classes. protected est une visibilité plus ouverte que l'accès «paquetage» : les sous-classes peuvent être définies dans des paquetages différents. La bonne pratique reste d'utiliser private au maximum pour les attributs. INF F5 9

Héritage et constructeurs INF F5 10

Ordre d'exécution des constructeurs À l'instanciation d'une classe, l'initialisation de la partie héritée de l'instance doit être effectuée avant celle de la partie localement définie. Un constructeur de la super-classe doit donc toujours être exécuté avant l'exécution d'un constructeur de la classe. Les constructeurs sont donc exécutés dans l'ordre des classes les plus générales aux plus spécifiques. INF F5 11

Exemple public class Point { private double x, y; public Point() { this(0, 0); public Point(double abs, double ord) { x = abs; y = ord; INF F5 12

Exemple public class Point3D extends Point { private double z; public Point3D() { this(0, 0, 0); public Point3D(double x, double y, double z) { super(x, y); // appel «super-constructeur» this.z = z; INF F5 13

Première instruction de constructeur La première instruction d'un constructeur est toujours l'appel d'un constructeur de la superclasse en utilisant la syntaxe super(...), ou l'appel d'un autre constructeur de la classe en utilisant la syntaxe this(...). Si rien n'est indiqué, le compilateur Java considère par défaut un appel au constructeur sans paramètre de la super-classe, soit super(). INF F5 14

Exemple public class A { protected int a; public class B extends A { public A(int val) { a = val; public B(int val) { a = val; Erreur de compilation : constructeur A() non défini! INF F5 15

Pseudo-variables INF F5 16

Pseudo-variables Il existe 2 pseudo-variables que l'on peut utiliser dans les méthodes d'une classe : this référence l'instance courante, super référence l'instance courante limitée à sa partie héritée. this et super sont appelées pseudo-variables car : leur valeur change selon le contexte, on ne peut pas modifier leur valeur explicitement. INF F5 17

Ajout d'attributs INF F5 18

Ajout d'attributs Il est fréquent de définir de nouveaux attributs dans une sous-classe qui viennent compléter ceux hérités de la super-classe. Par exemple, on a défini un attribut z dans la classe Point3D pour compléter les attributs x et y définis dans la classe Point et hérités par Point3D. Chaque instance de la sous-classe détient sa propre valeur pour chaque attribut localement défini et chaque attribut hérité. INF F5 19

Ajout d'attributs homonymes Il est possible, mais fortement déconseillé (ce n'est souvent fait que par erreur), de définir dans une classe des attributs de même nom que ceux hérités. (Mauvais) Exemple : public class Point3D extends Point { private double x; // pas d'erreur de compilation! INF F5 20

Ajout et redéfinitions de méthodes INF F5 21

Ajout et rédéfinitions de méthodes Il est possible de définir de nouvelles méthodes dans une sous-classe. Il est également possible de donner une nouvelle définition d'une méthode héritée. Il n'est pas possible de changer la signature d'une méthode héritée en la redéfinissant. INF F5 22

Exemple public class Point{ private double x, y; public String tostring() { /* redéfinition de tostring() héritée de Object */ return "(" + x + ", " + y + ")" ; INF F5 23

Autre Exemple public class Point3D extends Point{ private double z; public String tostring() { // redéfinition avec appel sur super String s = super.tostring(); int l = s.length(); return s.substring(0, l 1) + ", " + z + ")"; INF F5 24

Polymorphisme d'inclusion INF F5 25

Polymorphisme Polymorphisme ad-hoc : plusieurs méthodes peuvent être définies sur plusieurs classes (éventuellement sans héritage) et conduirent à des exécutions différentes. Polymorphisme d'inclusion : on peut utiliser une instance d'une sous-classe d'une classe C en lieu et place d'une instance de C. Toute sous-classe de C définit au moins le même comportement pour ses instances sous éventuellement une forme plus spécifique. extends peut être assimilé à «est-un» INF F5 26

Exemple 1 Point p = new Point(); Point3D p3d = new Point3D(); p = p3d; // Ok p3d = p; // Erreur de compilation p3d = (Point3D) p; // Ok INF F5 27

Exemple 2 Point p = new Point(); Point3D p3d = new Point3D(); Point[] t = new Point[2]; t[0] = p; t[1] = p3d; for (int i = 0; i < t.length; i ++) System.out.println(t[i].toString()); // affiche sur la console : // (0, 0) // (0, 0, 0) INF F5 28

Polymorphisme et typage Une référence sur un objet dans un programme a : un type déclaré, c'est le type donné à la déclaration de la référence, sur lequel le compilateur fait des vérifications, un type réel (ou précis), c'est le type de l'objet référencé (la classe dont il est instance directe), potentiellement beaucoup d'autres types en relation d'héritage avec le type déclaré et le type réel. INF F5 29

Opérateur instanceof L'opérateur instanceof permet de savoir si une référence possède un type donné. Exemple Object obj = new Point3D(); Point p = new Point(); System.out.println(obj instanceof Point); // affiche true System.out.println(obj instanceof Object); // true System.out.println(obj instanceof Point3D); // true System.out.println(obj instanceof String); // false System.out.println(p instanceof Point3D); // false System.out.println(p instanceof String); // Erreur INF F5 30

Constructeur par défaut Si aucune définition de constructeur n'est donnée dans une classe. Java considère qu'il existe un constructeur sans paramètres qui ne fait aucune initialisation particulière. Par exemple, les 2 définitions de classe ci-dessous sont équivalentes. public class X { private int i; public class X { private int i; public X() { INF F5 31

Modificateur final INF F5 32

Modificateur final Le modificateur final permet de limiter l'héritage : une classe final ne peut pas avoir de sousclasses, une méthode final ne peut pas être redéfinie dans une sous-classe, pour rappel, une variable ou un attribut final est une constante. INF F5 33

Intérêt de final Pour une classe (sécurité essentiellement) : impossibilité de rentrer dans la sphère de visibilité protected en définissant une classe caduque, impossibilité de substituer des instances d'un autre type réel. Pour une méthode : sécurité, impossibilité de redéfinir et «dénaturer le comportement», efficacité, génération de code «inline». INF F5 34

Modificateur abstract INF F5 35

Utilisation de l'héritage On peut utiliser l'héritage selon 2 axes complémentaires : pour réutiliser des définitions existantes en créant de nouvelles sous-classes à des classes existantes, pour factoriser du code commun à plusieurs classes en leur créant une super-classe commune et en y plaçant ce code (cela évite la redondance du code et en facilite la correction et l'évolution). L'ensemble des définitions factorisées dans une super-classe n'est pas toujours «suffisamment complet» pour constituer la définition d'objets «viables», on a donc introduit dans les langages de programmation par objets la notion de classe abstraite. INF F5 36

Classe abstraite Une classe abstraite est une classe pour laquelle il est interdit d'avoir des instances directes. Sa définition est introduite avec le modificateur abstract Les classes abstraites sont utiles pour la factorisation de définitions devant être héritées par plusieurs sous-classes, pour définir des «classes bibliothèques» de programmes qui ne contiennent que des méthodes de classe (la classe Math par exemple). INF F5 37

Classe abstraite Exemple : public abstract class C { // public C() { // // Erreur de compilation si new C() apparaît dans un programme. INF F5 38

Méthode abstraite Une méthode abstraite est une méthode pour laquelle la définition se limite à son entête (visibilité, type de retour et signature). Sa définition est introduite avec le modificateur abstract Détenir (localement ou par héritage) une méthode abstraite est une condition suffisante (mais non nécessaire) pour qu'une classe soit abstraite. INF F5 39

Exemple (1/3) public abstract class Forme { private Point pointref; public Forme(Point p) { pointref = p; public abstract double perimetre(); public abstract double surface(); public void deplacer(double dx, double dy) { pointref.setx(pointref.getx() + dx); pointref.sety(pointref.gety() + dy); INF F5 40

Exemple (2/3) public class Disque extends Forme { // pointref hérité correspond au centre du disque private double rayon; public Disque(Point centre, double rayon) { super(centre); this.rayon = rayon; public double perimetre() { return 2 * Math.PI * rayon; public double surface() { return Math.PI * rayon * rayon; INF F5 41

Exemple (3/3) public class Rectangle extends Forme { // pointref hérité correspond au coin supérieur gauche private double hauteur, largeur; public Rectangle(Point coin, double hauteur, double largeur) { super(coin); this.hauteur = hauteur; this.largeur = largeur; public double perimetre() { return 2 * (hauteur + largeur); public double surface() { return hauteur * largeur; INF F5 42