Académique Documents
Professionnel Documents
Culture Documents
1- Introduction
a
Point a;
@dr a = new Point() ;
X=? ---------------------
Point.java Point.class
TestPoint.java TestPoint.class
Si la méthode main est dans la classe Point (définition de la classe et son utilisation
dans le même fichier. Dans ce cas la méthode main aurait accès aux champs privés de la
classe, ce qui ne correspond pas aux conditions usuelles d’utilisation.
Si nous avons plusieurs classes dans le même fichier alors une seule doit être public
parceque le fichier doit avoir le même nom que la classe public.
Généralement on doit dissocier les classes et les rendre publiques pour pouvoir les
réutiliser le plus largement possible.
Un constructeur n’est rien d’autre qu’une méthode, sans valeur de retour, portant le
nom de la classe. Il peut disposer d’un nombre quelconque d’argument
(éventuellement 0).
Résumé
La création d’un objet entraine toujours les opérations suivantes :
Classe A {
Int n ;
Float y ;
}
A a1 = new A () ;
A a2 = new A () ;
Java permet de définir ce qu’on nomme des champs de classe (ou statique) qui n’existent
qu’en un seul exemplaire.
Classe B {
Static Int n ;
Float y ;
}
B b1 = new B () ;
B b2 = new B () ;
Ecrire un programme Java utilisant une classe Obj destine à contenir, à tout moment, le
nombre d’objet de type Obj.
Exemple :
On voit que la méthode coïncide, appelée par un objet ‘a’, est autorisée à accéder aux
champs privés d’un autre objet ‘b’ de la même classe.
1- Introduction
Soit la définition Java suivante :
Class E
{ …………….
Class I
{ ……………..
}
……………………..
}
Simplement, une de ses méthodes fe() utilise le type I pour instancier un objet de ce type.
Class E
{ …………….
Class I
{ ……………..
}
……………………..
Private I i1, i2 ;
}
Ici un objet de la classe E contient 2 membres de type I, nous n’avons pas précisé comment
les objets correspondants seront instancier (Comment ?)
Remarques
1- Un objet d’une classe interne est tjrs associé, au moment de son instanciation, à un
objet d’une classe externe dont on dit qu’il lui a donnée naissance.
2- Un objet d’une classe interne à tjrs accès aux champs et méthodes (même privés) de
l’objet externe lui ayant donnée naissance (accès restreint à l’objet et non à tous les
objets de cette classe).
3- Un objet d’une classe interne à tjrs accès aux champs et méthodes (même privés) d’un
objet interne auquel il a donnée naissance.
4- Une méthode statique n’est associe à aucun objet, par conséquent, une méthode
statique d’un classe externe ne peut créer aucun objet d’une classe interne.
Exemple
Ecrire une classe Cercle utilisant une classe nommée Centre (point), interne à Cercle.
La classe Cercle possède un constructeur, une méthode affiche() et une méthode déplace().
package TP03_1_Cylindre;
public Cylindre(int x1, int y1, int x2, int y2, double r, int h) {
c1 = new Cercle(x1, y1, r);
c2 = new Cercle(x2, y2, r);
this.h = h;
}
package TP03_1_Cylindre;
import java.util.Scanner;
System.out.print("Y1=");
int y1 = sc.nextInt();
System.out.print("X2=");
int x2 = sc.nextInt();
System.out.print("Y2=");
int y2 = sc.nextInt();
System.out.print("Rayon=");
double r = sc.nextDouble();
System.out.print("Hauteur=");
int h = sc.nextInt();
Class E
{ …………….
Class I
{ ……………..
}
……………………..
}
E e = new E() ;
Alors on peut affecter à i la référence
i = new e.I() ;
Class E
{ …………….
Public static Class I
{ ……………..
}
……………………..
}
La classe I n’a plus accès aux membres de E, sauf s’il s’agit de membres statiques.
- La démarche la plus réaliste consiste plutôt à prévoir dans la classe correspondante une
méthode destinée à fournir une copie de l’objet concerné, comme le montre l’exemple.
Class Point {
Private int x , y;
}
…………………………………………………………….
Cette démarche est utilisable tantque la classe concernée ne comporte pas de champs
de type classe.
Par ailleurs, il existe une interface très particulière Cloneable. Ce nom s’emploie comme un
nom d’interface dans une clause implements. Mais n’impose pas la redéfinition de la
méthode clone.
En fait, la déclaration :
Ceci signifie que la classe X peut subir une copie profonde par appel de la méthode clone.
Cette dernière peut être celle de Object ou une méthode fournie par X.
En fin, une tentative d’appel de clone sur une classe n’implémentant pas l‘interface
Cloneable conduit à une exception CloneNotSupportedException.
Object clone() ;
Cela signifie que son utilisation nécessite toujours un cast de son résultat dans le type
effectif de l’objet soumis à copie.
Une classe implémentant l'interface Cloneable doit réécrire la méthode clone(). La méthode
clone() doit retourner une copie de l'objet que l'on veut cloner. Cette copie dépend de la
classe de l'objet, cependant elle doit respecter des conditions (dont certaines par convention).
l'expression
x.clone().getClass() == x.getClass()
x.clone().equals(x)
Par convention, l'objet retourné doit être obtenu par un appel à la méthode
super.clone() .
Si une classe et toutes ses classes parentes (exceptée la classe Object) respectent
cette convention, alors l'expression
x.clone().getClass() == x.getClass()
Par convention, l'objet retourné doit être indépendant de l'objet cloné, c'est à
dire que tous les attributs non immuables (unchangeable) devront être eux aussi
clonés.
3- Clonage Simple
int i = 0;
int[] t = {1, 2};
class TestClone {
}
}
et constater le résultat:
4- Clonage superficiel
En réalité, le clonage est superficiel. L'entier x.i a été copié dans y.i, mais pour le tableau t,
c'est la référence qui est copiée (non les éléments du tableau).
Pour le constater, rajouter à la classe Cellule une méthode qui change les éléments d'un
cellule.
x.changeMe();
x.afficher();
y.afficher();
on obtient:
Pour copier tout l'objet Cellule, y compris le tableau, il faut cloner ce dernier. Pour cela On
change la méthode clone() de la classe Cellule, pour cloner le tableau.
try {
Cellule c = (Cellule) super.clone();
c.t = (int []) this.t.clone(); //clonage de this.t
return c;
}
catch (CloneNotSupportedException e) {
throw new InternalError();
}
}
On crée par clonage une cellule temporaire c et on modifie son tableau c.t par
recopie ( this->t.clone() ).
Exercice
package TP_Clone;
int x,y;
public Point ( int x,int y){
this.x = x;
this.y = y;
}
o = super.clone();
} catch(CloneNotSupportedException cnse) {
cnse.printStackTrace(System.err);
}
return o;
}
}
Personne pr = null;
try {
pr = (Personne)super.clone();
} catch(CloneNotSupportedException cnse) {
cnse.printStackTrace(System.err);
}
pr.p = (Point) p.clone();
return pr;
}
String prenom;
String nom;
Point p;
}
package TP_Clone;
personne2.nom = "Ali";
personne2.p.x=22;
System.out.println(personne1.nom + " "+ personne1.prenom +
" " + personne1.p.x + " "+ personne1.p.y);
System.out.println(personne2.nom + " "+ personne2.prenom +
" " + personne2.p.x + " "+ personne2.p.y);
System.out.println(personne1.clone()!= personne1);
System.out.println(personne1.clone().getClass() ==
personne1.getClass());
}
}
1- Introduction
import java.util.Scanner;
moyenne = somme/nbElement;
System.out.println(" La Moyenne = " + moyenne);
Remarque
Length s’utilise comme s’il s’agit d’un attribut public de l’objet tableau (t.length) et
non comme une méthode (t.length()).
public class Util {
System.out.println("******************");
Util.raz(t);
Util.affiche(t);
System.out.println("*******************");
int [] res;
res = Util.suite(10);
Util.affiche(res);
System.out.println("*******************");
}
}
1- Introduction
Classe Point ;
On dit que la classe pointCol est une classe dérivée de la classe point (classe de base)
Constatations
Une méthode d’une classe dérivée n’a pas accès aux membres privés de sa classe
de base.
Cette règle peut paraitre restrictive mais en son absence, il suffirait de créer une
classe dérivée pour vider le principe d’encapsulation.
Class B extends A {
Public B(….) {
Super () ; // Appel du pseudo constructeur par défaut de A
……………
}
}
- Soit posséder un constructeur public sans argument, le quel sera alors appelé.
- Soit ne possède aucun constructeur, il y aura appel du pseudo-constructeur par
défaut.
Exemple 1
Class A {
Public A() { …………….}
Public A( int n ) { …………………….}
}
Class B extends A {
…………….// aucun constructeur
}
Exemple 2
Class A {
Public A( int n ) { …………………….}
}
Class B extends A {
…………….// aucun constructeur
}
B b = new B() ;
Dérivation successives
D’une même classe peuvent être dérivées plusieurs classes différentes.
Sur-définition de méthodes
Méthodes de même nom, mais de signatures de différentes (dans la même classe).
La nouvelle méthode ne deviendra utilisable que par la classe dérivée ou ses descendantes,
mais pas ses ascendantes.
Il s’agira non seulement de méthodes de même nom (cas de sur-définition) mais aussi de
même signature et de même type de valeur de retour.
Résumé
Sur-définition : cumuler plusieurs méthodes de même nom, Redéfinition : substituer une
méthode à une autre.
Exemple
Class Point { …… }
Class PointCol { ……. }
Class TestPointCol { ….. }
Exemple
Class A {
Class B Extends A {
Aa; Bb;
Int n ; float x ;
Exemple
Class A {
Aa;Bb;
………………
Class B extends A {
Class B extends A {
Redéfinir impose non seulement l’identité des signatures mais aussi celle de la valeur de
retour.
La redéfinition d’une méthode ne doit pas diminuer les droits d’accès à cette méthode. En
revanche, elle peut les augmenter.
Remarque
Un membre déclaré protected est accessible à des classes du même package, ainsi qu’à ses
classes dérivées (quelles appartiennent au non au même package). Cette particularité
complique quelque peu la conception des classes, ce qui fait qu’en pratique, ce droit d’accès
est peu employé.
1- Introduction
Il s’agit d’un concept extrêmement puissant en P.O.O. qui complète l’héritage, il
permet de manipuler les objets sans connaitre (tout à fait) le type.
Le polymorphisme exploite la relation "est" (en anglais IS-A) induite par l’héritage.
Exemple
Un point coloré est un point « on le traite comme un point mais l’inversion est
faut ».
“Any Java object that can pass more than one IS-A test is considered to be
polymorphic. In Java, all Java objects are polymorphic since any object will
pass the IS-A test for their own type and for the class Object.”
Résumé
Le polymorphisme en java se traduit par :
1- Introduction
- Une classe abstraite est une classe qui ne permet pas d’instancier des objets.
- Elle ne peut servir que de classe de base pour une dérivation.
Abstract class A {
…………………
- Dans une classe abstraite, on peut trouver des champs et des méthodes, dont
héritera toute classe dérivée.
- Mais in peut trouver des méthodes dites abstraites (uniquement signature et
type de retour).
Abstract class A {
…………………
Public void f() { ……}
Public abstract void g (int n) ;
}
Class B extends A {
Public void g(int n) { …..} // Ici on définit g()
………………
}
A a = ne B(…..) ; // ok ça marche
Exemple
Nous avons un classe abstraite nommée Affichable, dotée d’une méthode abstraite
affiche(). Deux classes Entier et Flottant dérivent de cette classe. La méthode main()
utilise un tableau hétérogène d’objets de type Affichable qu’elle remplit en
instanciant des objets de type Entier et Flottant. Afficher ensuite les objets de ce
tableau.
1- Introduction
Une classe abstraite permettait de définir dans une classe de base des
fonctionnalités communes à toutes ses classes descendantes, tout en leur
imposant de redéfinir certaines méthodes.
En effet, une interface définit les entêtes d’un certain nombre de méthodes,
ainsi que des constantes. Les interfaces sont plus riches qu’un simple cas
particulier d’une classe abstraite.
Ainsi,
2- Définition
Public interface I {
Void f(int n) ;
Void g() ;
}
Par essence, les méthodes d’une interface sont abstraites et publiques, néanmoins, il
n’est pas nécessaire de mentionner les mots clés public et abstract.
Public interface I1 {
Void f(int n) ;
}
Public interface I2 {
Void g() ;
}
Public Class A implements interface I1,I2 {
Void f(int n) { ………} ;
Void g() { ………}; // redéfinir f et g prévues dans les interfaces I1 et I2
}
I i = new A(); // Ok
A travers i, on pourra manipuler des objets quelconques, pour peu que cette classe
implémente l’interface I.
Exercice
Refaire l’exercice Affichable de tableau avec polymorphisme en utilisant les interfaces.
Public interface I {
Void f(int n) ;
Void g() ;
Static final int Max = 100;
}
Public interface I1 {
Void f(int n) ;
Static final int Min = 20;
}
Void g() ;
Static final int Max = 100;
}
8- Conflit de noms
Première situation
Public interface I1 {
Void f(int n) ;
Void g() ;
}
Public interface I2 {
Void f(float x) ;
Void g() ;
}
Dans cette situation nous avons deux méthodes f() et une seule méthode g() dans la
classe A.
Public interface I1 {
Void f(int n) ;
Void g() ;
}
Public interface I2 {
Void f(float x) ;
Int g() ;
}
- Une classe abstraite permet de définir dans une classe de base des
fonctionnalités communes à toutes ses classes descendantes tout en leur
imposant de redéfinir certaines méthodes,
1- Introduction
Le mécanisme d'exception est un mécanisme de déroutement du programme, c'est à dire
qu'elle brise la séquentialité du programme (comme le fait return, break, continue). Le
mécanisme qui brise la séquentialité est la levée d'exception. Lorsqu'une exception est levée,
le programme est dérouté vers les premiers gestionnaires d'exceptions.
Java dispose d’un mécanisme très souple nommé gestion d’exceptions qui permet à la fois :
Une exception est une rupture de séquence déclenchée par une instruction "throw"
comportant une expression de type classe.
Le choix du bon gestionnaire est fait en fonction du type de l’objet mentionné à "throw".
Exemple
Soit la classe Point avec un constructeur à deux (2) arguments et la méthode affiche.
On ne souhaite manipuler que les points ayant des coordonnés positives.
Dans cette exemple c’est le constructeur qui d’éclanche une exception ErrConst.
Try {
// instructions
}
2- Faire suivre ce bloc de la définition des différents gestionnaires d’exception (ici un seul
suffit).
Catch (ErrConst e) {
System.out.println (" Erreur construction ") ;
System.exit (-1) ;
}
Lors de l’utilisation de la classe point, nous pouvons détecter les deux exceptions
potentielles ErrConst et ErrDepl.
Try {
Point a = new Point (2 , 4); a.affiche();
Deplace(-3, 0);
Point b = new Point (-3 , 4); b.affiche();
}
Catch (ErrConst e) { // Le gestionnaire d’exception
System.out.println (" Erreur de construction ") ;
System.exit (-1) ;
}
Catch (ErrDepl e) { // Le gestionnaire d’exception
System.out.println (" Erreur de déplacement ") ;
System.exit (-1) ;
}
}
Nous n’avons aucune chance de mettre en évidence celle qu’aurait provoquée la tentative de
construction du point b par l’appel de ( new Point( -3 , 4 ) )
La classe Exception dispose d’un constructeur à un argument de type String dont on peut
récupérer la valeur à l’aide de la méthode getmessage.
Le gestionnaire est rarement trouvé dans la méthode qui a déclenché l’exception puisque
l’un des objectifs fondamentaux du traitement d’exception est précisément de séparer le
déclanchement et le traitement d’une exception.
La clause throws
Toute méthode susceptible de déclencher une exception qu’elle se traite pas localement doit
mentionner son type dans une clause throws figurant dans son en-tête.
Java fournit de nombreuses classes prédéfinies dérivées de la classe exception, qui sont
utilisées par certaines méthodes standard ;
Exemple
IOException et ses dérivées sont utilisées par la JVM à la rencontre de situations anormales
telles qu’un indice de tableau hors limites, une taille de tableau négative, …
1- Introduction
Un thread ou fil (d'exécution) ou tâche (terme et définition normalisés par ISO/CEI 2382-
7:2000 ; autres appellations connues : processus léger, fil d'instruction, processus
allégé, exétron, voire unité d'exécution ou unité de traitement) est similaire à
un processus car tous deux représentent l'exécution d'un ensemble d'instructions du langage
machine d'un processeur.
Première solution
En java un thread est un objet d’une classe qui dispose d’une méthode nommée run()
qui sera exécutée lorsque le thread sera démarré.
Class test {
// Création
Ecrit e1 = new Ecrit ("Bonjour", 10);
Ecrit e2 = new Ecrit ("Bonsoir", 12);
Ecrit e3 = new Ecrit ("\n", 5);
// Lancement
e1.start(); // lance le thread e1
*************************************************
e1.start();
e2.start();
e3.start();
Clavier.lireInt();
Class testThread {
Remarques
- Les objets threads ne peuvent pas dériver d’autre classe que de threads,
- Cette démarche est basée sur une classe implémentant l’interface runnable,
laquelle comporte une seule méthode nommée run().
Thread.sleep(t);
}
}
}
Ces objets ne sont pas des threads et ne peuvent plus être lancées par la méthode start().
Exemple
// crée un objet thread associe à l’objet e1 qui doit implémenter l’interface runnable pour
disposer d’une méthode run(),
t1.start() ;
Thread.sleep(t);
}
}
Catch (InterruptedException e) {……} // imposé par sleep()
}
Class testThread {
// Lancement
thread t1= new thread (e1);
t1.start() ;
thread t2= new thread (e2);
t2.start() ;
thread t3= new thread (e3);
t3.start() ;
}
}
Dans certains cas, on peut interrompre prématurément un thread depuis un autre thread. Ce
besoin est fondamental dans le cas de thread infinis.
Exemple :