1. VI. Champs et méthodes de classe
1. Champs de classe (variable de classe)
Considérons la définition simpliste suivante:
class ClasseTest {
int n;
double y;
}
Chaque objet de type ClasseTest possède ses propres champs n et y.
Par exemple avec les déclarations
ClasseTest objA1=new ClasseTest(), objA2= new ClasseTest();
objA1.n et objA2.n désignent deux données différentes.
objA1.y et objA2.y désignent aussi deux données différents.
1
objA1.n
objA1.y
objet objA1
objA2.n
objA2.y
objet objA2
2. Certains attributs peuvent être partagés par toutes les
instances d’une classe. C’est-à-dire ils peuvent être définis
indépendamment des instances (objets):
Par exemple le nombre d’étudiants = le nombre d’objets
étudiant créés.
Ces attributs sont nommés champs de classe ou variables de
classe. Ils sont comparables aux «variables globales ».
Ces variables n’existent qu’en un seul exemplaire,
quel que soit le nombre d’objets de la classe. Elles sont
définies comme les attributs mais précédés du mot-clé static.
2
Les attributs statiques ne sont pas instanciés dans les objets
3. Considérons la classe:
class ClasseTest {
double y;
}
Soient objA1 et objA2 deux instances différentes.
ClasseTest objA1=new ClasseTest(), objA2=new ClasseTest();
static int n; // la valeur de n est partagée par toutes les instances
ClasseTest.n // champs (statique) de la classe ClasseTest
objA1 et objA2 partagent la même variable n:
- Pour y accéder, on utilise le nom de la classe
objA1.n et objA2.n désignent la même donnée.
La valeur de l’attribut n est indépendante de l’instance (objet).
3
objA1.n ou ClasseTest.n
objA1.y
objet objA1
objA2.y
objet objA2
objA2.n ou ClasseTest.n
5. Exemple1:
class ClasseTest {
int n;
double y;
}
public class MethodeStatic{
public static void main(String[] args) {
ClasseTest objA1=new ClasseTest();
ClasseTest objA2=new ClasseTest();
// objA2.n = ?
}
}
objA1.n +=4; // objA1.n vaut 4 puisque n vaut 0
// initialisation par défaut des attributs
// objA2.n vaut 0 : initialisation par défauts des attributs.
5
6. Exemple2:
class ClasseTest {
float y;
}
public class MethodeStatic{
public static void main(String[] args) {
ClasseTest objA1=new ClasseTest();
ClasseTest objA2=new ClasseTest();
// objA2.n = ?
}
}
static int n; // la valeur de n est partagée par toutes les instances
objA1.n +=4; // objA1.n vaut 4
// objA2 vaut 4 car champs statique .
// équivalent à ClasseTest.n=4;
6
7. La classe Employé caractérisée par les attributs
code, nom et nbEmployés
Les attributs code et nom sont des caractéristiques
de chaque objet Employé contrairement au champ
nbEmployés qui est une caractéristique
commune à tous les objets (attribut statique)
Chaque objet, instance d’une classe, donne des
valeurs particulières à tous les attributs définis dans
sa classe sauf les attributs statiques ce qui détermine
son état
Attributs de la classe Employé
7
Champs de classe (variable de classe)
: Employé
code =1
nom ="jamil"
: Employé
code =2
nom ="alami "
2 objets de la classe
Employé
Un attribut statique d’une classe est un attribut qui appartient à la classe
et qui est partagé par tous les objets de cette classe. Un attribut statique est
considéré comme étant une variable globale à tous les objets.
Les attributs statiques ne sont pas instanciés dans les objets.
Employé
code : int
nom : String
nbEmployés : static int
8. 8
Une variable de classe (précédée du mot clef static) est partagée par tous les objets de la même classe.
Au début lors de la création des
3 objets chacun des champs x
vaut -58 et des champs y vaut
20,
l'affichage par
System.out.println(...) donne les
résultats suivants qui
démontrent le partage de la
variable x par tous les objets.
Après exécution :
obj1.x = 101
obj1.y = 100
obj2.x = 101
obj2.y = 20
obj3.x = 101
obj3.y = 20
AppliStatic.x = 99
9. Variables de classe
Variable de classe
public class UneClasse
{
public static int compteur = 0;
public UneClasse ()
{
compteur++;
}
}
class AutreClasse
{
public void uneMethode()
{
int i = UneClasse.compteur;
}
}
Utilisation de la variable de classe
compteur dans le constructeur de
la classe
Utilisation de la variable de classe
compteur dans une autre classe
9
10. Exécution ???
class Obj
{ private static long nb=0 ;
public Obj()
{ System.out.print ("++creation objet Obj ; ") ;
nb ++ ;
System.out.println ("il y en a maintenant " + nb) ;
}
}
public class TstObj
{ public static void main (String args[])
{ Obj a ;
System.out.println ("Main 1") ;
a = new Obj() ;
System.out.println ("Main 2") ;
Obj b ;
System.out.println ("Main 3") ;
b = new Obj() ;
Obj c = new Obj() ;
System.out.println ("Main 4") ;
}
}
Exécution
Main 1
++ creation objet Obj ; il y en a maintenant 1
Main 2
Main 3
++ creation objet Obj ; il y en a maintenant 2
++ creation objet Obj ; il y en a maintenant 3
Main 4
Exemple 1 d’utilisation d’un champ de classe
10
11. 2. Méthodes de classe
Ce sont des méthodes qui ont un rôle indépendant d’un objet
spécifique. Elles exécutent une action indépendante d’une
instance particulière de la classe.
La déclaration d’une méthode de classe se fait à l’aide du
mot clé static.
L’appel d’une telle méthode ne nécessite que le nom de la
classe correspondante.
Une méthode de classe ne peut utiliser que des variables de
classe et jamais des variables d'instance. Par contre, une méthode
d'instance peut accéder aux deux catégories de variables.
Une méthode de classe ne peut avoir la même signature
qu’une méthode d’instance
11
12. Exemple
class Test{
…
private static int n; // champs de classe
private float x; // champs usuel
… //ici, on ne peut pas accéder au champs x car champs usuel
… // ici on peut accéder au champs statique n
}
}
………
Test obj ;
Test.f() ; // appel la méthode de classe f de la classe Test
obj.f() ; // reste autorisé, mais déconseillé
public static void f() { // méthode de classe
12
13. Exécution
class Obj
{ private static long nb=0 ;
public Obj()
{ System.out.print ("++ creation objet Obj ; ") ;
nb ++ ;
System.out.println ("il y en a maintenant " + nb) ;
}
public static long nbObj ()
{ return nb ;
}
}
public class TstObj2
{ public static void main (String args[])
{ Obj a ;
System.out.println ("Main 1 : nb objets = " + Obj.nbObj() ) ;
a = new Obj() ;
System.out.println ("Main 2 : nb objets = " + Obj.nbObj() ) ;
Obj b ;
System.out.println ("Main 3 : nb objets = " + Obj.nbObj() ) ;
b = new Obj() ;
Obj c = new Obj() ;
System.out.println ("Main 4 : nb objets = " + Obj.nbObj() ) ;
}
}
Exécution
Main 1 : nb objets = 0
++ creation objet Obj ; il y en a maintenant 1
Main 2 : nb objets = 1
Main 3 : nb objets = 1
++ creation objet Obj ; il y en a maintenant 2
++ creation objet Obj ; il y en a maintenant 3
Main 4 : nb objets = 3
Exemple d’utilisation d’une méthode de classe
13
14. VII. Le mot clé final
L’attribut final indique que la valeur de la variable ne peut être
modifiée : on pourra lui donner une valeur une seule fois dans
le programme.
Variable d’instance final
• Une variable d’instance final est une constante pour chaque
objet.
• Une variable d'instance final peut ne pas être initialisée à sa
déclaration mais elle doit avoir une valeur à la sortie de tous
les constructeurs
14
15. Constantes de classe
• Usage
–
–
–
–
Ce sont des variables de classes déclarées avec le mot-clé final
Ce sont des constantes liées à une classe
Elles sont écrites en MAJUSCULES
Pour y accéder, il faut utiliser non pas un identificateur d’objet
mais le nom de la classe
Exemple:
public class Galerie {
public static final int MASSE_MAX = 150;
}
if (maVoiture.getWeightLimite() <= Galerie.MASSE_MAX)
{...}
15
16. Le mot réservé final
Une classe est déclarée final lorsqu'on ne souhaite pas
qu'elle puisse être sous-classée. Par conséquent, ses
méthodes ne peuvent pas être redéfinies.
Une méthode est déclarée final lorsqu'on ne souhaite
pas qu'elle puisse être redéfinie dans les classes
dérivées.
Une variable déclarée final est une constante.
16
17. Classe java type
Une classe java types contient trois grands types de membres :
toujours déclarer les constructeurs après les attributs et
avant les autres méthodes.
Les constructeurs sont des méthodes particulières, vous devez
public class Rectangle {
// ( 1 ) A ttributs
private double L , l ;
// ( 2 ) Constructeurs
public Rectangle (double L , double l ) { . . . }
// ( 3 ) Méthodes
public double surface (double L , double l) { . . . }
}
Remarque
17