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 :

Calling static variable or method


Sujet :

avec Java

  1. #1
    Nouveau membre du Club
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2009
    Messages : 74
    Points : 39
    Points
    39
    Par défaut Calling static variable or method
    j'ai ce bout de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    package pkgB;
     
    public class koala {
    	public  static int count=1;
     
    	public static void main(String[] args) {
    		koala k=new koala();
    		System.out.println(k.count);
    		k=null;
    		System.out.println(k.count);
     
    	}
    }
    lorsque j'exécute ce bout de code de livre OCA certification il m'affiche deux 0 pour l'affichage de k.count mais ce que me gène c'est ce que après même que j'ai affecté k=null il affiche encore la valeur de count comme 0 mais lorsque j'élimine static avant count il affiche 0 pour le premier System.out.println et ensuite il genere une erreur pour le deuxième affichage Exception in thread "main" java.lang.NullPointerException
    at pkgB.test1.main(test1.java:10)?
    Svp une explication

  2. #2
    Membre éprouvé Avatar de Drowan
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2014
    Messages
    460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2014
    Messages : 460
    Points : 1 014
    Points
    1 014
    Par défaut


    C'est très flou ce que tu nous raconte là... On ne comprend pas trop ce que tu essaye de faire ou ce que tu essaye de comprendre.

    static est un mot clef qui permet de définir que la variable (ou la méthode) appartient à la classe (dans ton exemple à Koala)
    Sans ce mot clef, la variable (ou la méthode) appartient à l'instance (dans ton exemple à k)

    Une variable (ou une méthode) static appartenant à la classe elle est partagée entre toutes les instances.
    Pour éviter les confusions et surtout parce que ça n'as pas d'utilité de faire appelle à une static depuis une instance, on les appelles toujours depuis la classe : donc dans ton exemple : Koala.count au lieu de k.count


    Pour le comportement dans le premier cas, je ne sais pas, quequ'un de meilleur que moi devrait avoir la réponse




    Pour le comportement dans le deuxième cas, il s'explique assez facilement.

    Lors du premier print de la variable il se passe :
    1. on cherche la variable count de la variable k
    2. la variable k contient un objet
    3. l'objet possède un attribut nommé count
    4. on récupere la valeur de cet attribut
    5. Cette valeur peut etre caster en String
    6. la valeur est implicitement convertit en String
    7. On affiche cette String



    Lors du deuxième appel :
    1. on chercher la variable count de la variable k
    2. la variable k contient l'objet null
    3. /!\ Il est interdit d'appeler un attribut sur l'objet null
    4. Le système renvoi une exception
    "On sera toujours mieux installé assis en 1ère que debout en 2nde", un illustre inconnu


    Avant de poser une question vérifiez si elle n'a pas déjà une réponse dans les cours et tutoriels
    Si votre problème est pensez à marquer la conversation comme telle
    Si un message est utile, pertinent, et/ou vous êtes d'accord avec, pensez à à l'inverse s'il est inutile, faux ou que vous n'êtes pas d'accord, pensez à

  3. #3
    Membre expérimenté Avatar de Cincinnatus
    Homme Profil pro
    Développeur d'applications métier
    Inscrit en
    Mars 2007
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur d'applications métier
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2007
    Messages : 592
    Points : 1 681
    Points
    1 681
    Par défaut
    Bonjour,

    Cas 1:
    J'obtiens 1 dans les 2 appels.
    Après k=null, ça fonctionne encore, et même si je n'avais pas encore rencontré ce cas, c'est normal.

    k.count renvoie la valeur de Koala.count lorsque count est static. Que k soit instancié ou null, le résultat est le même.

    Cas 2 :
    cf la réponse de @Drowan.

    STP : N'oublie pas la ponctuation .

    [Complément]
    count étant de type int, si le main est exécuté avant l'initialisation de count = 1, alors count prend la valeur par défaut des int, soit 0.
    Tout dépend du compilateur et de la JVM. A tester avec d'autres versions, si tu prépares une certification.

    @Drowan : je ne pense pas être meilleur développeur...

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 557
    Points : 21 616
    Points
    21 616
    Par défaut
    Hello,

    Citation Envoyé par Cincinnatus Voir le message
    [Complément]
    count étant de type int, si le main est exécuté avant l'initialisation de count = 1, alors count prend la valeur par défaut des int, soit 0.
    Tout dépend du compilateur et de la JVM. A tester avec d'autres versions, si tu prépares une certification.
    Il n'y a pas à tester d'autres versions.
    Le main() ne peut pas être exécuté avant l'initialisation. Java n'autorise pas ce genre de liberté. Si une version exécute le main() avant, alors elle échoue à être compatible avec les définitions du standard Java.

    La raison en est :
    Avant de pouvoir exécuter main(), ou quelque méthode ou constructeur que ce soit, la classe qui le définit doit être chargée.
    Lors du chargement d'une classe, toute son initialisation statique doit être exécutée. Cela inclut l'initialisation des variables statiques.
    Ensuite seulement, la méthode main() sera exécutée.

    (Cela dit, c'est clair et net parce que main() et count sont dans la même classe et ne font pas intervenir d'autre classe. Si l'initialisation d'une classe A réclame le chargement donc l'initialisation d'une autre classe B, cette autre classe B a la possibilité d'utiliser les champs et méthodes de A avant que A n'ait été complètement initialisée. En poussant un peu les limites, on peut tomber sur des cas où le standard Java ne dit pas dans quel ordre les classes seront chargées et initialisées. Et ça peut donc varier selon les versions.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre éprouvé Avatar de Drowan
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2014
    Messages
    460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2014
    Messages : 460
    Points : 1 014
    Points
    1 014
    Par défaut
    Citation Envoyé par Cincinnatus Voir le message
    Drowan : je ne pense pas être meilleur développeur...
    C'était dans le sens "quelqu'un qui a les connaissances sur ce cas, que je n'ai pas"
    "On sera toujours mieux installé assis en 1ère que debout en 2nde", un illustre inconnu


    Avant de poser une question vérifiez si elle n'a pas déjà une réponse dans les cours et tutoriels
    Si votre problème est pensez à marquer la conversation comme telle
    Si un message est utile, pertinent, et/ou vous êtes d'accord avec, pensez à à l'inverse s'il est inutile, faux ou que vous n'êtes pas d'accord, pensez à

  6. #6
    Membre expérimenté Avatar de Cincinnatus
    Homme Profil pro
    Développeur d'applications métier
    Inscrit en
    Mars 2007
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur d'applications métier
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2007
    Messages : 592
    Points : 1 681
    Points
    1 681
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Le main() ne peut pas être exécuté avant l'initialisation. Java n'autorise pas ce genre de liberté. Si une version exécute le main() avant, alors elle échoue à être compatible avec les définitions du standard Java.
    Bonjour,

    Ok, mais hormis un cas de compilateur particulier, je ne comprends pas les résultats de emna1987, à savoir que k.count vaut 0...
    C'est pourquoi j'envisageais un comportement non standard.

  7. #7
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 557
    Points : 21 616
    Points
    21 616
    Par défaut
    Ouh, pardon, je n'avais pas suivi.

    Oui, ça m'étonnerait beaucoup que emna1987 affiche des zéros avec le code montré.

    Mais il semblait qu'on se concentrait sur la présence ou l'absence de NullPointerException, dans le cas static ou non static. Et pas tellement sur le fait que la valeur affichée soit 1 ou 0. Juste sur le fait de pouvoir ou pas afficher une valeur.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. [Joomla!] Strict Standards: Non-static method JLoader::import() should not be called statically in
    Par ouldfella dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 0
    Dernier message: 23/01/2012, 10h04
  2. [FOP] [ERROR] non-static variable this cannot be referenced from a static context
    Par cash3000 dans le forum API standards et tierces
    Réponses: 8
    Dernier message: 05/05/2006, 16h46
  3. erreur: non-static variable
    Par semaj_james dans le forum Langage
    Réponses: 3
    Dernier message: 30/01/2006, 15h56
  4. [debutant] non static variable
    Par Battosaiii dans le forum Langage
    Réponses: 1
    Dernier message: 10/12/2005, 14h39
  5. Passage de variable par methode post ?
    Par oazar dans le forum Flash
    Réponses: 33
    Dernier message: 16/10/2003, 17h03

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