Bonjour,
je prends connaissance de ta réponse à mon message et je tiens à te remercier vivement pour cette explication LUMINEUSE.
Je ferai qq essais ce week end pour bien voir les résultats que tout cela produit et manipuler ces concepts.
Merci encore pour le temps important que tu m'as consacré et très bonnes vacances si tu n'es pas encore parti.
@+
BSide
-------------------------------
Réponse au message :
-------------------------------
> static indique que la méthode ou l'attribut (variable) est de classe c'est à dire commune à toutes les instances, toutes les instances voie la même variable:
>
>
class c > { > private static int i= 0; > > public c() > { > i++; > } > > static void print() > { > System.out.println("i=" + i); > } > > } |
> Si tu fait:
>
c c1= new c(); > c c2= new c(); > |
>
> Et ensuite que tu fasses:
>
ou
>
ou
>
cela produit la même chose.
>
> En fait i et print() sont définis au niveau pas de la classe. Car si tu fait:
>
class cc > { > private static int i= 0; > private int j= 0; > private int k= i; > > public cc() > { > i++; > j++; > } > > public void inc() > { > j++; > } > > public static void s_inc() > { > i++; > } > > void print() > { > System.out.println("i=" + i); > System.out.println("j=" + j); > System.out.println("k=" + j); > } > > } |
> Ici déja tu ne peux plus faire cc.print() car la méthode print() n'est plus de classe mais d'instance c'est à dire que l'exécution de cette méthode se fera spécifiquement à une instance:
>
cc cc1= new cc(); > cc cc2= new cc(); > |
Tu verras qu'en faisant:
>
> et en faisant:
>
la valeur i, et la valeur de j, dans les deux cas on certes la même valeur mais que i as la valeur 2 donc le nombre de fois que la classe est instanciée mais que j a la valeur 1 car à chaque instance l'attribut j est à 0 et donc que chaque instance c'est un nouveu attribut j qui est spécifique à la nouvelle instance. De plus, puisque k prend la valeur de i courante les valeurs de k sont différentes et donc bien spécifiques. Tu peux t'en convaincre en faisant:
>
cc1.inc(); > cc1.print(); > cc2.print(); > |
tu vois bien que seul l'attribut j de l'instance cc1 a été incrémenté. Alor qu'en faisant:
>
cc1.inc(); > cc1.print(); > cc2.print(); > |
L'attribut i a été incrémenté pour les 2 instances.
> Ca aurait été la même chose en faisant:
>
cc.inc(); > cc1.print(); > cc2.print(); > |
Bref à partir de l'indentificateur de la classe.
>
> C'est FAUX une méthode statique ne force pas à utiliser un attribut ou une méthode statique (dits de classes):
>
> class essai > { > public essai() > { > } > > public void f() > { > e.f2(); > } > > static public void f2() > { > } > > public static void main(String[] args) > { > essai e= new essai(); > e.f(); > } > } > |
Ici j'ai appelé la méthode f() qui n'est pas statique à partir la méthode main qui elle est statique.
>
> Il est clair que je ne peux pas faire essai.f() car f n'est pas statique seule une instance peut l'appelée. Mais aussi t'as vu, j'ai fais e.f2(); car une instance peut appeler une méthode statique (de classe) tout comme accéder à un attribut de classe comme j'ai fait dans mes exemples précédents. Car une méthode a déjà les infos de sa propre classe. Alors qu'une classe peut créer plusieurs instance, un appel donc à essai.f() est prohibé car on ne sais pas à quelle instance on se rapporte.
>
> Bref, tu mets en static tout ce qui est commun à tous les objets d'une même classe comme un compteur d'instance comme pour la classe "c"
>
>
Core Breaker 
>