Upload
others
View
6
Download
0
Embed Size (px)
Citation preview
Java
Les Classes et les Objets Ahcène Bounceur
Attributs et Méthodes
Les Attributs usuels public class A {
private int n ;
private float y ;
}
public class Test {
...
A a1 = new A() , a2 = new A() ;
...
}
a
n
y b
n
y
Attributs et Méthodes
Les Attributs de classe "static" public class B {
public static int n ;
private float y ;
}
public class Test {
...
B b1 = new B() , b2 = new B() ;
...
}
a y
b
n
y
Attributs et Méthodes
Les Attributs static
◦ Comme les attributs static n'appartiennent pas à
chaque objet, c'est-à-dire que tous les objets
partagent le même attribut, il est donc possible
de modifier ou de récupérer sa valeur sans
passer pes les accesseurs (ou les mutateurs) :
public class Test {
...
B b1 = new B() , b2 = new B() ;
int n1 = b1.n ; // déconseillé
int n2 = b2.n ; // déconseillé
int n3 = B.n ; // recommandé
...
}
Attributs et Méthodes
Les méthodes (de classe) public class A {
public static int n ; // attribut de classe
private float y ; // attribut usuel
public static void f() {
// on ne peux pas manipuler dans cette méthode
// les attributs usuels (y), mais il est
// possible d’accéder aux attributs de
// classes (n)
}
}
public class Test {
...
A a = new A() ;
a.f() ; // déconseillé
A.f() ; // recommandé
...
}
Attributs et Méthodes
Exemples de la classe Math : double x = 4.5 ;
double y = 2.;
Math.abs(x); // valeur absolue de x
Math.pow(x, y); // x puissance y
Math.sqrt(x); // racine carrée de x
Math.max(x, y); // maximum entre x et y
Math.sin(y * Math.PI); // sinus de y
Initialisation des attributs de classe
La déclaration d'un objet avant toute
instanciation ne permet pas d'initialiser les
attributs usuels. Cependant, elle initialise les
attributs de classe.
Les attributs de classe ne peuvent pas être
initialisés dans un constructeur.
Initialisation des attributs de classe
Exemple : public class A {
public static int n = 10 ;
public static int p ;
public static void f() {...}
}
public class Test {
...
A a ; // l’objet a n’est pas encore instancié, mais
// l’attribut n est déjà initialisé
// (explicitement) à 10 et p à 0
// (implicitement).
...
}
Bloc d’initialisation static
Exemple : initialisation des variables de
classes dans un bloc :
public class A {
public static int n ;
public static int [] t;
static {
n = 10;
t = new int [n];
for (int i = 0; i < n; i++) {
t[i] = i ;
}
}
}
Surdéfinition des méthodes
Surdéfinition : on l’appelle aussi
Surcharge (ou overload) des méthodes
Pouvoir déclarer plusieurs méthodes en
utilisant le même nom. Ce qui les diffère,
c’est leurs arguments (en type et en
nombre)
Surdéfinition des méthodes
Exemple du point :
◦ Supposons que nous avons 3 manières de
déplacement d’un point :
1. En lui spécifiant les nouvelles coordonnées
2. En lui spécifiant un seul paramètre qui permettra de
le déplacer horizontalement
3. En le déplaçant horizontalement d’une unité quand
aucun paramètre n’est spécifié
Surdéfinition des méthodes
Exemple du point (suite) : public class Point {
private int x ; // abscisse
private int y ; // ordonnee
...
public void deplacer(int dx, int dy) {
x += dx ;
y += dy ;
}
public void deplacer(int dx) {
x += dx ;
}
public void deplacer() {
x += 1 ;
}
...
}
Surdéfinition des méthodes
Exemple du point (suite) : on peut aussi
écrire public class Point {
private int x ; // abscisse
private int y ; // ordonnee
...
public void deplacer(int dx, int dy) {
x += dx ;
y += dy ;
}
public void deplacer(int dx) {
deplacer(dx, 0) ;
}
public void deplacer() {
deplacer(1) ;
}
...
}
Surdéfinition des méthodes
Attention : ambigüité !!! public class A {
private byte x ;
private int y ;
...
public void methode(byte a, int b) { // 1
x = a ;
y = b ;
}
public void methode(int b, byte a) { // 2
x = a ;
y = b ;
}
...
}
Surdéfinition des méthodes
Attention : ambigüité !!! (suite) public class Test_A {
...
public void m() {
A a = new A() ;
byte v1 ;
int v2 ;
a.methode(v1, v2) ; // juste : méthode 1
a.methode(v2, v1) ; // juste : méthode 2
a.methode(v2, v2) ; // ici, les deux
// constructeurs peuvent
// être utilisés :
// ambigüité
}
...
}
Surdéfinition des méthodes
Attention : ambigüité !!! (suite)
◦ Si dans cette situation il faut utiliser le deuxième
constructeur, il faut caster ou transformer le
deuxième paramètre en int
// Cast :
a.methode((int) v2, v2) ;
// une autre solution :
a.methode( 1*v2, v2) ;
Surdéfinition des constructeurs
Les constructeurs peuvent être surdéfinis
de la même manière que les méthodes
Échange d’informations avec les
méthodes Java transmet les informations
◦ Par valeurs pour les types primitifs
◦ Par références pour les objets
Exemple :
◦ On va ajouter l’attribut couleur à la classe Point
◦ On va essayer de permuter les coordonnées
d’un point (on ajoute la méthode coordPermut)
◦ On va essayer de permuter deux points (on
ajoute la méthode permut)
Échange d’informations avec les
méthodes L’attribut couleur public class Point {
private int x ; // abscisse
private int y ; // ordonnee
private String couleur ; // couleur
...
public Point(String couleur, int x, int y) {...}
public int getX() {...}
public void setX() {...}
public int getY() {...}
public void setY() {...}
public String getCouleur() {...}
public void setCouleur() {...}
public void afficher() {
System.out.println(couleur+" : "+x+" , "+y) ;
}
...
}
Échange d’informations avec les
méthodes Permutation des coordonnées d’un point
◦ On utilisera deux méthodes, une sans arguments
et l’autre avec arguments public class Point {
private int x ; // abscisse
private int y ; // ordonnee
private String couleur ; // couleur
...
public void coordPermut() {
int s = x ;
x = y ;
y = s ;
}
public void coordPermut(int xP, int yP) {
int s = xP ;
xP = yP ;
yP = s ;
}
...
}
Échange d’informations avec les
méthodes Permutation des coordonnées d’un point
◦ Test 1
public class TestPermut {
public static void main( String [] args ) {
MonPoint p = new MonPoint(0, 1) ;
p.afficher() ;
System.out.println("Permutation : ");
p.coordPermut(p.getX(), p.getY()) ;
p.afficher() ;
}
} Point rouge : 0 , 1
Permutation :
Point rouge : 0 , 1
Échange d’informations avec les
méthodes Permutation des coordonnées d’un point
◦ Test 2
public class TestPermut {
public static void main( String [] args ) {
MonPoint p = new MonPoint(0, 1) ;
p.afficher() ;
System.out.println("Permutation : ");
p.coordPermut() ;
p.afficher() ;
}
} Point rouge : 0 , 1
Permutation :
Point rouge : 1 , 0
Échange d’informations avec les
méthodes Permutation de deux points
◦ On utilisera la méthode permut (version 1)
public class Point {
private int x ; // abscisse
private int y ; // ordonnee
private String couleur ; // couleur
...
public void permut(MonPoint p) {
int tX = x ;
int tY = y ;
x = p.getX() ;
y = p.getY() ;
p.setX(tX);
p.setY(tY);
}
...
}
Échange d’informations avec les
méthodes Permutation de deux points
◦ On utilisera la méthode permut (version 2)
public class Point {
private int x ; // abscisse
private int y ; // ordonnee
private String couleur ; // couleur
...
public void permut(MonPoint p) {
MonPoint tP = new MonPoint(couleur, x, y) ;
setX(p.getX());
setY(p.getY());
p.setX(tP.getX());
p.setY(tP.getY());
}
...
}
Échange d’informations avec les
méthodes Permutation de deux points
◦ Test
public class TestPermut {
public static void main( String [] args ) {
MonPoint p1 = new MonPoint("rouge", 0, 1);
MonPoint p2 = new MonPoint("bleu " , 2, 3);
p1.afficher();
p2.afficher();
System.out.println("Permutation : ");
p1.permut(p2);
p1.afficher();
p2.afficher();
}
} Point rouge : 0 , 1
Point bleu : 2 , 3
Permutation :
Point rouge : 2 , 3
Point bleu : 0 , 1
Échange d’informations avec les
méthodes Permutation de deux points :
◦ Dans ce dernier code, il n’y a pas eu une réelle
permutation de points, c’est juste une simulation
d’une permutation.
◦ Ce qui a été permuté, ce sont les valeurs des
attributs des points
Échange d’informations avec les
méthodes Permutation de deux points :
◦ Illustration : avant la permutation
0
1 p1
x
y 2
3 p2
x
y
rouge bleu couleur couleur
Échange d’informations avec les
méthodes Permutation de deux points :
◦ Illustration : avant la permutation
2
3 p1
x
y 0
1 p2
x
y
bleu rouge couleur couleur
Échange d’informations avec les
méthodes Permutation de deux points
◦ On utilisera la méthode permut (version 3)
◦ On va utiliser une nouvelle classe Util pour
pouvoir utiliser une méthode static permut
public class Util {
public static void permut(MonPoint p1, MonPoint p2) {
MonPoint tP ;
tP = p1 ;
p1 = p2 ;
p2 = tP ;
p1.afficher();
p2.afficher();
}
}
Échange d’informations avec les
méthodes Conclusion :
◦ Testez le dernier permut …
Échange d’informations avec les
méthodes Permutation de deux points
◦ On utilisera la méthode permut (version 4)
public class Util {
public static void permut(MonPoint p1, MonPoint p2) {
MonPoint tP ;
tP = p1 ;
p1 = p2 ;
p2 = tP ;
p1.afficher();
p2.afficher();
}
}
Échange d’informations avec les
méthodes Exercices :
◦ Écrire le code qui permet de comparer deux
points !
◦ Écrire le code qui permet de cloner un point :
ajouter la méthode cloner()
◦ Écrire le code qui permet de créer un point à
partir d’un autre : constructeur ayant comme
argument un point
L’autoréférence : this
This permet de spécifier l’objet courant :
◦ Revenons à la classe Point public class Point {
private int x ; // abscisse
private int y ; // ordonnee
...
public Point(int abs, int ord) {
x = abs ;
y = ord ;
}
public void deplacer(int dx, int dy) {
x += dx ;
y += dy ;
}
public void deplacer(int dx) {
deplacer(dx, 0) ;
}
...
}
L’autoréférence : this
La vraie forme de la classe Point
public class Point {
private int x ; // abscisse
private int y ; // ordonnee
...
public Point(int abs, int ord) {
this.x = abs ;
this.y = ord ;
}
public void deplacer(int dx, int dy) {
this.x += dx ;
this.y += dy ;
}
public void deplacer(int dx) {
this.deplacer(dx, 0) ;
}
...
}
L’autoréférence : this
Un this obligatoire !!
public class Point {
private int x ; // abscisse
private int y ; // ordonnee
...
public Point(int x, int y) {
this.x = x ;
this.y = y ;
}
public void deplacer(int dx, int dy) {
this.x += dx ;
this.y += dy ;
}
public void deplacer(int dx) {
this.deplacer(dx, 0) ;
}
...
}
L’autoréférence : this
this pour appeler un constructeur !
public class Point {
private int x ; // abscisse
private int y ; // ordonnee
...
public Point(int abs, int ord) {
this.x = abs ;
this.y = ord ;
}
public Point() {
this(0, 0); // x = 0; y = 0;
}
...
}
L’autoréférence : this
this pour appeler un constructeur !
public class Point {
private int x ; // abscisse
private int y ; // ordonnee
...
public Point(int abs, int ord) {
this.x = abs ;
this.y = ord ;
}
public Point() {
... // l’appel d’un constructeur doit être
// fait en premier, donc, on ne peut
// rien mettre ici avant un this
this(0, 0); // x = 0; y = 0;
}
...
}
Méthodes récursives
public class A {
public static long fact(long n) {
if (n > 1)
return (n * fact(n-1)) ;
else
return 1 ;
}
}
public class Test_A {
public static void main (String [] args) {
long x = A.fact(8) ;
System.out.println("Factorielle de 8 = "+x) ;
}
}
Objets membres
On appelle objet membre un objet faisant
parti des attributs d’une classe
Ou bien, lorsqu’un attribut n’est pas un type
primitif mais un objet, ce dernier s’appellera
objet membre
Objets membres
Exemple :
◦ Soit l’objet Cercle ayant comme attribut, le
rayon r, de type float et le centre de type Point.
◦ Nous allons essayer d’écrire la méthode
deplacer() qui permet de déplacer le cercle.
Objets membres
Exemple :
◦ On rappellera la classe Point
public class Point {
private int x ; private int y ;
public Point(int x, int y) {
this.x = x ; this.y = y ;
}
public void getX() {return x ;}
public void getY() {return y ;}
public int setX(int x) {this.x = x ; }
public int setY(int y) {this.y = y ; }
public void deplacer(int dx, int dy) {
x += dx ; y += dy ;
}
public void afficher() {
System.out.println("Point ("+x+", "+y+")");
}
}
Objets membres
Exemple :
◦ La forme de la classe Cercle
public class Cercle {
private float r ;
private Point c ;
public Cercle(int x, int y, float r) {...}
public Cercle(Point c, float r) {...}
public void afficher() {...}
public void deplacer() {...}
}
Objets membres
Exemple :
◦ Constructeur 1
public class Cercle {
private float r ;
private Point c ;
public Cercle(int x, int y, float r) {
c = new Point(x, y) ;
this.r = r ;
}
...
}
Objets membres
Exemple :
◦ Constructeur 2
public class Cercle {
private float r ;
private Point c ;
...
public Cercle(Point c, float r) {
this.c = c ;
this.r = r ;
}
...
}
Objets membres
Exemple :
◦ Lé méthode afficher : trouver l’intrus !
public class Cercle {
private float r ;
private Point c ;
...
public void afficher() {
System.out.print("Cercle ("+c) ;
System.out.println(", "+r+")") ;
}
...
}
Remarque : l’écriture println(c) peut être utilisée telle quelle,
à condition, que la méthode toString de la classe Point soit
définie. Ce n’est pas le but de ce cours. Donc, nous la
considérons ici comme erreur.
Objets membres
Exemple :
◦ Lé méthode afficher : trouver l’intrus !
public class Cercle {
private float r ;
private Point c ;
...
public void afficher() {
System.out.print("Cercle ("+c.afficher()) ;
System.out.println(", "+r+")") ;
}
...
}
Objets membres
Exemple :
◦ La méthode déplacer : trouver l’intrus !
public class Cercle {
private float r ;
private Point c ;
...
public void deplacer(int dx, int dy) {
(c.x)+= dx ;
(c.y)+= dy ;
}
}
Objets membres
Exemple :
◦ La méthode déplacer : trouver l’intrus !
public class Cercle {
private float r ;
private Point c ;
...
public void deplacer(int dx, int dy) {
(c.x)+= dx ;
(c.y)+= dy ;
}
}
Objets membres
Exemple :
◦ La méthode déplacer : solution 1
public class Cercle {
private float r ;
private Point c ;
...
public void deplacer(int dx, int dy) {
c.setX(c.getX()+dx) ;
c.setY(c.getY()+dy) ;
}
}
Objets membres
Exemple :
◦ La méthode déplacer : solution 2
public class Cercle {
private float r ;
private Point c ;
...
public void deplacer(int dx, int dy) {
c.deplacer(dx, dy) ;
}
}
Classes internes
Introduite par la version java 1.1
Principalement pour simplifier l’écriture du
code de la programmation événementielle
public class C { // classe usuelle ou externe
...
class I1 { // classe interne
...
}
class I2 { // classe interne
...
}
...
}
Classes internes
On peut écrire :
public class C { // classe usuelle ou externe
public void f() {
I i = new I() ;
}
class I { // classe interne
...
}
...
}
Classes internes
On peut écrire :
public class C { // classe usuelle ou externe
private I i1 ;
private I i2 ;
...
class I { // classe interne
...
}
...
}
Classes internes locales
public class C { // classe usuelle ou externe
...
public void f() {
int x ;
class I { // classe interne
...
}
I i1 = new I() ;
}
...
}
Classes internes statiques (static)
public class C { // classe usuelle ou externe
...
public static class I { // classe interne
...
}
...
}
C.I c1 = new C.I() ;
Les paquetages (package)
La notion de paquetage correspond à une regroupement logique sous un identificateur commun d’un ensemble de classes.
Las paquetages sont caractérisés par un nom (simple identificateur ou suite d’identificateurs suivis d’un point)
◦ Exemples :
MesClasses
Utilitaires.Mathematiques
Utilitaires.Physiques
Les paquetages (package)
La notion de paquetage est une notion
logique. Elle a un seul rapport partiel avec la
localisation effective des classes ou des
fichiers au sein de répertoires
Les paquetages (package)
Exemple de deux classes C1 et C2 qui font
partie d’un paquetage Utilitaire
package Utilitaire ;
public class C1 {
...
public void m() {...}
...
}
package Utilitaire ;
public class C2 {
...
public void m() {...}
...
}
Les paquetages (package)
Comment utiliser la classe C1 du paquetage
Utilitaire ? Solution 1
package Utilitaire ;
public class C1 {
...
public void m() {...}
...
}
public class Test { // solution 1
public static void main (String [] args ) {
Utilitaire.C1 c = new Utilitaire.C1() ;
c.m() ;
}
}
Les paquetages (package)
Comment utiliser la classe C1 du paquetage
Utilitaire ? Solution 2
package Utilitaire ;
public class C1 {
...
public void m() {...}
...
}
import Utilitaire.C1 ;
public class Test { // solution 2
public static void main (String [] args ) {
C1 c = new C1() ;
c.m() ;
}
}
Les paquetages (package)
Comment utiliser toutes les classes du
paquetage Utilitaire ?
import Utilitaire.* ;
public class Test {
public static void main (String [] args ) {
C1 c1 = new C1() ;
C2 c2 = new C2() ;
c1.m() ;
c2.m() ;
}
}
Conclusion importante
int x
float y
char c
… // Les attributs
m1() m2()
m3()
m4()
m5() m6()
…
m7()
int x
float y
char c
… // Les attributs
m1() m2()
m3()
m4()
m5() m6()
…
m7()
messages
objet
objet
méthodes méthodes
Merci de votre attention