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 :

comprehension des classes anonymes


Sujet :

avec Java

  1. #1
    Candidat au Club
    Inscrit en
    Septembre 2007
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 6
    Points : 3
    Points
    3
    Par défaut comprehension des classes anonymes
    Bonjour a tous, j aimerai trouver des réponses a ces questions :

    Dans la déclaration d’une classe anonyme :

    a) Quel est le rôle du type indiqué juste après le new ?
    b) Sera-t-il instancié ?
    c) Peut-il être une interface ?
    d) Quel constructeur est utilisé pour instancier la classe anonyme ?
    e) Une classe anonyme peut-elle être étendue ?

    merci

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 866
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 866
    Points : 22 919
    Points
    22 919
    Billets dans le blog
    52
    Par défaut
    a) cela indique le type a étendre ou implémenter.

    Grosso modo faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class MaClasse  {
     
    [...]
     
        addMachinListener(new Toto() {
            [...]
        });
     
    [...]
     
    }
    revient presque a faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class MaClasse  {
     
    [...]
     
        Titi titi = new Titi();
        addMachinListener(titi);
     
    [...]
     
    }
    avec Titi une classe interne de MaClasse qui étend Toto :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    private class Titi extends Toto {
        [...]
    }
    ou si Toto est une interface :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    private class Titi implements Toto {
        [...]
    }
    b) Vi le nouveau type sera instancié.

    c) Oui, voir a)

    d) Le constructeur par défaut sera invoqué s'il n'est pas surchargé.

    Pour la surcharge :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    addMachinListener(new Toto() {
       // Constructeur.
       {
           [...]
       }  
     
       [...]
    });
    e) Jamais essayé mais je dirai non car tu n'as pas de type déclaré que tu puisses manipuler dans ton code.
    Il est peut-être possible de le faire en bidouillant le byte-code, ou via la reflection et en faisant des références à genre MaClasse.$1 mais :
    • Ça restera impossible si elles sont implicitement déclarée final par le compilateur.
    • Ça reste hyper facile à casser : il suffit de déclarer une autre classe anonyme juste avant pour que tout l'ordre change à la prochaine compilation.

  3. #3
    Candidat au Club
    Inscrit en
    Septembre 2007
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 6
    Points : 3
    Points
    3
    Par défaut Le constructeur par défaut sera invoqué s'il n'est pas surchargé.
    Merci Bouye pour tes réponses. elles auront éclairées ma lanterne.

    Par contre pour la question d) quand tu dis que le constructeur par défaut sera invoqué si il n 'a pas été surchargé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    addMachinListener(new Toto() {
       // Constructeur.
       {
           [...]
       }  
     
       [...]
    });
    comment appellera t'on ce constructeur puisque la classe anonyme n 'a pas de nom.

    Merci

  4. #4
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 866
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 866
    Points : 22 919
    Points
    22 919
    Billets dans le blog
    52
    Par défaut
    Ben la réponse est dans ce que tu cites (si tu prends la peine de comparer ce bout de code avec celui qui est tout en haut) : ce que j'ai appelé un constructeur (et qui est en fait en fait un bloc d’initialisation d'instance) n'a pas de nom et commence par un { et se termine par un }.

    Dans une classe, rien ne t'oblige (a part les bonnes manières) à écrire :

    <- ici, présence d'un constructeur sans argument (écrit par le programmeur).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class Toto {
        public Toto(){
            System.out.println("Toto !");
        }    
    }
    Tu peux tout aussi bien écrire :

    <- ici, présence d'un bloc d’initialisation et d'un constructeur par défaut (implicite).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class Toto {
        {
            System.out.println("Toto !");
        }    
    }
    Voir carrément :

    <- ici, présence de bloc d’initialisation et d'un constructeur sans argument (écrit par le programmeur).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class Toto {
        {
            System.out.println("Toto1 !");
        }    
     
        public Toto() {
            System.out.println("Toto2 !");
        }
    }
    Le contenu du bloc d’initialisation est invoqué avant le contenu du constructeur sans argument et comme c'est un bloc d'instance (y a pas écrit static devant) on peut même bidouiller les variables d'instance (membre) avant que le constructeur ne le fasse.
    donc pour une classe anonyme on peut sans problème écrire un bloc d'initialisation qui se charge de faire les même choses qu'un constructeur normal sans argument (genre conserver une référence sur un truc dont on va avoir besoin par la suite, aller zieuter les prefs utilisateur, etc.).

    Et avant que tu ne poses la question, oui, les classes anonymes peuvent aussi avoir des variables d'instance.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    addMachinListener(new Toto() {
       private TrucMuche machinChose = obtenirMachinChose();
     
       public void faireUnTruc(UnEvent event) {
           machinChose.faireQuelqueChoseAvecLEvent(event);
       }
    });
    Hum quoi d'autre ? Tu peux avoir plusieurs bloc d’initialisation, ils sont invoqués dans l'ordre dans lequel ils apparaissent dans la classe et ils sont toujours tous invoqués avant les instructions contenues dans le constructeurs écri par le développeur. En gros, lorsque tu invoques le constructeur d'une classe, sauf boulette de ma part, on doit avoir un truc du genre :

    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
    // Chargement de la classe parente
    ->  bloc d’initialisation statique parent #1
    ->  [...]
    ->  bloc d’initialisation statique parent #k
    // On charge la classe courante.
    <- bloc d’initialisation statique #1
    <- [...]
    <- bloc d’initialisation statique #m
    // On crée l'instance parente (invocation du super constructeur).
    -> bloc d’initialisation instance parent #1
    ->  [...]
    -> bloc d’initialisation instance parent #n
    -> Contenu du constructeur parent invoqué.
    // On crée l'instance (invocation du constructeur).
    <- bloc d’initialisation instance #1
    <-  [...]
    <- bloc d’initialisation instance #o
    <- Contenu du constructeur invoqué.

  5. #5
    Candidat au Club
    Inscrit en
    Septembre 2007
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Merci Bouye

    Tout cela est plus claire a présent.

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 635
    Points
    21 635
    Par défaut
    Pour information :

    Citation Envoyé par bouye Voir le message
    Ça restera impossible si [les classes anonymes] sont implicitement déclarée final par le compilateur.
    C'est bien le cas, sans surprise.

    Citation Envoyé par bouye Voir le message
    Ça reste hyper facile à casser : il suffit de déclarer une autre classe anonyme juste avant pour que tout l'ordre change à la prochaine compilation.
    Il suffit de faire getClass() sur l'instance créée avec. Cela permet d'étudier un peu quel constructeur est défini pour une classe pareille.
    Je n'ai pas vu d'intérêt à faire ça par contre.

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

Discussions similaires

  1. [debutant] Comment ajouter des .class ?
    Par Slein dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 30/04/2004, 14h30
  2. Créer les get et set des classes
    Par cameleon2002 dans le forum JBuilder
    Réponses: 3
    Dernier message: 17/09/2003, 21h03
  3. specifier les chemins des .class
    Par draken dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 29/07/2003, 09h35
  4. Inserer des classes java existantes
    Par 2000 dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 20/03/2003, 12h35
  5. Réponses: 3
    Dernier message: 04/09/2002, 09h42

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