Juin 2007~ Brigitte Groléas~ 1 J200 (JOC) Java : Objets et Classes.
-
Upload
odette-daniel -
Category
Documents
-
view
110 -
download
0
Transcript of Juin 2007~ Brigitte Groléas~ 1 J200 (JOC) Java : Objets et Classes.
juin 2007 ~ Brigitte Groléas~ 1
J200 (JOC)
Java : Objets et Classes
juin 2007 ~ Brigitte Groléas~ 2
Classes vs Objets
Objet = entité de l'environnement d'une application. = élément particulier d'une classe. = instance (occurrence) d'une classe. Classe = un genre, une catégorie d'entités semblables. = une famille d'objets de même format. = caractéristiques + propriétés = description + savoir faire = format des données + méthodes d'actions = est comme-ci et comme-ca + sait faire ceci et
cela
juin 2007 ~ Brigitte Groléas~ 3
Avantage et mise en oeuvre
L'encapsulation :Créer des objets pour déléguer et protéger.
L'héritage :Dériver pour organiser et hiérarchiser les
concepts Le Polymorphisme :
Unifier. Un même point de vue sur différentes choses.
juin 2007 ~ Brigitte Groléas~ 4
Java dispose d'un catalogue de classes
un catalogue - les classes java un regroupement par genre dans un
catalogue - package mettre les objets d'un package à disposition -
import utilisation une classe disponible dans le
catalogue - faire un new , instancier une classe
juin 2007 ~ Brigitte Groléas~ 5
Le tas
instance de la classeX
réf3
instance de la classeX
réf3 réf1
réf2
point d'entrée
instance de la classeY
instance de la classeY
juin 2007 ~ Brigitte Groléas~ 6
Les références
Variable permettant de stocker la référence à un objet.
Date naissance;
Date m = naissance;ne fait pas une copie de l'objet : naissance et m
sont 2 références sur le même objet.
juin 2007 ~ Brigitte Groléas~ 7
Définition d'une classe
class Date {int jour;int mois;int année;
public void init( int j, int m, int a ) {jour = j;mois = m;année = a;}public void affiche() {System.out.println(jour + "/" + mois + "/" + année);}
}
- Attributs - Variables d'instances - Propriétés
Méthodes d'instanc
e
juin 2007 ~ Brigitte Groléas~ 8
Instanciation d’objets
Créer un Objet de type Date grâce à l’opérateur new
Date d;d = new Date();
Date d = new Date();
Création d'un jour d.jourd'un mois d.moisd'une années d.annéed'une méthode init() d.init()d'une méthode affiche() d.affiche()
juin 2007 ~ Brigitte Groléas~ 9
Accès aux composantes
d1.jour = 10; d1.mois = 12; d1.année = 1998; d2.init( 31, 12, 1999 ); d1.affiche(); d2.affiche();
juin 2007 ~ Brigitte Groléas~ 10
Le mot clé : this
Objet receveur et donnée membre léver l'ambiguité lors d'une variable
locale du même nom
this : référence un attribut
this.jour this.affiche()
juin 2007 ~ Brigitte Groléas~ 11
Espace de nommage ~Polymorphisme
des fonctions locales à des classes Fonctions membres : invocation à travers un objet
Toute variable appartient à un objet(le jour de la Date d)
-> 2 variables (ou méthodes) peuvent porter le même nom si elles n'appartiennent pas au même objet-> 2 méthodes peuvent porter le même nom dans la même classe si elles sont identifiables par leur paramètre
Transmission par passage de messages Notion de contexte d'objet receveur
juin 2007 ~ Brigitte Groléas~ 12
Protection : spécificateurs de portée
Définir l'accessibilité des données Encapsulation des données
private aucun protected public
Les accesseurs, pour accéder aux composantes cachées
INCONVENIANTS : la lourdeur du code généré
juin 2007 ~ Brigitte Groléas~ 13
Interface fonctionnelle
contre la lourdeur du code : développement en ligne
public final void setJour(int jour) { this.jour = jour;
}public final int getJour() {
return jour; }
CONSTANTES variables final
méthodes final classes final
juin 2007 ~ Brigitte Groléas~ 14
Complétez cet exemple à vous
class Date {private ... jour, mois, année;
public void init( int jour, int mois, int année ) {
...}public void affiche() {
System.out.println( ...+"/"+...+"/"+... );}public final int getJour() { ... }public final int getMois() { ... }public final int getAnnée() { ... }
}
juin 2007 ~ Brigitte Groléas~ 15
vrai ou faux ? à vous
Une variable final n'est accessible que par les méthodes de la classe dans laquelle elle est déclarée
Tous les attributs d'une classe peuvent être privés
Toute classe doit comporter au moins 1 attribut
Plusieurs classes peuvent avoir les mêmes méthodes (i.e. même nom, mêmes paramètres, même valeur de retour)
juin 2007 ~ Brigitte Groléas~ 16
Constructeurs
Méthodes sans type de retour qui porte le même nom que la classe)
Méthodes appelées lors de la construction de la classe
L'opérateur new est appliqué sur un des constructeurs de la classe .Une nouvelle instance de la classe (objet) est allouée en mémoire et initialisée via le constructeur.
Date d1 = new Date();
Appel au constructeur
juin 2007 ~ Brigitte Groléas~ 17
Valeurs par défaut et constructeurs
class Date {private int jour = 1, mois = 1, année = 1900;
public Date( int j, int m, int a ) {jour = j; mois = m; année = a;
}
public void affiche() {...
}}
juin 2007 ~ Brigitte Groléas~ 18
Constructeur par défaut
Par défaut, toute classe possède un constructeur vide sans argument qui ne fait rien.
Ce constructeur n’est implicitement défini par le langage que si aucun constructeur n’est défini explicitement par le programmeur.
juin 2007 ~ Brigitte Groléas~ 19
Surcharge des constructeurs
Mécanisme très couramment utilisé: Plusieurs constructeurs peuvent coexister en
ayant des paramètres différents Ce qui permet de construire des objets de
façon très différentes paragraphe 'Constructor Summary' dans la
documentation de sun
juin 2007 ~ Brigitte Groléas~ 20
class Date {private int jour, mois, année;public Date() { java.util.Date now = new java.util.Date();
jour = now.getDay();mois = now.getMonth();année = now.getYear();
}public Date( int j ) { java.util.Date now = new java.util.Date();
jour = j;mois = now.getMonth();année = now.getYear();
}public Date( int j, int m ) { java.util.Date now = new java.util.Date();
jour = j;mois = m;année = now.getYear();
}
Exemple
juin 2007 ~ Brigitte Groléas~ 21
Invocation explicite d’un constructeur
class Date { private int jour, mois, année; public Date() {
java.util.Date now = new java.util.Date(); jour = now.getDay();
mois = now.getMonth();année = now.getYear();
}public Date( int j ) {
this(); jour = j;}public Date( int j, int m ) {
this(); jour = j; mois = m;....
this() permet d’invoquer un constructeur depuis un autre constructeur de la même classe
juin 2007 ~ Brigitte Groléas~ 22
Destructeur implicite: le garbage collector
La destruction physique des objets est à la charge du système.
Forcer la récupération d’un objet avant la sortie du scope : Il est possible d’anticiper l’action du garbage collector en
supprimant explicitement la référence à un objet avant que la variable référence ne disparaisse d’elle même en sortant du bloc dans lequel elle est déclarée :
void methode() {int tab[] = new int[10000];
// code utilsant tabtab = null; // on a plus besoin de tab//.code encore long
}
juin 2007 ~ Brigitte Groléas~ 23
Destructeur explicite : finalize(). Mais si l’objet utilise d’autres types de ressources ( socket
réseau, descripteur de fichier, ... ), le programmeur doit pouvoir les libérer lui-même .
« finalize() » qui est appelée avant la libération de l’objet. Quelques détails sur le fonctionnement de « finalize() » :
doit toujours invoquer la méthode « finalize() » de la super classe.
est invoquée avant la disparition effective de l’objet. L’interprète Java peut s’arrêter sans avoir libéré tous
les objets. Il n’y a pas certitude que la méthode « finalize() » soit appelée.
juin 2007 ~ Brigitte Groléas~ 24
finalize()
Si la méthode « finalize() » génère une exception, elle est ignorée par le système.
Aucune garantie sur le moment et l’ordre dans lequel les objets seront libérés .L’objet n’est pas détruit immédiatement après l’invocation de la méthode « finalize() » car celle-ci peut éventuellement ressusciter l’objet et rétablissant une référence dessus. L’objet ne sera récupéré qu’au prochain passage du garbage collector.
juin 2007 ~ Brigitte Groléas~ 25
Membre statique
Une composante statique est une composante définie au niveau d’une classe et partagée par toutes les instances (objets) de cette classe.
variables globales encapsulées dans une classe.
Il n'est pas nécessaire d'instancier la classe pour accéder à un membre statique
Variable statiques : variables de classe class Truc {
static int var;}
juin 2007 ~ Brigitte Groléas~ 26
Accès aux membres statiques
class Truc {public static int var = 0;
public int foo() {
return var;}
class Programme {public static void main( String args[] ) {
Truc.var++; // var passe à 1}
}
L'acces se fait par le Nom de la classe
il n'y a pas d'objet receveur
Les méthodes statiques ne peuvent pas accéder à this.
juin 2007 ~ Brigitte Groléas~ 27
Initialisation des variables statiques
Les variables statiques non explicitement initialisées ont une valeur par défaut qui dépend de leur type (false, u0000, 0, ou null).
on peut utiliser un bloc d’initialisation static qui sera exécuté une seule fois lors du chargement de la classe class Truc {
static int var; // valeur par défaut 0static int var2 = 12; // initialisation tstatic private int tab[] = new int[100];static { // code d’initialisation
for( int i = 0; i < tab.length; ++i ) tab[i] = i * 2;
}}
juin 2007 ~ Brigitte Groléas~ 28
Méthodes statiques : méthodes de classe
correspondent à des globales définies au niveau de la classe.
class Truc {public static void foo() {
// code de foo}void bar(){
foo();}
}class Programme {
public static void main( String args[] ) {Truc.foo(); // lance foo()
}}
juin 2007 ~ Brigitte Groléas~ 29
Pas d'objet receveur
Une méthode de classe ne peut pas accéder aux composantes d’instance car elle n’a pas de référence this sur l’objet courant.
class Truc {static int var;int var2;void foo() {...}static void bar() {...} static void foobar() {
var++; // OKvar2++ // ERREUR !!!!!foo(); // ERREUR !!!!!bar(); // OKthis // ERREUR !!!!
}
juin 2007 ~ Brigitte Groléas~ 30
Import static de Tiger
import static java.lang.Math.*; public class TestStaticImport {
public static void main(String[] args) { System.out.println(PI); System.out.println(sin(0));
}}
juin 2007 ~ Brigitte Groléas~ 31
Constantes nommées : final et statique
Les variables déclarées avec le modificateur « static final » sont en fait des constantes.
L’accès aux constantes nommées se fait de façon transparente
Si une constante est publique, elle peut être accédée depuis l’extérieur de la classe par la syntaxe « NomDeClasse.constante »
class Truc {static final int CONST = 15;static final int CONST2 = CONST >> 2;
}
juin 2007 ~ Brigitte Groléas~ 32
À vous … Vrai ou Faux
Dans System.out.println("coucou"); La classe System contient une méthode
appelée out La classe System contient une méthode
appelée println out est le nom d'une classe, définie par
class out { …} out est le nom d'une instance de classe
juin 2007 ~ Brigitte Groléas~ 33
Soit la classe Date définie comme suit :class Date {
private int jour, mois, année;public void init( int j, int m, int a ) { … }public void affiche() { … }public int inferieurA(Date d1) { … }
}
À vous … Vrai ou Faux
juin 2007 ~ Brigitte Groléas~ 34
Identifier les écritures valides1. Date d1;2. Date d1 = new Date();3. Date d1 = new Date("12/12/2000"); L'instance d1 de la classe Date étant créée,
identifier les affirmations exactes1. d1.init( 1, 2, 2000);2. d1.affiche();3. affiche(d1);4. i = d1.inferieurA(d2);5. i = inferieurA(d1, d2);
À vous … Vrai ou Faux
juin 2007 ~ Brigitte Groléas~ 35
String vs StringBuffer
Une String est de taille fixe en mémoire, pour obtenir une chaîne susceptible de croître, utilisez un StringBuffer.
StringBuffer st = new StringBuffer("coucou");
st.append("ca va"); System.out.println(st); --> « coucou ca
va »
juin 2007 ~ Brigitte Groléas~ 36
L'opérateur instanceof
Peut être utilisé pour déterminer la classe d'un objet dynamiquement.
boolean test; String str = "toto"; test = (str instanceof String);
juin 2007 ~ Brigitte Groléas~ 37
public class Element {private String name; // nom de l’élément
private int ident; // numéro d’identification géré automatiquement
private static int nextIdent = 0; // valeur du prochain n° à attribuer public static final int FIRST_ID = 0;// constante
Element( String s ) { // constructeur
name = s;ident = nextIdent++;
}public String getName() {...} // méthode d’instance
public int getIdent() {...} // méthode d’instance
public static int nbre_item() { // méthode de classe
return nextIdent;}
}
Exemple récapitulatif
juin 2007 ~ Brigitte Groléas~ 38
À vous …
Calculatrice en polonaise inverse La formule sera indiquée sous 3 2 + 5 *
Les opérandes seront des nombres décimaux, écrits si nécessaire avec . les opérateurs appartiendront à
l'ensemble {+, -, *, /} Les différents opérateurs et opérandes seront
obligatoirement séparés par un espace ; aucun autre séparateur ne sera utilisé
La formule devra tenir sur une seule ligne, la fin de la formule ne sera pas signalée par un caractère
particulier (sauf le caractère de fin de ligne)
juin 2007 ~ Brigitte Groléas~ 39
À vous …
La classe Pile est une structure de
données LIFO ( Last In First Out )
Pile
- int [ ] p - int sp
+ Pile ( int taille )+ Pile ( )+ boolean estVide ( )+ boolean estPleine ( )+ void empiler ( int val )+ int depiler ( )