Académique Documents
Professionnel Documents
Culture Documents
Partie II
Les concepts Objet en Java
http://gherabi.zz.mu
Partie OO
2
Notion d’objet
3
Notion d’objet
4
Notion de classe
5
Classe
voiture v:
v=NULL
20
Constructeur de « Voiture »
25
Destructeur
❚ ramasse miette :
❙ Récupère automatiquement la mémoire des objets devenus inutiles et appelle la
méthode finalize
❙ On ne sait pas quand il est appelé : on ne sait donc pas quand est utilisé le
destructeur
❚ Objets inutiles :
❘objets réels alloués qui ne sont plus utilisés
❘Difficile à trouver ==> quand un objet est inutile, pour qu’il puisse être
détruit, mettre sa référence à null
26
Les classes en JAVA
q La classe définit la structure des objets
q Les champs
q les méthodes utilisables par un objet de ce type, i.e. les actions qu’un objet
de ce type peut réaliser
q Syntaxe
[public] class Nom_de_ma_classe {
// déclaration des champs;
[public, private] type nom_champ;
//déclaration de methodes;
[public, private] type_retour nom_de_fonction(type nom_parametre, …)
}
q En pratique, le nom d’une classe commence par une majuscule
q Le nom du fichier est celui de la classe contenant la fonction main ou celui de la
classe public
27
Les objets et les variables
en JAVA
Ø Un objet = un exemple ou une entité dont le modèle (type) est une classe
Ø On dit aussi une instance de classe.
Ø La variable est une référence (pointeur constant) sur cet objet
Ø En Java, 3 étapes
Ø Définition de la variable : Point p1;
ØSa durée de vie est celle du bloc
Ø Création et allocation de l’objet : p1= new Point(2,8);
ØSa durée de vie est celle de son utilisation
ØElle est détruite AUTOMATIQUEMENT quand elle est devenue inutile
Ø Utilisation du point p1 :
Øpar exemple, appliquer affiche() à p1 : p1.affiche()
Øou changer la valeur de l’abscisse : p1.x=10;
Ø Donc
❚ En java, une variable est une référence, i.e. un pointeur "masqué"
❚ Le passage d’un objet comme paramètre d’une fonction permet de modifier
cet objet : pas besoin de passage de l’adresse
❚ Pas de pointeur, de gestion mémoire par le programmeur
28
Concept d'objet : exemple
public class Ex2 {
public static void main (String[] args){
System.out.println("Premier exemple");
Point p1=null, p2=null; // Définition p1, p2
p2 = new Point(20,80); `
p2.affiche(); p1
20
p2
p1.x = p1.x + 20; p1.y += 80; 80
p1.affiche();
p1
p2=null; // l’objet pointé par p2 est libre
} // les variables p2 et p1 sont détruites
}
p1.affiche()
p2.affiche()
p1.affiche()
29
Notion d’objet
30
Accès aux membres
q Accès aux membres d’un objet : objet.champ
❙ Attention, objet est une référence
❙ Exemple : a.x est l’abscisse du point a.
q Appeler/exécuter une méthode : objetappelant.methode(param);
❙ Cela signifie que l’on exécute methode(parametres) « SUR » objetappelant
❙ Les méthodes s’exécutent sur un objet
❙ p.affiche() signifie
❘On cherche la classe de p : c’est la classe Point
❘On cherche si une méthode affiche() existe dans la classe Point :
•si elle n’existe pas, erreur de compilation « Cannot find Symbol »
❘On exécute cette fonction avec un paramètre supplémentaire invisible :this, qui est l’objet
sur lequel on travaille = objet appelant. Ici, this = p
public void translate(double a, double b) {
x = x + a; y = y + b;
}
Si on appelle translate avec le point p sous la forme p.translate(2,3), p.x et p.y qui sont
incrémentés de 2 et 3
31
Paramètre this
❚ Dans une méthode, il y a toujours un paramètre « implicite »
this, qui est l’objet sur lequel on travaille
❙ p.translate(1,2) ==> this est une référence sur p
❚ Donc
public void translate(double a, double y) { ATTENTION !!!!!
x = x + a; y = y + y;
}
// Quand on écrit y, est ce le paramètre de la fonction ou l’attribut de p ?
32
Paramètre this
Sécurité
36
Accès et protection
Encapsulation
Surcharge de méthodes
40
Surcharge ou
Polymorphisme de méthodes
41
Surcharge ou
Polymorphisme de méthodes
class Point { private double x, y;
/* Constructeur */
public Point (double a, double b) {x = a; y = b; }
public Point (Point a) {x = a.x; y = a.y; }
class Point { ……
public String toString() {return("abscisse:"+x+" ordonnée:"+y);}
// Avec cette methode, on peut afficher point avec System.out.println(a)
public boolean equals(Point b) {return( x==b.x && y==b.y); }
};
public class Ex5 {
public static void main (String []arg) {
Point a,b,c,d;
a= new Point(1,2); b = new Point(1,2); c=new Point(1,3); d=a;
System.out.println(a);// Affiche a
if (a==b) System.out.println("a et b pointe le même objet");
if (a==d) System.out.println("a et d pointe le même objet");
if (a.equals(b)) System.out.println("a et b de contenu identique");
if (a.equals(c)) System.out.println("a et c de contenu identique");
if (a.equals(d)) System.out.println("a et d de contenu identique");
}
}
44
Résumé
q Un programme objet :
❙ 1 fonction main qui démarre le programme, crée les objets et les
enchainements d’actions
❙ 1 ensemble de classes décrivant les capacités des données manipulées
q 1 classe : type de données qui rassemble des données (champs) et la manière
de s’en servir (méthodes)
❙ Données et méthodes protégées si besoin :
❘public : n’importe quelle fonction du programme peut les modifier ou
les utiliser
❘private : seules les méthodes de la classe concernée peuvent les modifier
ou les utiliser
45
Résumé
❙ Constructeurs : comment initialiser l’objet ?
❙ Surcharge : plusieurs fonctions peuvent avoir le même nom, mais pas les
mêmes nombres et/ou types de paramètres
q 1 objet : une instance
❙ Définir la variable
❙ Créer l’objet
❙ Destruction de l’objet automatique quand on n’en a plus besoin : pas de
gestion mémoire ni pointeurs
❙ Exécuter une méthode ou fonction : objet.méthode (parametres);
46
Tableaux et tableaux d’objets
Tableaux
Tableau de 10 éléments
import java.util.*;
public class Ex6 {
public static void main(String[] arg) {
int [] tableau;
Scanner clavier = new Scanner (System.in);
System.out.println("Nombre d'element du tableau ?");
int nb = clavier.nextInt();
ab (a puissance b) Math.pow ( )
La classe String dispose d'un grand nombre de méthodes pour traiter les
chaînes de caractères.
♣La méthode length() permet de connaître la longueur d'une chaîne
de caractères (nombre de caractères).
♣La méthode charAt() permet de retrouver le caractère situé à la
position n d'une chaîne
♣La méthode substring() retourne une sous-chaîne d'une chaîne
donnée. Les paramètres déterminent la position initiale et la position
finale (+1) de la sous-chaîne dans la chaîne originelle.
Héritage simple
Héritage
Ø L’héritage permet de réutiliser ce qui a déjà été fait très simplement
❙ La nouvelle classe (fille) hérite d’une classe existante (Mère)
❙ Elle possède les mêmes champs et les mêmes méthodes
❙ On peut ajouter de nouveaux champs et de nouvelles méthodes
Ø L’héritage est récursif : une classe dérivée peut devenir classe de base
Ø Les liens hiérarchiques forment un arbre : l’arbre d’héritage
Héritage : Syntaxe
Ø En Java, chaque classe que l'on crée possède une classe parente.
Ø Si l'on ne définit pas explicitement une classe parente (avec extends),
la super-classe par défaut est Object (qui est déclarée dans le
paquetage java.lang).
Ø La classe Object est donc l'ancêtre de toutes les classes Java (c'est la
racine unique de l'arbre des classes).
Ø La classe Object est la seule classe Java qui ne possède pas de classe
parente.
Ø Toutes les classes héritent donc des méthodes de la classe Object (par
exemple toString(), equals(), finalize(), etc).
q Pour empêcher n’importe quel utilisateur de modifier les champs protected, il faut
interdire l’héritage
q La classe truand ne peut plus hériter de PointCouleur
class Point {
protected double x, double y;
….
}
final class PointCouleur extends Point { final ==pour interdire l héritage
/* Definition des champs d'un point couleur ; on a déjà x et y */
protected int couleur;
………….
};
class Truand extends PointCouleur { // Interdit car classe PointCouleur est final
public void setx(double a) { x=a; }
}
public class Ex17b {
public static void main (String []arg) {PointCouleur a,b; Truand c;
….
}
}
Champs hérités
Ø Un objet possède tous les champs de sa classe et de sa classe mère, de grand-mère…
Ø Le nom est comme précédemment : objet.nom_du_champ
❙ Le nom de la classe mère n’apparaît pas : si a est un PointCouleur hérite de la classePoint : on
écrit a.couleur, a.x, a.y
Ø Mais
❙ Les protections s’appliquent : les champs privés ne sont accessibles que par les méthodes de
la classe où ils sont définis. Les champs x et y de Point sont privés
❙ Un objet de la classe PointCouleur accède au champ couleur mais pas aux champs x et y s’ils
sont private.
❙ Important quand vous définissez une hiérarchie de classes utilisées par d’autres !!!!
❙ Trop lourd lorsque c’est un ensemble de classes cohérentes comme les Point, PointCouleur
Ø Donc
❙ Le mot clé protected permet l’accès aux champs pour toutes les classes dérivées
❙ Le mot clé final interdit à une classe d’etre superclasse, à une méthode d’etre redéfinie.
Héritage et Polymorphisme
Héritage et Polymorphisme
Héritage et Polymorphisme
B b=new A();//erreur
Polymorphisme: Exemple
Remarques:
Héritage et Polymorphisme
Héritage et Polymorphisme
Héritage et Polymorphisme
Les classe abstraites
Classe et méthode abstraite
q Intérêts
q Une classe abstraite est une classe qui contient une ou plusieurs méthodes
abstraites. Elle peut malgré tout contenir d'autres méthodes habituelles (appelée
parfois méthodes concrètes).
q Une méthode abstraite est une méthode qui ne contient pas de corps. Elle
possède simplement une signature de définition suivie du caractère point-virgule
(pas de bloc d'instructions).
q Une méthode abstraite doit obligatoirement être déclarée avec le modificateur
abstract.
q Exemple :
public abstract double area();
q Une classe abstraite ne peut pas être instanciée : on ne peut pas créer d'objet
en utilisant l'opérateur new.
q Si une sous-classe d'une classe abstraite n'implémente pas toutes les méthodes
abstraites dont elle hérite, cette sous-classe est elle-même abstraite (et ne peut donc
pas être instanciée).
q Les méthodes déclarées avec l'un des modificateurs suivants : static, private
ou final ne peuvent pas être abstraites étant donné qu'elles ne peuvent pas être
redéfinies dans une sous-classe
Exemple
Même si la classe Figure est abstraite, il est tout de même possible de déclarer
des variables de ce type qui pourront recevoir des objets créés à partir des
sous-classes concrètes :
q les méthodes déclarées dans l’interface doivent être définies dans les
classes qui l’implémentent avec le même nom, le même type pour les
paramètres et le résultat.
animaux
❚ Pour respecter la notion d’héritage, il faut donc que la classe canard hérite
des 3 classes volant, nageant, courant
animaux
Canard Truites
Héritage multiple
Héritage multiple
❚ Une truite hérite des champs
❙ Vitesse par Nageant
❙ Poids, nom et cdg par Nageant/Animaux
❚ Il faudrait de l’héritage partagé (cela existe en C++ avec l’héritage virtuel) de manière
à ce que la classe Canard n’hérite qu’une seule fois des champs poids, nom et cdg.
Héritage multiple
❚ Interdit en JAVA : une classe ne peut hériter que d’une seule autre
classe
❚ mais autorisé en C++
❚ Remplacé par la notion d’interface
❚ Qu’est ce qu’une interface en JAVA
interface Volant {
void vole();
public String toString();
};
interface Nageant {
void nage();
public String toString();
};
interface Courant {
void coure();
public String toString();
};
Héritage multiple
class Canard extends Animaux implements Volant, Nageant, Courant {
private int vitessecourse=2, vitessenage=5, vitessevole=3;
private String nom;
public Canard (String name, int p){super(p); nom=new String (name); }
public String toString() { return ("Canard "+nom+" "+super.toString()); }
public void vole() { super.deplace(vitessevole,vitessevole); }
public void nage() { super.deplace(vitessenage,vitessenage); }
public void coure() { super.deplace(vitessecourse,vitessecourse); }
}
Class Chien extends Animaux implements Courant {
private int vitessecourse=10; private String nom;
public Chien (String name, int p){super(p); nom=new String (name); }
public String toString() { return ("Canard "+nom+" "+super.toString()); }
public void coure() { super.deplace(vitessecourse,vitessecourse); }
}
public class Ex {
public static void main (String []arg) { Canard a; Chien b;
a=new Canard("Duffy",10); System.out.println(a);
b = new Chien("Medor",50); System.out.println(b);
a.vole(); System.out.println(a); a.nage(); System.out.println(a);
a.coure(); System.out.println(a);
b.coure(); System.out.println(b);
// b.vole (); }}