Attribut static

Fermé
Chekchak Messages postés 29 Date d'inscription mardi 31 juillet 2012 Statut Membre Dernière intervention 21 mai 2019 - 4 janv. 2017 à 15:50
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 - 5 janv. 2017 à 07:28
Bonjour , j'essaies d'apprendre a programmer en java dernièrement et je n'arrive pas a trouver sur google la reponse a ma question :

quand on declare un attribut static pour une class, je sais que cet attribut est le meme pour tout les objet de cette class , mais est il modifiable ?
si on a une class A avec un attribut static b
et dans le main on declare 3 objects X Y Z de type A
peut on modifier b ?
pour chaque object? ou une seule fois pour tout les object ? ou jamais?

and sorry for my bad french x)

1 réponse

Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 931
4 janv. 2017 à 17:03
Bonjour

pour chaque object?

Quand tu veux accéder à b est ce que X.b ça marche? Non? C'est parce ce que b n'appartient pas à X, ni à Y ni à Z. Il a appartient à la classe, A.b

ou une seule fois pour tout les object ?

Même réponse


ou jamais?

Là ça dépend s'il est en lecture seule pas moyen de le changer
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
4 janv. 2017 à 22:44
Salut !

"Quand tu veux accéder à b est ce que X.b ça marche?"
Ça affichera un warning à la compilation, mais oui c'est possible.
b appartient à la classe A, donc on devrait y accéder par A.b, cependant X, Y, Z étant des objets de A ils peuvent aussi accéder à A.b, mais c'est bien un seul et unique objet commun. (On peut aussi y accéder par les classes héritées et leurs objet, sous certaines conditions)

"Là ça dépend s'il est en lecture seule pas moyen de le changer"
Le mot clé
static
seul n'empêche pas de modifier la valeur.
En revanche le mot clé
final
pourrait empêcher d'affecter une nouvelle valeur à b (une nouvelle référence d'objet) mais ça n'interdirait pas d'en modifier l'état interne via une méthode de modificaton.

Remarque : La plupart de ces questions s'expérimentent facilement...

Remarque avancée : Une classe en Java étant elle même un objet, on peut lui appliquer certaines méthodes et par exemple faire sauter le mot clé final de la variable à l'exécution pour pouvoir lui réaffecter une nouvelle valeur bien que cela soit interdit à la compilation. Donc on peut toujours modifier une variable ;-)
0
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 931
4 janv. 2017 à 23:12
Je tâtonne en java c'est un fait, mais que X Y ou toto ait accès à A.b, ne veut pas dire que X.b existe, juste que on peut écrie GetB qui retourne A.b et qui s'utilise X.GetB(), non?

Pour le reste de ta réponse, je te suis, je n'ai pas développer car il y a des subtilité que je en maitrise pas.
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
Modifié par KX le 5/01/2017 à 21:48
"ne veut pas dire que X.b existe"
Si, il existe, mais il n'est pas spécifique à l'objet X.
De plus, il est impossible de créer un attribut b supplémentaire qui ne serait pas static, car il aurait le même nom que le b static de A.

"on peut écrie GetB qui retourne A.b et qui s'utilise X.GetB()"
On peut, mais on peut aussi retourner b directement, sans préciser que c'est A.b
Et dans le même ordre d'idée, si la méthode est static, X pourra quand même l'utiliser lui même sans avoir à faire un A.GetB (mais toujours avec un warning).

public class A {
    static int b = 0;

    static int getB() {
        return b;
    }

    int getB2() {
        return b;
    }
    
    public static void main(String[] args) {
        A x = new A();
        A y = new A();
        System.out.println(A.b); // 0
        System.out.println(x.b); // 0 (warning)
        System.out.println(y.b); // 0 (warning)
        A.b = 1;
        System.out.println(A.b); // 1
        System.out.println(x.b); // 1 (warning)
        System.out.println(y.b); // 1 (warning)
        x.b = 2; // (warning)
        System.out.println(A.b); // 2
        System.out.println(x.b); // 2 (warning)
        System.out.println(y.b); // 2 (warning)
        System.out.println(A.getB()); // 2
        System.out.println(x.getB()); // 2 (warning)
        System.out.println(y.getB()); // 2 (warning)
        System.out.println(x.getB2()); // 2
        System.out.println(y.getB2()); // 2
    }
}
0
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 931
5 janv. 2017 à 07:28
Ok, au temps pour moi.
0