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 :

Accessibilité entre Classes


Sujet :

avec Java

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 757
    Points : 208
    Points
    208
    Par défaut Accessibilité entre Classes
    Bsr à tous,
    J'ai deux classes :
    Classe mère :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public class FenetrePret extends JFrame {//extends JApplet pour l'integre dans une page Web
    	//Variables d'Instance
    	private JLabel lblMontant,lblTaux,lblAnnees,lblMensualite;
    	private JTextField txtMontant,txtMensualite;
    	public JTextField txtTaux;
    ...
    et la classe fille :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public class FenetrePret2 extends FenetrePret {
    	private String[][] taux = {{"10","15","20","25","30","35","40"},{"0.8","1.2","1.54","2.83","2.99","3.40","3.99" }};
    	private String ch;
     
     
    	//Constructeur
    	public FenetrePret2() {
    		cboAnnees.addActionListener(new GesListe());
    		cmdQuitter.addActionListener(new GesListe());
    		txtTaux.setEditable(false);
    J'ai une question concernant le JTexField "txtTaux" que j'utilise dans les deux classes: étant donné que la classe fille FenetrePret2 hérite de FenetrePret je pensais ne pas être obligé de rendre "public" txtTaux pour pouvoir l'utiliser dans la classe fille, alors que si... j'ai essayé des Accesseurs (Get) mais apparement cela ne marche pas pour des JTextField, si quelqu'un a des infos sur ce sujet Merci

  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 xeron33 Voir le message
    J'ai une question concernant le JTexField "txtTaux" que j'utilise dans les deux classes: étant donné que la classe fille FenetrePret2 hérite de FenetrePret je pensais ne pas être obligé de rendre "public" txtTaux pour pouvoir l'utiliser dans la classe fille, alors que si...
    Tu peux déclarer la variable protected :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    protected JTextField txtTaux;
    Cela donne la visibilité aux classes qui héritent de FenetrePret, et aux classes du même package.
    Si tu ne veux pas qu'une classe "fille" puisse modifier la variable (mettre la référence d'un autre JTextField à la place du tien), tu peux la déclarer en plus final (il faut en revanche que quand la construction de FenetrePret est terminée, que la variable ait une valeur, donc soit l'affecter dans le constructeur, soit l'initialiser dans la déclaration).

    Citation Envoyé par xeron33 Voir le message
    j'ai essayé des Accesseurs (Get) mais apparement cela ne marche pas pour des JTextField,
    Il n'y a pourtant pas de raison : on peut faire des attributs accessibles par getter (ou setter) de n'importe quel type.

    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
    public class FenetrePret extends JFrame {
     
        private JTextField txtTaux;
        /*
             ...
        */
     
        public FenetrePret(){
            /*
             ...
            */
            txtTaux  = new JTextField();
     
        }
     
        /*
             ...
        */
     
        protected JTextField getTextTaux() {
              return txtTaux;
        }
     
    }
    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 FenetrePret2 extends FenetrePret {
     
        /*
             ...
        */
     
    	public FenetrePret2() {
    	    getTextTaux().setEditable(false);
                /*
                     ...
                */
           }
     
        /*
             ...
        */
     
    }
    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 actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 757
    Points : 208
    Points
    208
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Salut,

    Il n'y a pourtant pas de raison : on peut faire des attributs accessibles par getter (ou setter) de n'importe quel type.
    ********************************
    Bonsoir merci pour ta réponse, je ne comprends pas j'ai fait la même chose que toi et il me répond "The field FenetrePret.txtTaux is not visible"

    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 FenetrePret() {
    		JPanel p1=new JPanel(new GridLayout(4,2,5,5));
    		JPanel p2=new JPanel(new GridLayout(1,3,5,5));
    		lblMontant=new JLabel("Montant");
    		lblTaux=new JLabel("Taux");
    		lblAnnees=new JLabel("Annees");
    		lblMensualite=new JLabel("Mensualité :");
    		txtMontant=new JTextField();
    		txtMontant.addKeyListener(new GestionFenetre());//Abonnement à la méthode qui se trouve dans la Classe "GestionFenetre" 
    		txtTaux=new JTextField();
    ...
    }
    }
    	protected JTextField getTextTaux() {
            return txtTaux;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class FenetrePret2 extends FenetrePret {
    	private String[][] taux = {{"10","15","20","25","30","35","40"},{"0.8","1.2","1.54","2.83","2.99","3.40","3.99" }};
    	private String ch;
    	
    	
    	//Constructeur
    	public FenetrePret2() {
    		cboAnnees.addActionListener(new GesListe());
    		cmdQuitter.addActionListener(new GesListe());
    		getTextTaux().setEditable(false);   "The field FenetrePret.txtTaux is not visible"
    

  4. #4
    Invité
    Invité(e)
    Par défaut
    Salut

    Ton erreur vient du fait que tu as instancié ta variable txtTaux dans le constructeur de ta classe et que c'est donc une variable locale.
    Si tu ne sait pas ce que c'est, une variable locale est une variable instanciée dans une méthode ou un constructeur, sans modifieur (private, public, etc...) et qui ne peut être utilisée que dans cette même méthode ou constructeur.
    Pour que ton code marche il faut plutôt faire ceci:

    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
     
    public class FenetrePret {
     
        private JPanel p1=new JPanel(new GridLayout(4,2,5,5));
        private JPanel p2=new JPanel(new GridLayout(1,3,5,5));
        private lblMontant=new JLabel("Montant");
        private lblTaux=new JLabel("Taux");
        private lblAnnees=new JLabel("Annees");
        private lblMensualite=new JLabel("Mensualité :");
        private txtMontant=new JTextField();
        private txtMontant.addKeyListener(new GestionFenetre());//Abonnement à la méthode qui se trouve dans la Classe "GestionFenetre" 
        private txtTaux=new JTextField();
     
     
        protected JTextField getTextTaux() {
            return txtTaux;
        }
     
    }

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 757
    Points : 208
    Points
    208
    Par défaut
    Bjr et merci pour ton aide et ton explication bien utile, par contre si je peux me permettre,il faut rajouter dans ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private txtTaux=new JTextField();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private JTextField txtTaux=new JTextField();
    pour que ça fonctionne.Je pense que tu le savais et que c'est simplement une erreur d'étourderie de ta part.
    En fait l'intérêt est relatif de faire des get dans ce cas là, car je pouvais aussi comme je l'avais fais au départ changer ma variable statique en "protected" ou "public" et j'avais access à celle ci sans get, mais ca ma permit de savoir utiliser les get.
    Une question quelle est la différence entre variables statiques et locales ? C'est juste une appellation différente ?
    MErci à toi

  6. #6
    Invité
    Invité(e)
    Par défaut
    Non ce n'est pas du tout la même chose. En fait une variable static est une variable accessible sans avoir à instancier la classe qui la contient.

    Par exemple imaginons que j'ai une classe Action et que je veuille faire une méthode manger() et une méthode boire(). Voila la classe :

    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
     
    public class Action{
     
        public static manger(){ // Cela marche aussi avec les variables
     
             System.out.prinln("Miam Miam !");
     
        }
     
        public static boire(){
     
             System.out.prinln("Slurp");
     
        }
     
    }
    Ensuite je fais une classe Personne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public class Personne{
     
        public void besoin(){
     
            Action.manger();
            Action.boire();
     
        }
     
    }
    Et si mes méthodes n'étaient pas static j'aurais du faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public class Personne{
     
        private Action a = new Action();
     
        public void besoin(){
     
            a.manger();
            a.boire();
     
        }
     
    }
    PS : le txtTaux est instancié en ligne 12

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 757
    Points : 208
    Points
    208
    Par défaut
    Merci pour ta réponse en effet cela est plus clair maintenant par contre j'ai dû modifier ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      public static manger(){ // Cela marche aussi avec les variables
     
             System.out.prinln("Miam Miam !");
     
        }...
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public static void manger(){ // Cela marche aussi avec les variables
     
            System.out.println("Miam Miam !");
     
       }
    D'autre part tu me dis :
    oui mais mais il manque le type de variable en effet tu codes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     private txtTaux=new JTextField();
    alors qu'il faut lui fournir son type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private JTextField txtTaux=new JTextField();
    Merci à toi pour tes explications
    A+

  8. #8
    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
    Citation Envoyé par Aimka_ Voir le message
    Ton erreur vient du fait que tu as instancié ta variable txtTaux dans le constructeur de ta classe et que c'est donc une variable locale.
    Non. Pas du tout.

    La variable txtTaux dans le code de @Xeron n'est pas eu tout static. Et tu confonds déclaration et initialisation. Et on instancie pas une variable. On instancie un objet, avec new, comme quand on écrit :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class Truc {
     
        public Truc() {
     
              new String("truc"); // instanciation d'un objet de classe String
     
        }
     
    }
    Tu remarqueras d'ailleurs que l'instanciation n'a aucun rapport avec la notion de variable, et que, d'ailleurs je n'en ai mis aucune dans mon exemple ci-dessus.


    Sa déclaration est, dans son code initial :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public JTextField txtTaux;
    Cette variable n'est pas static.

    1. déclaration static
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      public class UneClasseAvecUneVariableStatic {
         static String s = "machintruc";
      }
    2. déclaration pas static
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      public class UneClasseAvecUneVariableStatic {
         String s = "machintruc";
      }


    Et on a tout à fait le droit d'initialiser une variable non static dans le constructeur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class UneClasse {
     
        private int bidule;
     
        public UneClasse() {
               bidule = 42;
        }
     
    }
    Heureusement d'ailleurs, parce qu'on peut faire :

    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 UneClasse {
     
        private boolean negatif;
        private int valeurabsolue;
     
        public UneClasse(int nombre) {
               if ( nombre>=0 ) {
                    valeurabsolue=nombre;
                    negatif=false;
               }
               else {
                    valeurabsolue=-nombre;
                    negatif=true;
               }
        }
     
    }


    Citation Envoyé par Aimka_ Voir le message
    Si tu ne sait pas ce que c'est, une variable locale est une variable instanciée dans une méthode ou un constructeur, sans modifieur (private, public, etc...) et qui ne peut être utilisée que dans cette même méthode ou constructeur.
    Donc non.
    ça c'est juste une variable locale, et elle ne peut pas être static, si elle est locale. Et la différence essentielle c'est qu'elle est déclarée dans la méthode ou le constructeur, et donc sa portée est limitée à cette méthode ou à ce constructeur.

    La déclaration c'est quand on indique pour la première fois le nom d'une variable et son type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class Machin {
    private  int var1; // déclaration de la variable int var1, de classe 
     
    private static int var2; // déclaration de la variable static in var2;
     
    public Machin() {
           int var1; // déclaration de la variable locale int var1, locale au constructeur
    }
    }
    L'initialisation, c'est la première affectation d'une valeur à une variable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class Machin {
    private  int var1; // déclaration de la variable int var1, de classe 
     
    public Machin() {
           var1 = 12; // initialisation de la variable de classe  var1
           int var1; // déclaration de la variable locale int var1, locale au constructeur
           var1 = 42; // initialisation de la variable locale var1
           var2 = 333; // initialisation de la variable static
    }
     
    }
    Bon, il faut éviter de faire ça, parce que c'est hyper confusant pour les variables de classe et locale, comme c'est le même nom de variable et que pour la variable static ce n'est pas très logique de l'initialiser dans un contexte non static (surtout que l'initialisation ne sera vraiment une initialisation que pour la première instanciation de la classe Machin, et que dans les cas où l'affectation est une modification, ça pourrait poser des problèmes en multithread.

    Quant au problème de @Xeron :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    getTextTaux().setEditable(false);   "The field FenetrePret.txtTaux is not visible"
    Il est impossible d'avoir ce message avec ce code. Lors d'un appel de méthode, si la méthode n'est pas visible, le message indique que la méthode n'est pas visible. Il n'y aucune raison que le compilateur aille chercher d'estimer quelle variable pourrait être concernée, tout simplement parce que dans le cas général, c'est impossible : une méthode peut manipuler 250 variables si nécessaire...
    Donc si une variable est mentionnée c'est qu'on a directement fait référence à cette variable dans le code.
    Donc le code montré n'est pas celui qui cause l'erreur mentionnée.
    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.

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 757
    Points : 208
    Points
    208
    Par défaut
    Citation Envoyé par joel.drigo Voir le message


    Donc non.
    ça c'est juste une variable locale, et elle ne peut pas être static, si elle est locale. Et la différence essentielle c'est qu'elle est déclarée dans la méthode ou le constructeur, et donc sa portée est limitée à cette méthode ou à ce constructeur.
    Bsr merci pour ton aide, quelle différence entre variables statiques,variables de classes et variables d'instance ? comme je l'ai fait ici car ce sont des variables de classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public class AccessBase extends FenetrePret2 {
    	static Connection cn;
    	static int conn;
    	static boolean fermer=false;
    tu dis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class Machin {
    private  int var1; // déclaration de la variable int var1, de classe 
     
    public Machin() {
           var1 = 12; // initialisation de la variable de classe  var1
           int var1; // déclaration de la variable locale int var1, locale au constructeur
           var1 = 42; // initialisation de la variable locale var1
           var2 = 333; // initialisation de la variable static
    }
    Bon, il faut éviter de faire ça, parce que c'est hyper confusant pour les variables de classe et locale, comme c'est le même nom de variable et que pour la variable static ce n'est pas très logique de l'initialiser dans un contexte non static (surtout que l'initialisation ne sera vraiment une initialisation que pour la première instanciation de la classe Machin, et que dans les cas où l'affectation est une modification, ça pourrait poser des problèmes en multithread.
    que veux tu dire par "dans un contexte non static" ?

  10. #10
    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
    Citation Envoyé par xeron33 Voir le message
    quelle différence entre variables statiques,variables de classes et variables d'instance ? comme je l'ai fait ici car ce sont des variables de classe :
    1. Une variable d'instance peut avoir une valeur différente pour chaque instance. Une variable de classe a une valeur unique pour l'ensemble des instances. Leur portée est par défaut l'ensemble de la classe, y compris les méthodes et constructeurs, leurs blocs, les classes internes, les classes anonymes et locales. La portée peut être étendue à d'autres classes (et leurs méthodes et constructeurs et blocs), par les mots protected, public ou package (ou "default"), ou restreinte par private.
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      public class Exemple {
       
          int var1; // variable d'instance
          static int var2; // variable de classe
       
      }
      Cela s'oppose à une variable locale (à une méthode, un constructeur ou un bloc), ou à un argument de méthode ou constructeur, dont la portée est limitée :
      Code : 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 Exemple {
          public int exemple(int argument) {
                int var = 0;
                for(int i=0; i<argument; i++) {
                      int calcul = i*3;
                      var += calcul;
               }
               if ( var%2==1 ) {
                     int temp = var/2;
                     var += temp;    
               }
               return var;
          }
      }

    2. Citation Envoyé par xeron33 Voir le message
      que veux tu dire par "dans un contexte non static" ?
      Comme pour les variables, les méthodes ou les blocs peuvent être static ou pas.

      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 Exemple {
       
          static {
                // bloc static
          }
       
          {
                // bloc pas static
          }
       
          static void methodeStatic() {
                // méthode static
          }
       
          void methode() {
                // méthode pas static
       
                {  
                     // bloc local
                }
       
                if ( true ) {
                     // bloc local
                }
       
          }
       
      }
      Et pour les classes (ou interfaces) aussi d'ailleurs

      Code : 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 Exemple {
            public static class ExempleStatic { 
            }
            public interface ExempleInterne {
            }
            public void methode() {
                  class ExempleLocale {
                       // classe locale
                  }
                  new ExempleInterne() {
                       // classe anonyme
                  };
            }
      }
      Une méthode, un constructeur, un bloc ou une classe définissent un contexte, un "endroit" où on a accès à des méthodes, des classes, des variables, des instances, etc qui ne sont pas forcément les mêmes que dans d'autres contextes.

      Pour manipuler (récupérer ou affecter) une variable d'instance, il faut passer par une 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
      18
      19
      20
      public class Exemple {
       
          public static int classVariable;
          public int instanceVariable;
       
          public static void main(String[] args) {
                    classVariable = 33; // pas besoin de classe pour cette affectation. pour éviter toute confusion, on préferera écrire Exemple.classVariable = 33
                    instanceVariable  = 33; // ne peut pas compiler : il faut une instance pour affecter cette variable
       
                    Exemple exemple1 = new Exemple();
                    Exemple exemple2 = new Exemple();
                    Exemple exemple3 = exemple2;
                    exemple1.instanceVariable = 33; // seule la variable de l'instance référencée par exemple1 est affectée
                    exemple2.instanceVariable = 42; // la variable de l'instance référencée par exemple2 est affectée. comme la variable exemple3 référence la même instance, forcément exemple3.instanceVariable vaut aussi 42
       
                    exemple1.classVariable = 28; // exemple2.classVariable et exemple3.classVariable vallent aussi 28. Pour éviter les confusions, on préférera toujours écrire Exemple.classVariable = 28
       
          }
       
      }
    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.

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 757
    Points : 208
    Points
    208
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    1. Une variable d'instance peut avoir une valeur différente pour chaque instance. Une variable de classe a une valeur unique pour l'ensemble des instances. Leur portée est par défaut l'ensemble de la classe, y compris les méthodes et constructeurs, leurs blocs, les classes internes, les classes anonymes et locales. La portée peut être étendue à d'autres classes (et leurs méthodes et constructeurs et blocs), par les mots protected, public ou package (ou "default"), ou restreinte par private.
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      public class Exemple {
       
          int var1; // variable d'instance
          static int var2; // variable de classe
       
      }
    ****************************************************
    Merci et franchement chapeau pour tes explications !!!
    Juste cette petite remarque pour être sur que j'ai bien pigé la différence entre variable d'instance et variable de classe est que la première n'est pas statique l'autre si ?
    C'est bien ca ?
    Merci encore
    A+

  12. #12
    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
    Citation Envoyé par xeron33 Voir le message
    Juste cette petite remarque pour être sur que j'ai bien pigé la différence entre variable d'instance et variable de classe est que la première n'est pas statique l'autre si ?
    C'est bien ca ?
    Exactement.
    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.

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

Discussions similaires

  1. [C#] Passage de valeur entre classes
    Par Neitsa dans le forum Windows Forms
    Réponses: 5
    Dernier message: 12/05/2006, 12h57
  2. [Language]Interaction entre class
    Par LordBob dans le forum Langage
    Réponses: 10
    Dernier message: 14/12/2005, 10h14
  3. débutant:utilisation de variable entre classe
    Par troojan dans le forum MFC
    Réponses: 1
    Dernier message: 07/12/2005, 23h31
  4. Accèss à des fonctions entre classes
    Par vincetrader dans le forum C++
    Réponses: 4
    Dernier message: 08/09/2005, 13h45
  5. [AS2] liaison entre classe et symbole
    Par ooyeah dans le forum ActionScript 1 & ActionScript 2
    Réponses: 1
    Dernier message: 04/07/2005, 09h41

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