IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Comment fonctionnent les méthodes de classe statique?


Sujet :

avec Java

  1. #1
    Membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Novembre 2015
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 156
    Points : 52
    Points
    52
    Par défaut Comment fonctionnent les méthodes de classe statique?
    Bonsoir!

    Après mes tentatives de suivre le niveau de la classe en cherchant comment instancier les classes internes, j'ai pris le partis de retourner vers les basiques que je ne maitrise pas forcément...

    Je cherche à comprendre comment fonctionne le mot-clef static à l'aide du cours de jmdoudoux et le livre de Monsieur Eckel (si vous avez d'autres idées pour m'aider à progresser, je suis preneur!


    4.3.2. Le mot clé static

    Le mot clé static s'applique aux variables et aux méthodes.

    Les variables d'instance sont des variables propres à un objet. Il est possible de définir une variable de classe qui est partagée entre toutes les instances d'une même classe : elle n'existe donc qu'une seule fois en mémoire. Une telle variable permet de stocker une constante ou une valeur modifiée tour à tour par les instances de la classe. Elle se définit avec le mot clé static.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Exemple :
    public class Cercle {
        static float pi = 3.1416f; 
        float rayon;
        public Cercle(float rayon) { this.rayon = rayon; }
        public float surface() { return rayon * rayon * pi;}
    }
    Il est aussi possible par exemple de mémoriser les valeurs min et max d'un ensemble d'objets de même classe.

    Une méthode static est une méthode qui n'agit pas sur des variables d'instance mais uniquement sur des variables de classe. Ces méthodes peuvent être utilisées sans instancier un objet de la classe. Les méthodes ainsi définies peuvent être appelées avec la notation classe.methode() au lieu de objet.methode() : la première forme est fortement recommandée pour éviter toute confusion.

    Il n'est pas possible d'appeler une méthode d'instance ou d'accéder à une variable d'instance à partir d'une méthode de classe statique.
    Je ne comprends pas la dernière phrase même si elle est explicitée par la phrase au-dessus, auriez vous un exemple?
    Je n'ai pas bien compris pourquoi in écrit

    et non pas d'accord, pour les instances cela permet de stocker une constante ou une valeur modifiée tour à tour par les instances de la classe. mais final aussi non?

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Citation Envoyé par AntoineCompagnie Voir le message
    Je ne comprends pas la dernière phrase même si elle est explicitée par la phrase au-dessus, auriez vous un exemple?
    Il n'est pas possible d'appeler une méthode d'instance ou d'accéder à une variable d'instance à partir d'une méthode de classe statique.
    Une méthode statique est une méthode de classe : elle n'est liée à aucune instance particulière. Donc forcément, il n'est pas possible d'accèder à une variable ou méthode d'une instance, sauf si on a la référence de cette instance bien sûr. Pourquoi ? Parce que la variable d'instance est différente pour chaque instance : quelle valeur (de quelle instance) devrait-on utiliser ? Idem pour l'appel de méthodes d'instances, puisque celles-ci utilisent des variables instances, ou retourne une valeur propre à chaque instance.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    public class Exemple {
     
        private int uneVariableDInstance;
     
        public int uneMethodeDInstance(int parametre) {
               return uneVariableDInstance + parametre);
        }
     
        public static int uneMethodeStatic(int parametre) {
               return uneVariableDInstance + parametre; // IMPOSSIBLE
        }
     
        public static int uneMethodeStatic(Exemple uneInstance, int parametre) {
               return uneInstance.uneVariableDInstance + parametre; // POSSIBLE : on précise l'instance pour laquelle on veut la valeur de la variable d'instance
        }
     
    }



    Citation Envoyé par AntoineCompagnie Voir le message
    Je n'ai pas bien compris pourquoi in écrit

    et non pas d'accord, pour les instances cela permet de stocker une constante ou une valeur modifiée tour à tour par les instances de la classe. mais final aussi non?
    Non, final veut dire qu'on ne peut pas changer la valeur après la première affectation, qui doit être faite avant la fin de l'instanciation (donc soit dans la déclaration, soit avant la fin du constructeur). Alors que static veut dire que la variable est propre à la classe, et aucune instance en particulier, c'est-à-dure comme si la valeur de la variable était toujours la même pour toutes les instances. Donc static et final n'ont rien à voir (ils sont complémentaires, dans le cadre de déclaration de constantes du type private static final int answerToTheUltimateQuestionOfLifeTheUniverseAndEverything = 42; par exemple).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre confirmé Avatar de julien-blaise
    Homme Profil pro
    Développeur Java et C#
    Inscrit en
    Mai 2005
    Messages
    458
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Java et C#

    Informations forums :
    Inscription : Mai 2005
    Messages : 458
    Points : 620
    Points
    620
    Par défaut
    Hello,

    Pour compléter, les méthodes ou variables static, aussi appelé méthode et variable de classe, peuvent être utiliser sans qu'aucune instance de la classe ne soit créés. Faire appel à une variable d'instance dans une méthode static, c'est courir le risque qu'elle ne soit pas instancier et de partir en exception.

    Si on reprend ton exemple, pi est une donnée que l'on voudrait commune à toute les instances car sa valeur est connue et ne doit surtout pas changer d'une instances à l'autre pour ne pas fausser les résultats du calcul de la surface.

    Je pense même que le mot-clé final devrait être utiliser dans ce cas pour empêcher toute modification de sa valeur.

    En résumé :
    - static : variable ou méthode commune à l'ensemble des instances. Typiquement une donnée commune ou une méthode qui peut être utilisé sans instance (la classe Math en propose tout un tas)
    - final : pour créer une constante. Dans le cas d'une variable, on fixe sa valeur (type primitif) ou sa référence (type objet). Dans le cas d'un objet, tu ne pourras donc pas faire de nouveau un new sur la variable après sa première instanciation. Dans le cas d'une méthode, interdiction de la surcharger.

    Est ce assez clair ?

    A+

    Julien
    "La violence est le dernier refuge de l'incompétence" Salvor Hardin, Fondation

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par julien-blaise Voir le message
    Faire appel à une variable d'instance dans une méthode static, c'est courir le risque qu'elle ne soit pas instancier et de partir en exception.
    En fait, c'est juste pas possible. Dans ton code, tu écris "et là, tu utilises cette variable d'instance" et le compilateur te répond "mais... Laquelle, d'instance ? Je vois pas de quelle instance tu me parles, moi !"
    Tant que le compilateur n'est pas content, le programme ne sera pas compilé et ne pourra pas s'exécuter.


    Citation Envoyé par julien-blaise Voir le message
    Si on reprend ton exemple, pi est une donnée que l'on voudrait commune à toute les instances car sa valeur est connue et ne doit surtout pas changer d'une instances à l'autre pour ne pas fausser les résultats du calcul de la surface.
    C'est pas tant une histoire de changer (vu que ça, en effet, c'est le boulot de final,) mais plutôt que ça sert à rien de se traîner la même valeur dupliquée à chacune des instances qu'on va créer. Au lieu d'une copie par instance, il vaut mieux qu'elle soit là une fois pour tout le programme, sans copie.

    En exagérant un peu on peut dire que c'est histoire d'économiser la mémoire, vu que ces copies ne servent à rien. En réalité, en mémoire ça ne change pas grand-chose, c'est plutôt une question de code propre, bien structuré et compréhensible.

    Citation Envoyé par julien-blaise Voir le message
    - final : pour créer une constante. Dans le cas d'une variable, on fixe sa valeur (type primitif) ou sa référence (type objet). Dans le cas d'un objet, tu ne pourras donc pas faire de nouveau un new sur la variable après sa première instanciation. Dans le cas d'une méthode, interdiction de la surcharger.
    Alors attention. Déjà, final pour les variables, les méthodes ou les classes c'est jamais la même chose. Il y a toujours un peu l'idée de "on peut pas y refaire des trucs après y avoir fait la première fois" mais c'est assez vague.
    Là on parle des variables.

    Une variable final c'est une variable qu'on ne peut plus assigner après la première fois.
    Exemple : final int x = 3; et après je ne peux plus faire x = quoiQueCeSoit;.
    C'est pareil avec les objets et ça n'a rien à voir avec new, exemple : final LocalDate startDate = LocalDate.now();. Et après je ne peux plus faire startDate = ....

    Une constante, ça veut dire autre chose, ça va plus loin que ça. Une constante ça aura toujours la même valeur même entre deux démarrages du programme. Disons qu'une constante s'est fait assigner sa valeur avant même que le programme démarre. Oui, une constante est forcément final, mais une variable final n'est pas forcément une constante. Par exemple PI ça devrait être une constante, ça vaudra 3.14 et des brouettes à chaque fois qu'on lancera le programme. dateDeDemarrage, par contre, ce n'est pas une constante. Ça vaudra la date qu'il était quand on a démarré.

    Et enfin,

    Citation Envoyé par julien-blaise Voir le message
    Dans le cas d'une méthode, interdiction de la surcharger.
    Dans le cas des méthodes, final interdit de les redéfinir (faire en sorte, dans une classe fille, que la méthode fasse autre chose que ce qu'elle fait dans sa classe mère.)
    Mais pas du tout de les surcharger (définir, dans la même classe ou dans les classes filles, d'autres méthodes de même nom mais avec des paramètres différents. À part le fait que le nom est le même, il n'y a aucun lien et aucun contrôle entre des méthodes surchargées.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Comment fonctionnent les classes et id en css
    Par maleck dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 21/03/2010, 19h37
  2. Comment lister les méthodes d'une Form ?
    Par WebPac dans le forum Langage
    Réponses: 12
    Dernier message: 08/03/2006, 18h45
  3. [FLASH 8] Comment fonctionne les clips
    Par steeves5 dans le forum Flash
    Réponses: 3
    Dernier message: 27/01/2006, 10h23
  4. Comment fonctionnent les index des options d'un select ?
    Par pekka77 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 31/10/2005, 18h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo