Sommaire Introduction Concepts de la POO Objet classe
Sommaire • Introduction • Concepts de la POO – Objet , classe, encapsulation, héritage, etc. • Langage Java – Introduction – Syntaxe de Java – Objets et Classes – Relations entre classe : Héritage et polymorphisme – Interfaces graphiques : AWT – Les indispensables : Collections, exceptions. – Les entrées sorties – Les threads – Les applets
Les classes et les objets en Java • La classe ü Définition ü Déclaration ü Variables et méthodes de classe • Méthode ü ü • Définition Déclaration Mode de passage des paramètres Surcharge de méthode Manipulation des objets ü ü Création (Constructeur) Accès aux attributs d’un objet Accès aux méthodes d’un objet Opérteur instance. Of et l’autoréférence this ü Destruction d’objets • L’encapsulation ü Contrôle d’accès
L’approche objet • Un objet informatique – maintient son état dans des variables (appelées champs) – implémente son comportement à l'aide de méthodes objet informatique = regroupement logiciel de variables et de méthodes • Cycle de vie d’un objet 1. Construction (en mémoire) 2. Utilisation (changements d’état par affectations, comportements par exécution de méthodes) 3. Destruction
La classe (1) : définition • Classe : description d’une famille d’objets ayant une même structure et un même comportement. Elle est caractérisée par : – Un nom – Une composante statique : des champs (ou attributs) nommés ayant une valeur pour chaque objet de la classe. Ils caractérisent l’état des objets pendant l’exécution du programme – Une composante dynamique : des méthodes représentant le comportement des objets de cette classe. Elles manipulent les champs des objets et caractérisent les actions pouvant être effectuées par les objets.
La classe (2) : représentation graphique Point Abscisse Nom de la classe Champs Etudiant nom cycle Ordonnée get. Nom() translate () distance() getcycle() Méthodes set. Nom() setcycle()
Déclaration d’une classe Ø Le nom de la classe est spécifié derrière le mot clé « class » Ø Le corps de la classe est délimité par des accolades {} Ø On définit dans le corps les attributs et les méthodes qui constituent la classe Modificateurs class Nomclasse{ < corps de la classe > } Modificateur Rôle abstract la classe contient une ou des méthodes abstraites, qui n'ont pas de définition explicite. Une classe déclarée abstract ne peut pas être instanciée : il faut définir une classe qui hérite de cette classe et qui implémente les méthodes nécessaires pour ne plus être abstraite. final la classe ne peut pas être modifiée, sa redéfinition grâce à l'héritage est interdite. Les classes déclarées final ne peuvent donc pas avoir de classes filles. private la classe n'est accessible qu'à partir du fichier où elle est définie public La classe est accessible partout par défaut : package friendly Il n'existe pas de mot clé pour définir ce niveau, qui est le niveau par défaut lorsqu'aucun modificateur n'est précisé. Cette déclaration permet à une classe d'être visible par toutes les classes se trouvant dans le même package.
Syntaxe de définition d’une classe Exemple : Une classe définissant un point public Class Point { Nom de la Classe double x; // abscisse du point Attributs double y; // ordonnée du point // translate de point de (dx, dy) void translate (double dx, double dy) { x = x+dx; y = y+dy; Méthodes } // calcule la distance du point à l’origine double distance() { return Math. sqrt(x*x+y*y); } }
Conventions pour les identificateurs • Classes : tous les mots commencent par une lettre majuscule exemple: Point, Personne, Etudiant, System, etc. • Variables : comme pour les classes, mais le premier mot commence par une lettre minuscule (ex : nom, point 1) • Constantes : en majuscule avec les mots séparés par le caractère souligné (ex. : UNE_CONSTANTE) • Méthodes : comme pour les variables, mais le premier mot est un verbe (ex. : afficher. Somme, calculer. Prix)
Notion de méthodes et de paramètres (1) La notion de méthodes dans les langages objets Ø Proches de la notion de procédure ou de fonction dans les langages procéduraux. Ø La méthode c’est avant tout le regroupement d’un ensemble d’instructions Ø Comme pour les procédures ou les fonctions (au sens mathématiques) on peut passer des paramètres aux méthodes et ces dernières peuvent renvoyer des valeurs (grâce au mot clé return).
Notion de méthodes et de paramètres (2) exemple : public, Static, private type de la valeur renvoyée ou void couples d'un type et d'un identificateur séparés par des « , » <modificateur> <type-retour> <nom. Méthode> (<liste-param>) {<bloc>} public double add (double number 1, double number 2) { return (number 1 +number 2); } Notre méthode retourne ici une valeur
Mode de passage des paramètres Ø Java n'implémente qu'un seul mode de passage des paramètres à une méthode : le passage par valeur. Ø Conséquences : – l'argument passé à une méthode ne peut être modifié, – si l'argument est une instance, c'est sa référence qui est passée par valeur. Ainsi, le contenu de l'objet peut être modifié, mais pas la référence elle -même.
Surcharge de méthodes (1) • Dans une même classe, plusieurs méthodes peuvent posséder le même nom, pourvu qu'elles diffèrent en nombre et/ou type de paramètres. – On parle de surdéfinition ou surcharge, on encore en anglais d’overloading en anglais. – Le choix de la méthode à utiliser est en fonction des paramètres passés à l'appel. • Ce choix est réalisé de façon statique (c'est-à-dire à la compilation). – Très souvent les constructeurs sont surchargés (plusieurs constructeurs prenant des paramètres différents et initialisant de manières différentes les objets)
Surcharge de méthodes (2) Class addition { public double add (double number 1, double number 2) { return (number 1 +number 2); } La méthode add est surchargée public double add (double number 1, double number 2, double number 3 ) { return (number 1 +number 2+ number 3); } }
Méthodes particulières Méthodes Rôle Constructeur Un constructeur est une méthode qui permet l’instanciation des objets à partir d’une classe et l’initialisation des champs de ces objets. Un constructeur a le même nom que la classe et sans type de retour. Méthodes qui retourne l’état d’un objet (certains champs) qui sont généralement privés. La notation utilisée est get. XXX ; XXX le champs retourné Méthodes qui modifie l’état d’un objet (certains champs). La notation utilisée est set. XXX ; XXX le champs modifié Méthodes d’accès (getter) Méthodes de modification (setter) Class Point { double x; // abscisse du double y; // ordonnée du // constructeur Point (){ x=0; y=0; } // méthode qui permet de double get. Y() { return y; } // méthode qui permet de void set. Y(double dy) { y=dy; } } point retourner la valeur de y modifier la valeur de y
L’instanciation (1) Ø Instanciation : concrétisation d’une classe en un objet « concret » . – Dans nos programmes Java nous allons définir des classes et instancier ces classes en des objets qui vont interagir. Le fonctionnement du programme résultera de l’interaction entre ces objets « instanciés » . – En Programmation Orientée Objet, on décrit des classes et l’application en elle-même va être constituée des objets instanciés, à partir de ces classes, qui vont communiquer et agir les uns sur les autres. • Instance – représentant physique d'une classe – obtenu par moulage du dictionnaire des variables et détenant les valeurs de ces variables. – Son comportement est défini par les méthodes de sa classe – Par abus de langage « instance » = « objet »
L’instanciation (2) Yanis: Etudiant nom= " H. Yanis "; cycle= "Licence "; Etudiant get. Nom() getcycle() nom set. Nom() cycle setcycle() get. Nom() get. Prénom Lydia: Etudiant set. Nom nom= " H. Lydia "; Set prénom cycle= "Doctorat "; get. Nom() getcycle() set. Nom() setcycle() Classe Objets (instances)
Les constructeurs (1) • L'appel de new pour créer un nouvel objet déclenche, dans l'ordre : – L'allocation mémoire nécessaire au stockage de ce nouvel objet et l'initialisation par défaut de ces attributs, – L'initialisation explicite des attributs, s'il y a lieu, – L'exécution d'un constructeur. • Un constructeur est une méthode d'initialisation. class Point { double x; // abscisse du point double y; // ordonnée du point // constructeur Point (double dx, double dy){ x=dx; y=dy; } public class Test. Point { public static void main(String args[]) { Point p 1 = new Point(3, 4) } } } P 1 3 4 x y
Les constructeurs (2) • Lorsque l'initialisation explicite n'est pas possible (par exemple lorsque la valeur initiale d'un attribut est demandée dynamiquement à l'utilisateur), il est possible de réaliser l'initialisation au travers d'un constructeur. • Le constructeur est une méthode : – de même nom que la classe, – sans type de retour. • Toute classe possède au moins un constructeur. Si le programmeur ne l'écrit pas, il en existe un par défaut, sans paramètres, de code vide.
Les constructeurs (3) Point. java public class Point { double x; // abscisse du point double y; // ordonnée du point // constructeur Point (double dx, double dy){ x=dx; y=dy; } } Va donner une erreur à la compilation Définition d’un constructeur. Le constructeur par défaut (Point()) n’existe plus. Le code suivant occasionnera une erreur Test. Point. java public class Test. Point { public static void main(String args[]) { point P 2= new Point(); //appel du //constructeur par défaut } }
Les constructeurs (4) • Pour une même classe, il peut y avoir plusieurs constructeurs, de signatures différentes (surcharge). • L'appel de ces constructeurs est réalisé avec le new auquel on fait passer les paramètres. – p 1 = new Point(6, 4); • Déclenchement du "bon" constructeur – Il se fait en fonction des paramètres passés lors de l'appel (nombre et types). C'est le mécanisme de "lookup". • Attention – Si le programmeur crée un constructeur (même si c'est un constructeur avec paramètres), le constructeur par défaut n'est plus disponible. Attention aux erreurs de compilation !
Les constructeurs (5) Point. java Test. Point. java public class Point { double x; // abscisse du point double y; // ordonnée du point // plusieurs constructeurs Redéfinition Point (){ d’un x=0; Constructeur y=0; sans } paramètres Point (double dx){ x=dx; y=0; } Point (double dx, double dy){ x=dx; y=dy; } public class Test. Point { public static void main(String args[]) { Point p 1= new Point() Point p 2=new Point(3); Point p 3=new Point(3, 4, 5); } } } Va donner une erreur à la compilation On définit plusieurs constructeurs qui se différencient uniquement par leurs paramètres (surcharge)
Résumé : Classe et objet en Java Objets Point double x; // abscisse du point double y; // ordonnée du point class Point { double x; double y; } Point p 1, p 2; p 1= new Point (); p 2= new Point (); L’opérateur d’instanciation en Java est new : Ma. Classe mon. Objet = new Ma. Classe(); En fait, new va réserver l’espace mémoire nécessaire pour créer l’objet « mon. Objet » de la classe « Ma. Classe » , et le constructeur Ma. Classe() initialise les attributs de l’objet crée.
Objets, tableaux, types de base • Lorsqu'une variable est d'un type objet ou tableau, ce n'est pas l'objet ou le tableau luimême qui est stocké dans la variable mais une référence vers cet objet ou ce tableau (on retrouve la notion d’adresse mémoire ou du pointeur en C). • Lorsqu'une variable est d'un type de base, la variable contient la valeur. Int a=0; // variable de type de base Int tab[]={4, 5, 6}; // tableau Point p 1=new Point(2, 5); // objet a tab P 1 0 4 5 6 tab[0] 2 5 x tab[1] tab[2] y
Opérateur instanceof • L'opérateur instanceof confère aux instances une capacité d'introspection : il permet de savoir si une instance est instance d'une classe donnée. – Renvoie une valeur booléenne if (. . . ) Personne nadine= new Etudiant(); else Personne nadine= new Employe(); Personne Employé Etudiant ? ? Nadine //. . . if (nadine instanceof Employe) // discuter affaires else // proposer un stage
L’autoréférence : this (1) • Le mot réservé this , utilisé dans une méthode, désigne la référence de l'instance à laquelle le message a été envoyée (donc celle sur laquelle la méthode est « exécutée » ). • Il est utilisé principalement : 1. Pour lever une ambiguïté, 2. Dans un constructeur, pour appeler un autre constructeur de la même classe.
L’autoréférence : this (2) class Point { private int x; private int y; Point(int x, int y) { this. x=x; this. y=y; } } public Point(int x, int y) { this. x=x; this. y=y; } Public Point(int y) { this(y, 0); } public Point() { this(0); } Pour lever l’ambiguïté sur les mots « x » et « y » et déterminer si c’est le «x/ y » du paramètre ou de l’attribut Appelle le constructeur point(int a, int b) Appelle le constructeur Point(int y)
Accès aux attributs d’un objet (1) Point. java public class Point { double x; // abscisse du point double y; // ordonnée du point // plusieurs constructeurs double get. X (){ return x } double get. Y (){ return y } void set. X(double dx){ x=dx; } void set. Y(double dy){ y=dy; } } Point double x; // abscisse du point double y; // ordonnée du point
Accès aux attributs d’un objet (2) Test. Point. java public class Application { public static void main(String args[]) { Point p 1 = new Point() p 1. x = 10 ; P 1. y = 20 ; } } Accès aux attributs x et y De l’objet p 1 Remarque : Contrairement aux variables, les attributs d'une classe, s'ils ne sont pas initialisés, se voient affecter automatiquement une valeur par défaut. Cette valeur vaut : 0 pour les variables numériques, false pour les booléens, et null pour les références.
Accès aux méthodes d’un objet Test. Point. java public class Application { public static void main(String args[]) { Point p 1 = new Point(); p 1. set. X ( 10) ; P 1. set. Y( 20); } } Accès au méthodes set. X et set. Y de l’objet p 1
L’encapsulation (1) • Notion d'encapsulation : – les données et les procédures qui les manipulent sont regroupées dans une même entité, l'objet. – Les détails d'implémentation sont cachés, le monde extérieur n'ayant accès aux données que par l'intermédiaire d'un ensemble d'opérations constituant l'interface de l'objet. – Le programmeur n'a pas à se soucier de la représentation physique des entités utilisées et peut raisonner en termes d'abstractions.
Contrôle d’accès (1) • Chaque attribut et chaque méthode d'une classe peut être : Modificateur public par défaut : package friendly Protected private Rôle Une variable, méthode ou classe déclarée public est visible par tous les autres objets. Il n'existe pas de mot clé pour définir ce niveau, qui est le niveau par défaut lorsqu'aucun modificateur n'est précisé. Cette déclaration permet à une entité (classe, méthode ou variable) d'être visible par toutes les classes se trouvant dans le même package. Si une méthode ou une variable est déclarée protected , seules méthodes présentes dans le même package que cette classe ou ses sous classes pourront y accéder. On ne peut pas qualifier une classe avec protected. C'est le niveau de protection le plus fort. Les composants ne sont visibles qu'à l'intérieur de la classe : ils ne peuvent être modifiés que par des méthodes définies dans la classe prévues à cet effet. Les méthodes déclarées private ne peuvent pas être en même temps déclarée abstract car elles ne peuvent pas être redéfinies dans les classes filles.
Contrôle d’accès (2) • En toute rigueur, il faudrait toujours que : – les attributs ne soient pas visibles, • Les attributs ne devraient pouvoir être lus ou modifiés que par l'intermédiaire de méthodes prenant en charge les vérifications et effets de bord éventuels. – les méthodes "utilitaires" ne soient pas visibles, – seules fonctionnalités de l'objet, destinées à être utilisées par d'autres objets soient visibles. – C’est la notion d’encapsulation
Point. java Contrôle d’accès (3) public class Point { private double x; // abscisse private double y; // ordonnée // plusieurs constructeurs double get. X (){ return x } double get. Y(){ return y } void set. X(double dx){ x=dx; } void set. Ydouble dy){ y=dy; } void affiche() System. out. println(“abscisse est: “+ x + ordonnée est : “+y); } Test. Point. java public class Test. Point { public static void main(String args[]) { Point p 1 = new Point(); p 1. x = 5; // Invalide car l'attribut est privé p 1. set. X= 4; // OK p 1. affiche( ); // OK } }
Variables de classe (1) • Il peut s'avérer nécessaire de définir un attribut dont la valeur soit partagée par toutes les instances d'une classe. On parle de variable de classe. • Ces variables sont, de plus, stockées une seule fois, pour toutes les instances d'une classe. • Mot réservé : static • Accès : – depuis une méthode de la classe comme pour tout autre attribut, – via une instance de la classe, – à l'aide du nom de la classe.
Variables de classe (2) Point. java public class Point { public static int compteur = 0; public Point() { // compter le nombre d’instance compteur++; } } public class Test. Point { public static void main(String args[]) { Int a; Point p 1 = new Point(3, 4); Point p 2 = new Point(5, 6); a=Point. compteur; System. out. println(“le nombre de points créés est : “+ a); } } Variable de classe Utilisation de la variable de classe compteur dans le constructeur de la classe Utilisation de la variable de classe compteur dans une autre classe P 1 3 4 x y P 2 5 6 x y 2 1 Compteur
Méthodes de classe (1) • Il peut être nécessaire de disposer d'une méthode qui puisse être appelée sans instance de la classe. C'est une méthode de classe. • On utilise là aussi le mot réservé static • Puisqu'une méthode de classe peut être appelée sans même qu'il n'existe d'instance, une méthode de classe ne peut pas accéder à des attributs non statiques. Elle ne peut accéder qu'à ses propres variables et à des variables de classe.
Méthodes de classe (2) Point. java Test. Point. java public class Point { private double x, y; private static int compteur = 0; public class Test. Point { Int b; public static void main(String args[]) { Int a; Point p 1 = new Point(); Point p 2 = new Point(); a=Point. Nb_Point(); System. out. println(“le nombre de points créés est : “+ a); b=a; // erreur une méthode static (main)ne peut accéder à un attribut non statique } } public Point() { // compter le nombre d’instance compteur++; } public static int Nb_Point() { return compteur ; } } Math. sqrt(x); String. value. Of (i); Autres exemples de méthodes de classe courantes
Destruction d’objets (1) • Java n'a pas repris à son compte la notion de destructeur telle qu’elle existe en C++ par exemple. • C'est le ramasse-miettes (ou Garbage Collector - GC en anglais) qui s'occupe de collecter les objets qui ne sont plus référencés. • Le ramasse-miettes fonctionne en permanence dans un thread de faible priorité (en « tâche de fond » ). Il est basé sur le principe du compteur de références.
Destruction d’objets (2) • Il est possible au programmeur d'indiquer ce qu'il faut faire juste avant de détruire un objet. • C'est le but de la méthode finalize()de l'objet. • Cette méthode est utile, par exemple, pour : – fermer une base de données, – fermer un fichier, – couper une connexion réseau, – etc.
Destruction d’objets (3) Point. java public class Point { private double x, y; private static int compteur = 0; public Point() { // compter le nombre d’instance compteur++; } public static int Nb_Point() { return compteur ; } protected void finalize() { compteur--; } } Test. Point. java public class Test. Point { Int b; public static void main(String args[]) { Int a; Point p 1 = new Point(); Point p 2 = new Point(); a=Point. Nb_Point(); System. out. println(“le nombre de points créés est : “+ a); System. out. println("le nombre de points "+a); p 3. finalize(); p 3=null; System. gc(); // appel explicite du Garbage collector a=Point. nombre(); System. out. println("le nombre de points "+a); } }
- Slides: 40