Java Les Classes et les Objets -...

Preview:

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

Recommended