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 or not static, là est la question


Sujet :

Langage Java

  1. #1
    Membre expérimenté Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 340
    Points : 1 576
    Points
    1 576
    Par défaut static or not static, là est la question
    Bonjour,

    me voila confronté à une petite subtilité de langage que je ne comprends pas:
    voici l'architecture de l'application que je développe:
    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
    public class maClasseApplication
    {
      /.../ Déclaration de membres en tout genre
      private CTableDonnees m_tableDonnees;
      /.../
    
      public static void main(String[] args)
      {
         /.../
      }
    
      /.../ Reste de l application avec classes en tout genre
      private class maClasseA
      {...}
    
      private classe maClasseB
      etc...
    }
    La classe m_tableDonnees, développée à l'extérieur de la classe de l'application, s'occupe de la gestion des données de l'application, et fournit des méthodes de traitement de celles-ci.

    Lorsque je fais référence à m_tableDonnees depuis maClasseA pour effectuer une opération sur les données, je n'ai pas de réprimande. Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      private class maClasseA
      {
        m_tableDonnees.ajouteOperation(); // OK
      }
    Par contre, si j'appelle cette même méthode depuis la classe main, on me signale que:
    "Il est impossible d'établir une référence statique au champ non statique m_tableDonnees"

    Pourquoi ce qui est permis dans maClasseA, n'est pas faisable dans main ?
    @ bientôt...

    Salut & @+ sur 3W!

  2. #2
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Ta classe A est une inner class. Ce qui veut dire que chaque instance de ta classe A est liée étroitement à une instance de ta classe maClasseApplication.

    Par contre, dans ta méthode main, tu es effectivement dans un contexte qui n'a pas d'instance de maClasseApplication, et donc tu n'as pas accès au membre d'instance m_tableDonnees.

  3. #3
    Membre expérimenté Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 340
    Points : 1 576
    Points
    1 576
    Par défaut
    Merci pour cette réponse, mais il y a un truc qui me chiffonne:

    la classe main est capable d'adresser les méthodes de la classe m_tableDonnees à condition que je déclare celle-ci comme statique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class maClasseApplication
    {
      /.../ Déclaration de membres en tout genre
      private static CTableDonnees m_tableDonnees;
      /.../
    }
    Dans ce cas, je n'ai plus le message d'erreur cité dans le post précédent.

    Je ne comprends pas pourquoi le fait de la déclarer statique débloque le système. Ca change quoi dans la machinerie ?
    @ bientôt...

    Salut & @+ sur 3W!

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 554
    Points : 21 613
    Points
    21 613
    Par défaut
    Static signifie que c'est une classe/méthode/variable de classe. C'est à dire qu'elle est partagée par toutes les instances de la classe, et qu'en fait, on a pas besoin d'une instance pour y accéder.

    Alors que ce qui n'est pas static est une classe/méthode/variable d'instance : qui s'applique uniquement à l'instance qu'on est en train de manipuler.

    Donc, public static void main(String[]) est une méthode statique. Elle ne s'exécute pas au nom d'une instance d'objet, elle s'exécute au nom de la classe. Elle ne peut donc pas accéder aux variables d'instance, parce qu'elle ne sait pas de quelle instance on lui parle. (Ni d'ailleurs s'il existe une instance de la classe. Au démarrage de l'appli, il n'y en a pas.)

    Si tu transforme ta variable d'instance en variable de classe, public static void main(String[]) peut y accéder, parce qu'elle sait de quoi tu lui parles : la variable que tu viens de lui indiquer.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2010
    Messages : 54
    Points : 74
    Points
    74
    Par défaut
    Je rajouterais pour la comparaison qu'avec ton code de départ, si tu avais mis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      private static class maClasseA
      {
        m_tableDonnees.ajouteOperation(); // OK
      }
    tu aurais aussi eu une erreur dans maClasseA

  6. #6
    Membre expérimenté Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 340
    Points : 1 576
    Points
    1 576
    Par défaut
    OK, merci pour ces précisions,

    je vais essayé de trouvé de la documentation là-dessus afin de maitriser le sujet.
    @ bientôt...

    Salut & @+ sur 3W!

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

Discussions similaires

  1. Mobile or not mobile la est la question
    Par Yepazix dans le forum Général Conception Web
    Réponses: 3
    Dernier message: 23/04/2013, 11h36
  2. static or not static
    Par Nalonna dans le forum Langage
    Réponses: 2
    Dernier message: 14/11/2011, 18h30
  3. static or or not static
    Par topolino dans le forum ASP.NET
    Réponses: 9
    Dernier message: 26/09/2008, 13h11
  4. Static transparent qui ne l'est plus après un alt-tab
    Par prgasp77 dans le forum Windows
    Réponses: 3
    Dernier message: 20/12/2006, 00h00
  5. Réponses: 1
    Dernier message: 27/11/2005, 21h45

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