• Aucun résultat trouvé

 Les Attributs usuels

N/A
N/A
Protected

Academic year: 2022

Partager " Les Attributs usuels "

Copied!
63
0
0

Texte intégral

(1)

Java

Les Classes et les Objets

Ahcène Bounceur

(2)

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

(3)

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

(4)

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é ...

}

(5)

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é ...

}

(6)

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

(7)

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.

(8)

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).

...

}

(9)

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 ;

} }

}

(10)

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)

(11)

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é

(12)

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 ;

} ...

}

(13)

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) ;

} ...

}

(14)

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 ; }

...

}

(15)

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é

} ...

}

(16)

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) ;

(17)

Surdéfinition des constructeurs

 Les constructeurs peuvent être surdéfinis

de la même manière que les méthodes

(18)

É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)

(19)

É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) ; }

...

}

(20)

É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 ; }

...

}

(21)

É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

(22)

É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

(23)

É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);

} ...

}

(24)

É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());

} ...

}

(25)

É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

(26)

É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

(27)

Échange d’informations avec les méthodes

 Permutation de deux points :

◦ Illustration : avant la permutation

0 p1 1

x

y 2

p2 3

x y

rouge couleur bleu couleur

(28)

Échange d’informations avec les méthodes

 Permutation de deux points :

◦ Illustration : avant la permutation

2 p1 3

x

y 0

p2 1

x y

bleu couleur rouge couleur

(29)

É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();

} }

(30)

Échange d’informations avec les méthodes

 Conclusion :

◦ Testez le dernier permut …

(31)

É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();

} }

(32)

É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

(33)

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) ;

} ...

}

(34)

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) ; }

...

}

(35)

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) ; }

...

}

(36)

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;

} ...

}

(37)

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;

} ...

}

(38)

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) ; }

}

(39)

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

(40)

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.

(41)

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+")");

} }

(42)

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() {...}

}

(43)

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 ; }

...

}

(44)

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 ; }

...

}

(45)

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.

(46)

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+")") ;

} ...

}

(47)

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 ; }

}

(48)

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 ; }

}

(49)

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) ; }

}

(50)

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) ;

} }

(51)

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 ...

} ...

}

(52)

Classes internes

 On peut écrire :

public class C { // classe usuelle ou externe public void f() {

I i = new I() ; }

class I { // classe interne ...

} ...

}

(53)

Classes internes

 On peut écrire :

public class C { // classe usuelle ou externe private I i1 ;

private I i2 ; ...

class I { // classe interne ...

} ...

}

(54)

Classes internes locales

public class C { // classe usuelle ou externe ...

public void f() { int x ;

class I { // classe interne ...

}

I i1 = new I() ; }

...

}

(55)

Classes internes statiques (static)

public class C { // classe usuelle ou externe ...

public static class I { // classe interne ...

} ...

}

C.I c1 = new C.I() ;

(56)

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

(57)

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

(58)

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() {...}

...

}

(59)

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() ;

} }

(60)

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() ; }

}

(61)

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() ; }

}

(62)

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

(63)

 Merci de votre attention

Références

Documents relatifs

[r]

[r]

[r]

Explique, par écrit, comment tu as fait.. Sois clair, précis

[r]

[r]

[r]

Avant de lancer le script, observer les préférences par défaut pour les points (cliquer sur l’outil Point dans la palette générale et observer la palette Aspect&amp;Couleur.. Lancer