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 :

[syntaxe] difference? de portée?


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Par défaut [syntaxe] difference? de portée?
    Bonjour tout le monde,
    J'aurais aimer savoir quelle est la difference entre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    public class Exemple {}
    class Other {}
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public class Exemple {
    class Other {}
    }
    .
    Ces deux codes etant le code contenu dans un fichier Exemple.java .

    J'imagine qu'il y a une difference de portée et/ou visibilitée mais je ne vois pas trop...
    Merci d'avance

  2. #2
    Expert confirmé


    Profil pro
    Inscrit en
    Mai 2003
    Messages
    3 240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 3 240
    Par défaut
    A mon avis, tu t'es trompé en recopiant les codes, car ils sont tous les deux identiques.
    Pourrais tu les modifier ?

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Par défaut
    La place des {} changent...

  4. #4
    Membre éclairé
    Inscrit en
    Juin 2005
    Messages
    303
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 303
    Par défaut Re: [syntaxe] difference? de portée? (scope)
    Citation Envoyé par TabrisLeFol
    Bonjour tout le monde,
    J'aurais aimer savoir quelle est la difference entre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    public class Exemple {}
    class Other {}
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public class Exemple {
    class Other {}
    }
    .
    Ces deux codes etant le code contenu dans un fichier Exemple.java .

    J'imagine qu'il y a une difference de portée mais je ne vois pas trop...
    Merci d'avance
    il n'y a aucune difference de portée c'est juste que la class other dans les 2 examples n'est pas visible en dehors de son package, et ds le 1er code c'est un objet de la classe Example

  5. #5
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    bonjour,

    dans le premier cas, les classes Exemple et Other sont indépendantes l'une de l'autre. Etant dans le même fichier source Exemple.java, elles font partie du même package, mais n'ont pas la même portée. La classe Exemple est publique, tandis que la classe Other est "friendly-package", elle est accessible uniquement aux classes du même package.

    Dans le second cas, la classe Other est une classe interne (nested class) de la classe Exemple. Elle ne peut être instanciée sans instanciation préalable de la classe Exemple. Lors de l'instanciation de Other, la référence "this" de l'objet Exemple est implicitement transmise, ce qui permet d'accéder depuis un objet Other à l'objet englobant Exemple.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Par défaut Re: [syntaxe] difference? de portée? (scope)
    c'est juste que la class other dans les 2 examples n'est pas visible en dehors de son package
    Cela je veux bien dans le premier.

    dans le 1er code c'est un objet de la classe Example
    La je ne comprends pas.

  7. #7
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public class Exemple {}
    class Other {}
    Dans ce cas, Other est simplement une classe standard...
    Le langage permet de définir plusieurs classes dans un même fichier à partir du moment qu'il n'y en a qu'une classe public dont le nom doit correspondre au nom du fichier...
    On utilise cela lorsqu'une classe ne devrait être utilisé que par une seule autre classe (la classe Exemple) dans ce cas). Mais cela revient au même que de définir la classe Other dans son propre fichier...




    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public class Exemple {
    	class Other {}
    }
    Dans ce cas (avec une tabulation on voit mieux la différence ), la classe Other est ce qu'on appelle une inner-class, c'est à dire une classe interne. Ce 'type' de classe est obligatoirement liée à sa classe conteneur. Donc ici, Other sera toujours liée à une instance de la classe Exemple et aura même accès à ses éléments private. On utilise ClasseParent.this pour accéder aux éléments de l'instance conteneur. 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
    public class Exemple {
     
    	private int valeur;
     
    	public Exemple (int pValeur) {
    		this.valeur = pValeur;
    		Other o = new Other();
    	}
     
    	class Other {
    		public Other() {
    			System.out.println("Valeur de Exemple : " + 
    				Exemple.this.valeur );
    		}
    	}
    }
    Les classes Exemple et Other sont très liées...
    Chaque instance de Other sera lié à une instance de Exemple quoi qu'il arrive !!!
    De plus, cette classe peut être déclaré public et dans il faut lui associer une instance de la classe conteneur pour l'instancier depuis une autre classe (mais ce n'est pas vraiment courant comme structure) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Exemple exemple = new Exemple(10);
    Exemple.Other other = exemple.new Other();


    Dans le même ordre d'idée, il a les classes annonymes qui sont des inner-classes créées dans une méthode, en général à partir d'une interface où d'une méthode, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class Exemple {
     
    	public void method () {
     
    		ActionListener listener = new ActionListener() {
    			public void actionPerformed(ActionEvent pE) {
    				// ...
    			}
    		};
    	}
    }
    ActionListener étant une interface, on ne peut pas créer de nouvelle instance. Cette syntaxe crée donc une nouvelle classe dans le fichier Exemple$1.class.
    On appelle cela classe annonyme car on ne lui donne pas de nom explicite.

    Nota : Dans les deux cas, le Exemple.this peut être implicite tout comme le this...




    Enfin pour compléter cela, il existe également des classes internes statiques, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public class Exemple {
    	public static class Other {}
    }
    Dans ce cas il n'y a plus de lien entre l'instance d'Other et d'Exemple (c'est à dire qu'on ne peut pas utiliser Exemple.this dans la classe Other) mais la classe Other peut toujours accéder aux données private de Exemple...

    J'espère que c'est clair...

    a++

  8. #8
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    [quote="adiGuba"]
    Dans ce cas il n'y a plus de lien entre l'instance d'Other et d'Exemple (c'est à dire qu'on ne peut pas utiliser Exemple.this dans la classe Other) mais la classe Other peut toujours accéder aux données private de Exemple...

    J'espère que c'est clair...
    [quote]

    C'est clair en effet
    juste une petite remarque, dans le dernier cas, la classe Other peut accéder uniquement aux données static de Exemple

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Par défaut
    C'est beaucoup plus clair.
    Pour la classe interne static Other, le fait que l'instance de Other n'ai plus "d'instance parent" est logique neanmoins si on passe par une fonction un parametre Exemple e à une instance Other, celle-ci pourrait elle manipuler exemple.attribut (?) directement sans passer par les accesseurs/mutateurs ?
    Ou comme le dit herve91, il s'agit strictement des attributs static de la class Exemple?

  10. #10
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par herve91
    juste une petite remarque, dans le dernier cas, la classe Other peut accéder uniquement aux données static de Exemple
    Citation Envoyé par TabrisLeFol
    neanmoins si on passe par une fonction un parametre Exemple e à une instance Other, celle-ci pourrait elle manipuler exemple.attribut (?) directement sans passer par les accesseurs/mutateurs ?
    Elle pourra bien sûr accéder aux données statiques ET aux attributs d'une instance qu'elle recoit en paramètre

    a++

  11. #11
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    Citation Envoyé par adiGuba
    Elle pourra bien sûr accéder aux données statiques ET aux attributs d'une instance qu'elle recoit en paramètre
    ah subtil

  12. #12
    Membre éclairé
    Inscrit en
    Juin 2005
    Messages
    303
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 303
    Par défaut Re: [syntaxe] difference? de portée? (scope)
    Citation Envoyé par TabrisLeFol
    c'est juste que la class other dans les 2 examples n'est pas visible en dehors de son package
    Cela je veux bien dans le premier.

    dans le 1er code c'est un objet de la classe Example
    La je ne comprends pas.
    ouais bon ok, c'est une classe interne de example, c'est ma facon d'exprimer les choses
    voila ce que java offre en ce qui concerne l'accessibilite des composants d'une classe de base à partir des autres classes:
    [quote]
    aucun attribut : accessibles par les classes qui font partie du meme paquetage, inaccessibles par les autres
    public: accessibles par toutes les classes
    protected : accessibles par toutes les classes derivées, et les classes du meme paquetage, inaccessible par les autres
    private : inaccessible par toutes les classes

  13. #13
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 882
    Par défaut Re: [syntaxe] difference? de portée? (scope)
    Citation Envoyé par khokho
    Citation Envoyé par TabrisLeFol
    c'est juste que la class other dans les 2 examples n'est pas visible en dehors de son package
    Cela je veux bien dans le premier.

    dans le 1er code c'est un objet de la classe Example
    La je ne comprends pas.
    ouais bon ok, c'est une classe interne de example, c'est ma facon d'exprimer les choses
    voila ce que java offre en ce qui concerne l'accessibilite des composants d'une classe de base à partir des autres classes:

    aucun attribut : accessibles par les classes qui font partie du meme paquetage, inaccessibles par les autres
    public: accessibles par toutes les classes
    protected : accessibles par toutes les classes derivées, et les classes du meme paquetage, inaccessible par les autres
    private : inaccessible par toutes les classes
    Il faut porter tout de meme une attention toute particuliere sur le modifier protected dans le cas d une classe sous classe de la classe declarant le feature protected (déclarée dans un autre package que sa superclasse):

    Tu peux appeler toutes les methodes protected de ta superclasse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    this.methodeProtected(); //OK
    mais tu ne peux pas invoquer les methodes protected sur une autre instance:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    anotherInstance.methodeProtected(); //Illegal
    Il en est de meme pour les attributs protected de la super classe, tu ne peux les lire a partir d une autre instance

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ... x = this.attributProtected; //OK
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ... x = anotherInstance.attributProtected; //Illegal

  14. #14
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut Re: [syntaxe] difference? de portée? (scope)
    Benjamin >> c'est bon à savoir ca

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Par défaut
    Dans le cas des ActionListener, j'ai essayé de modifier un boolean attribut de la "class parent", une exception a été lancée comme quoi cette variable devrais etre alors final...
    On peut contourner la difficultée par un apel de fonction qui modifie l'attribut mais je n'ai pas compris le probleme...

  16. #16
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 882
    Par défaut
    ben moi non plus j ai pas boien compris ton probleme

  17. #17
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    Citation Envoyé par TabrisLeFol
    Dans le cas des ActionListener, j'ai essayé de modifier un boolean attribut de la "class parent", une exception a été lancée comme quoi cette variable devrais etre alors final...
    On peut contourner la difficultée par un apel de fonction qui modifie l'attribut mais je n'ai pas compris le probleme...
    Ce ne devait pas être un attribut de la classe parente, mais une variable locale de la méthode en cours. 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
    private int count;
     
    private setActionListener() {
      int localCount = count;
     
      addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
           if (count == 1) // ok, ça compile
               ;
           if (localCount == 1) // ko, ça ne compile pas, localCount doit être déclaré "final"
               ;
        }
      });
    }

  18. #18
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Par défaut
    j'ai surement du confondre les deux noms de variables...
    Ca me paraissait bizare... Je n'ai plus le code source donc je ne peux plus verifier mais ça doit etre ca...

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

Discussions similaires

  1. [Lazarus] [Débutant] Problème de syntaxe d'un programme porté depuis TPW 1.5
    Par maxstilde dans le forum Lazarus
    Réponses: 3
    Dernier message: 05/03/2009, 23h39
  2. Syntaxe quelle difference?
    Par alexking2005 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 17/11/2008, 17h08
  3. difference entre port-base VLAN et 802.1Q VLAN
    Par Emcy dans le forum Réseau
    Réponses: 0
    Dernier message: 12/03/2008, 09h58
  4. Difference entre deux syntaxe
    Par aikinhdo dans le forum Langage
    Réponses: 2
    Dernier message: 08/06/2007, 09h56
  5. Réponses: 1
    Dernier message: 07/10/2005, 23h07

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