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 :

Définition et qualification de variables statiques


Sujet :

Langage Java

  1. #1
    Membre expérimenté

    Homme Profil pro
    Senior Développeur JEE
    Inscrit en
    Avril 2002
    Messages
    795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Senior Développeur JEE
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2002
    Messages : 795
    Points : 1 660
    Points
    1 660
    Par défaut Définition et qualification de variables statiques
    Bonjour,

    pourquoi doit-on qualifier les variables statiques dans des blocs statiques lorsque le bloc est déclaré avant la variable ??

    Exemple qui fonctionne:

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class TestClass {
     
        static {
            System.out.println(TestClass.A);
            A = 20;
        }
     
        public static final int A;
     
        static {
            System.out.println(A);
        }
    }

    Exemple qui ne fonctionne pas:

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public class TestClass {
     
        static {
            System.out.println(A);
            A = 20;
        }
     
        public static final int A;
     
        static {
            System.out.println(A);
        }
    }

    Merci d'avance pour vos réponses.
    Langages : Java, SQL
    Outils : Eclipse, Intellij
    SGBD : Oracle, PostgreSQL
    Mes Articles

  2. #2
    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
    Hello,

    C'est pas une question de static, c'est une question de final. Une variable (locale ou membre) finale doit être assignée exactement une fois, et cela doit arriver avant qu'on en lise la valeur.

    L'équivalent non-static est :

    - ne marche pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class TestClass {
     
      public TestClass() {
        System.out.println(a);
        a = 20;
        System.out.println(a);
      }
     
      public final int a;
    }
    - marche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class TestClass {
     
      public TestClass() {
        System.out.println(TestClass.this.a);
        a = 20;
        System.out.println(a);
      }
     
      public final int a;
    }
    En fait la question qui se pose, c'est pourquoi ton premier exemple marche. (Enfin, compile. On ne peut pas vraiment dire qu'il marche puisqu'il affiche deux valeurs différentes pour une même variable finale.)
    Je ne savais pas qu'il marcherait. Je pensais effectivement qu'un accès qualifié ou non qualifié serait équivalent pour le compilateur.

    Mais ce n'est pas le cas, parce que dans le cas général, l'accès qualifié pourrait accéder à une variable d'une autre classe, et dans ce cas la contrainte sur final ne serait pas vérifiable : on ne sait pas si elle a bien été initialisée dans cette classe, ou non.
    Java a décidé que l'accès qualifié serait traité de la même manière, que ce soit pour désigner la classe en cours ou n'importe quelle classe.
    Donc, contrairement à ce que j'aurais pensé de prime abord, l'accès qualifié à une variable de la classe en cours, n'est pas 100% équivalent à l'accès direct à cette variable.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre expérimenté

    Homme Profil pro
    Senior Développeur JEE
    Inscrit en
    Avril 2002
    Messages
    795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Senior Développeur JEE
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2002
    Messages : 795
    Points : 1 660
    Points
    1 660
    Par défaut
    Merci pour ton retour.

    Je parlais du static justement parce que qu'il y ait ou non le mot clé final, le résultat sera le même. C'est à dire obligation de qualifier la variable static avant de déclarer celle-ci.

    Compile:
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class TestClass {
     
        static {
            System.out.println(TestClass.A);
            A = 20;
        }
     
        public static int A;
     
        static {
            System.out.println(A);
        }
    }

    Ne compile pas:

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class TestClass {
     
        static {
            System.out.println(A);
            A = 20;
        }
     
        public static int A;
     
        static {
            System.out.println(A);
        }
    }
    Langages : Java, SQL
    Outils : Eclipse, Intellij
    SGBD : Oracle, PostgreSQL
    Mes Articles

  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
    Ah, pardon, je n'avais pas remarqué non plus. Ceci dit, la même chose s'observe à nouveau sans les static. Dans un bloc d'initialisation, statique ou d'instance, on ne peut pas accéder à la valeur d'une variable avant que cette variable ait été déclarée.

    Mais concrètement ce n'est pas qu'il faut qualifier le nom si la variable est déclarée après. C'est qu'il faut déclarer la variable avant, point barre.

    Ça compile quand même en qualifiant le nom de la variable, pour raisons similaires à au-dessus : en accédant à une variable de classe, il n'y a pas de question de déclarée avant ou après. Et pour homogénéité ça s'applique même si la classe qualifiée est la classe en cours.
    Mais on ne peut pas dire que ça marche, car ça ne respecte pas une règle "évidente" : si la variable est déclarée avec une assignation de valeur, y accéder de cette manière avant la déclaration, ne verra pas la valeur assignée. Pour le dire autrement, ça ne sert à rien, puisque la variable n'a pas encore la valeur qu'il serait utile de consulter.


    Maintenant, pourquoi est-ce qu'une variable ne doit pas être lue dans un bloc d'initialisation avant d'être déclarée, alors ça... Java l'a décidé.

    Ça paraît logique : une déclaration de variable peut potentiellement inclure une première assignation de cette variable. Donc véritablement "faire" quelque chose : évaluer une expression et assigner son résultat à la variable.
    Et les blocs d'initialisations s'exécutent dans l'ordre où ils apparaissent dans la classe. Donc logiquement les déclarations de variables, en dehors de ces blocs, devraient aussi s'exécuter dans l'ordre de leur apparition, entre les deux blocs où elle se situe. Et en cela, c'est peu pertinent d'utiliser la variable avant que sa valeur de départ ne lui ait été assignée.
    En généralisant cette règle, elle s'applique aussi si la déclaration de variable ne contient pas d'assignation et n'exécute donc rien du tout.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre expérimenté

    Homme Profil pro
    Senior Développeur JEE
    Inscrit en
    Avril 2002
    Messages
    795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Senior Développeur JEE
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2002
    Messages : 795
    Points : 1 660
    Points
    1 660
    Par défaut
    Maintenant si tu lances ce bout de code, tu remarqueras qu'il affichera 0 dans le premier bloc statique.

    Mais je suis d'accord sur l'absurdité d'utiliser une variable avant que celle-ci ait été déclarée, statique ou pas.

    Je révisais mes gammes pour le OCA et OCP et je suis tombé sur ce cas assez bizarre en faisant des tests.

    Et j'ai beau retourner dans tous les sens la spec java, il n'y est fait mention nulle part.
    Langages : Java, SQL
    Outils : Eclipse, Intellij
    SGBD : Oracle, PostgreSQL
    Mes Articles

  6. #6
    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 Stessy Voir le message
    Maintenant si tu lances ce bout de code, tu remarqueras qu'il affichera 0 dans le premier bloc statique.
    Oui, mais il affichera 0 quelle que soit la valeur donnée à A lors de sa déclaration.

    Citation Envoyé par Stessy Voir le message
    Et j'ai beau retourner dans tous les sens la spec java, il n'y est fait mention nulle part.
    8.3.2.3: Restrictions on the use of Fields during Initialization

    Bien sûr, la raison pour laquelle l'usage est accepté avec un nom qualifié, est pure spéculation de ma part. Mais elle me semble logique.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre expérimenté

    Homme Profil pro
    Senior Développeur JEE
    Inscrit en
    Avril 2002
    Messages
    795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Senior Développeur JEE
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2002
    Messages : 795
    Points : 1 660
    Points
    1 660
    Par défaut
    Je pense que pour moi la raison est celle que tu as donnée ici.

    Ça compile quand même en qualifiant le nom de la variable, pour raisons similaires à au-dessus : en accédant à une variable de classe, il n'y a pas de question de déclarée avant ou après. Et pour homogénéité ça s'applique même si la classe qualifiée est la classe en cours.
    Le compilateur ne doit faire aucune différence, que la variable accédée soit celle de la classe en cours ou une autre, il faut garder la cohérence pour tout le monde.

    C'est vrai que je n'avais pas pensé à analyser la chose sous cet angle là.

    Bon ben je pense que ça répond à ma question.

    Merci.
    Langages : Java, SQL
    Outils : Eclipse, Intellij
    SGBD : Oracle, PostgreSQL
    Mes Articles

Discussions similaires

  1. définition de variables statiques
    Par kenny49 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 12/04/2007, 17h43
  2. [Tableaux] Probleme variable statique dans une classe
    Par Joe Le Mort dans le forum Langage
    Réponses: 7
    Dernier message: 31/08/2006, 11h35
  3. contenu d'une variable définit par une autre variable
    Par PuppeT mAsTer dans le forum Langage
    Réponses: 4
    Dernier message: 04/07/2006, 19h32
  4. Utilisation d'une variable statique
    Par kurkaine dans le forum C++Builder
    Réponses: 6
    Dernier message: 14/06/2006, 13h49
  5. Exportation de variable statique
    Par Laurent Gomila dans le forum C++
    Réponses: 16
    Dernier message: 31/08/2005, 16h32

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