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

Langage Java Discussion :

[static][reference Memoire]


Sujet :

Langage Java

  1. #1
    Membre expérimenté
    Avatar de fabszn
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2002
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2002
    Messages : 974
    Points : 1 638
    Points
    1 638
    Par défaut [static][reference Memoire]
    Hello,

    Dans l'exemple ci-dessous :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    public class Test {
     
     
     
        /**
         * @param args
         */
        public static void main(String[] args) {
     
            StaticClass.var1="toto"; //ligne1
     
        }
     
    }
     
    public class StaticClass {
     
        public static String var1 = null;
     
     
     
        public static String getString()
        {
            return var1;
        }
     
    }
    Est ce que lorsque la ligne 1 est executée une référence en mémoire est créée?
    C'est à dire que tant que le garbage collector n'est pas passé la classe est référencée en mémoire?
    Pour une instance, tant qu'elle est référencé quelque part , elle existe en mémoire. Est ce que c'est la même chose pour mon exemple ci-dessus?

    J'espere que je ne suis pas trop confus dans mes explications.
    Si vous avez besoin d'explications complémentaires je suis à votre disposition!

    Merci d'avance pour vos éclairements!
    @+

    Fabszn
    Twitter : @fsznajderman

    N'oubliez pas le bouton
    Comment bien poser ses questions sur le forum


  2. #2
    Membre éclairé Avatar de Pollux
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    706
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2005
    Messages : 706
    Points : 680
    Points
    680
    Par défaut
    Bonjour,

    Ce qu'il faut savoir tout d'abord c'est que référence il y a du moment que tu écris une ligne du genre

    Maintenant dans ton cas, au chargement de ta classe StaticClass, la référence var1 est déjà créé! Elle n'est cependant pas instanciée. La référence ne pointe donc sur aucun objet en mémoire.

    Lorsque tu fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     StaticClass.var1="toto";
    tu assignes une valeur (une adresse mémoire en fait) à ta référence. Ce qui veut dire qu'en mémoire toto prend une place (dans le pool de Strings pour être précis).

    J'espère avoir pu t'aider!
    Pour chaque langage existe une faq / N'oubliez pas de lire les règles du forum

  3. #3
    Membre expérimenté
    Avatar de fabszn
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2002
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2002
    Messages : 974
    Points : 1 638
    Points
    1 638
    Par défaut
    Hello,

    Merci pour ta réponse!!

    En fait, je me rend compte que je n'ai pas été assez précis dans ma question.
    Je voulais axer ma question sur le mot clef static.

    Voila mon exemple mais complété :

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    /**
         * @param args
         */
        public static void main(String[] args) {
     
            StaticClass.var1="toto";//ligne1
            StaticClass obj = new StaticClass();
            StaticClass obj1 = new StaticClass();
            System.out.println("obj = "+obj.getString());
            System.out.println("obj1 = "+obj1.getString());    
         }
     
    package com.test;
     
    public class StaticClass {
     
        private static String var1 = null;
     
        public static String getString()
        {
            return var1;
        }
     
     
    }
    En reprenant ce que tu m'as dit :
    Lors de l'execution de la ligne1, un valeur est assignée à la référence (l'adresse mémoire) réservée pour ma chaine de caractère (Ok?).


    Donc par rapport à ta réponse j'en déduis qu'une référence (une adresse donc!) est aussi réservé pour la classe StaticClass.
    Ce qui me laisse sans réponse c'est la notion induite par le mot clef static.
    Je vois clairement à quoi il sert au niveau du langage JAVA (et même plus généralement au niveau d'autre langage); Il permet de déclarer des attibuts ou des méthodes de Classe et non d'instance.

    La question que je me pose est :

    Pour une variable d'instance je vois clairement le mécanisme lié à une variable d'instance. Lorsque je créer une instance de la classe Toto, j'imagine qu'un attribut de cette classe initialisé sera résidant en mémoire tant que l'objet existera (qu'il ne sera pas garbage collecté). Maintenant lorsque qu'un attribut static est initialisé comme sur la ligne 1, est ce que la JVM créer une "intance" de la classe StaticClass (je ne pense pas que se soit le terme exact) qui me permettra lorsque j'exécute les lignes 2,3,4,5 de retrouver la valeur l'attribut var1.
    Maintenant lorsque les lignes 4,5 sont exécutées la valeur 'toto' est bien renvoyée.

    Pour essayer d'être un peut plus clair, voila la question posée différement:

    Est ce qu'un attribut déclaré static à les même proriétés, vis à vis de sa classe, qu'une variable d'instance. Mise à part la notion d'attribut de classe et d'attribut d'instance?

    En fait, je pose la question suivante car je me dit qu'un attribut static ne peut pas avoir d'etat. En rêgle générale, lorsque l'on utilise une méthode static on ne garde pas d'etat, on appelle généralement cela un méthode 'utilitaire'.

    Cette question peut paraitre naive, mais j'avoue que je préfère avoir l'air 'naif' un moment plutot que de ne pas comprendre .

    J'espere que je n'ai pas été trop confus. j'avoue que la question n'est pas forcement évidente à poser..

    En tout cas merci d'avance pour votre aide!
    @+

    Fabszn
    Twitter : @fsznajderman

    N'oubliez pas le bouton
    Comment bien poser ses questions sur le forum


  4. #4
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    En fait, la classe n'est pas "instanciée", mais chargée en mémoire par le ClassLoader...

    C'est à ce moment là que les références statiques sont déclarée et/ou initialisées.

    Un code static d'initialisation est exécuté au moment où la classe est chargée en mémoire. Les ressources statiques existent tout pendant que la classe est chargée. Et elles n'existent qu'en exemplaires uniques...

    Essaie ce code:
    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
     
    class C {
      private static int i;
     
     
      static {
        System.out.println("static block");
         i=5;
      }
     
      public static void main (String[] a){
        System.out.println("main");
        new C();
      }
     
      C(){System.out.println("constructor");}
    }
    qui doit d'abord passer dans le bloc static, puis dans le main, puis dans le constructeur


    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  5. #5
    Membre expérimenté
    Avatar de fabszn
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2002
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2002
    Messages : 974
    Points : 1 638
    Points
    1 638
    Par défaut
    Hello,

    Merci pour cette réponse!

    Oui je connaissais le principe de fonctionnement et de chargement du bloc static. Par contre grace à ton explication concernant le délai durant lequel une variable static reste en mémoire ca par contre ca éclaire bcp ma lanterne!!

    Une petite question pour rebondir sur ce que tu m'as dit.

    Donc une variable déclarée static est présente en mémoire au moment du chargement de la classe par le classloader et durant tout le temps ou est ou la classe est chargée en mémoire. Ok!
    Maintenant, si il n'existe aucune référence sur la classe chargée en mémoire (c'est à dire qu'aucune autre classe annexe ou instance de classe n'utilisent cette variable depuis son chargement en mémoire) celle ci sera garbage collecté au prochain passage du garbage collector; Donc cette variable n'existera plus en mémoire.

    Par exemple :
    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
     
    class C {
      private static int i;
     
     
      static {
        System.out.println("static block");
         i=5;
      }
     
      public static void main (String[] a){
        System.out.println("main");
        new C();
      }
     
      C(){System.out.println("constructor");}
    }
    Dans ton exemple, tant que l'instance de C existe en mémoire (donc maintient une référence sur la variable static) , celle ci existera en mémoire et ne sera pas garbage collecté.

    En revanche si le code avait été comme cela :
    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
     
    class C {
      private static int i;
     
     
      static {
        System.out.println("static block");
         i=5;
      }
     
      public static void main (String[] a){
        System.out.println("main");
     
      }
     
      C(){System.out.println("constructor");}
    }
    La variable serait disponible tres peut de temps en mémoire car aucune référence n'est maintenue sur la variable donc au premier passage du GC celle ci disparaitra de la mémoire...

    Est ce que j'ai bon?

    Merci d'avance , et encore , pour votre aide!
    @+

    Fabszn
    Twitter : @fsznajderman

    N'oubliez pas le bouton
    Comment bien poser ses questions sur le forum


  6. #6
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Attention, il ne faut pas confondre "référence sur une instance" et "chargement d'une classe"

    Même si aucune instance de ta classe n'est créé, les variables static existent quand même, dès le chargement de la classe et jusqu'à fermeture du programme (je ne sais pas si il est possible de "décharger" une classe une fois chargée)

    Dans ce cas là par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    class A {static int i=5;}
    ...
    Class a = Class.forName("A"); // La classe est chargée en mémoire, A.i existe!
    En tout cas, les variables static ne sont pas collectées par le GC si aucune instance de la classe n'existe...
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  7. #7
    Membre expérimenté
    Avatar de fabszn
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2002
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2002
    Messages : 974
    Points : 1 638
    Points
    1 638
    Par défaut
    Hello,

    Merci merci merci bcp pour ton aide et tes éclairement!!

    je pense avoir compris maintenant le fonctionnement d'un attribut static (au niveau de la gestion en mémoire).

    J'ai une dernière petite question (j'espère ) .
    Imaginons qu'une variable static soit initialisée au moment du chargement de la classe par le classLoader (par l'intermédiaire d'un bloc static).
    Donc ma variable reside bien en mémoire avec sa valeur. Est que pour une raison X , la variable pourrait se retrouver avec la valeur null à la place de sa valeur initiale (sans modification explicite , biensur !)

    Merci d'avance pour ton aide!

    PS:Est ce que tu connaitrais, par hasard, un document qui parlerait de ces apsects : la gestion des instances en mémoire etc..? (même en anglais)
    @+

    Fabszn
    Twitter : @fsznajderman

    N'oubliez pas le bouton
    Comment bien poser ses questions sur le forum


  8. #8
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Citation Envoyé par fabszn
    Est que pour une raison X , la variable pourrait se retrouver avec la valeur null à la place de sa valeur initiale (sans modification explicite , biensur !)
    non, sans modification explicite il n'y a pas de raison qu'elle passe à null...

    le seul problème pourrait être en environnement multi-thread, un thread pourrait voir la variable null pendant qu'elle est construite, mais ça n'agit pas au niveau des blocs static, qui sont garantit thread-safe

    pour les documents, je n'ai rien sous la main, mais tous les (bons) livres java en parlent plus ou moins

    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  9. #9
    Membre expérimenté
    Avatar de fabszn
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2002
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2002
    Messages : 974
    Points : 1 638
    Points
    1 638
    Par défaut
    Hello,

    Merci bcp pour ton aide!

    Je vais me chercher un bon livre pour mes apres midi au soleil
    @+

    Fabszn
    Twitter : @fsznajderman

    N'oubliez pas le bouton
    Comment bien poser ses questions sur le forum


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 24/05/2011, 23h49
  2. Erreur "static reference to the non-static field"
    Par NetLandGim dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 04/04/2011, 00h55
  3. Cannot make a static reference to the non-static method readValues
    Par delta07 dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 30/06/2010, 15h14
  4. Réponses: 5
    Dernier message: 18/05/2007, 12h30
  5. Cannot make a static reference to the non-static method
    Par semaj_james dans le forum Langage
    Réponses: 5
    Dernier message: 11/05/2006, 23h10

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