Accueil
Java Standard Edition
Java EE 5
Visual Basic .Net 2005
Visual C++ .Net 2005
Visual C# .Net 2005
Cours ASP .Net 2.0
Postgresql
Linux
Visual Studio 2008
ASP 3.0 Classique
Cours Javascript - DOM - DHTML
Cours Ajax
VBA
Assembleur
Perl
Membres
L'auteur du site
Nouveautés sur le site
Contacts
Plan du site
Exécution d'un programme
Les archives Jar
Les classes abstraites
Les interfaces
Les tableaux
La généricité
Les énumérations
Les classes internes
Classes anonymes et internes locales
Les threads: généralités
Les threads(2): synchronisation
E/S(1):InputStream et OutputStream
E/S(2):FileInputStream et FileOutputStream
E/S(3):Reader et Writer
E/S(4):FilterInputStream et FilterOutputStream
E/S(5):Les filtres d'octets: PrintStream
E/S(6):Les filtres d'octets: DataInputStream et DataOutputStream
E/S(7):Les filtres d'octets: BufferedInputStream et BufferedOutputStream
E/S(8):Flux de caractères: PrintWriter
E/S(9):Flux de caractères: FilterReader et FilterWriter
E/S(10):Flux de caractères: InputStreamReader, OutputStreamWriter, StreamDecoder, StreamEncoder
E/S(11):Flux de caractères: BufferedReader et BufferedWriter
E/S(12):Flux de caractères: FileReader et FileWriter
La classe String (java.lang)
Les collections: L'interface Collection(java.lang)
Les collections(2): L'interface List(java.util)
Les collections(3): AbstractCollection(java.util)
Les collections(4): AbstractList(java.util)
Les collections(5): Vector(java.util)
Les collections(6): L'interface Map(java.util)
Les collections(7): AbstractMap(java.util)
Les collections(8): HashMap(java.util)
La bibliothèque Swing en Java
Les bases de données en Java
JDBC ( Java Database Connectivity )
Les interfaces graphiques
Les fichiers de configuration en Java
INSTALLATION JAVA EE 5, JRE 6, ECLIPSE, TOMCAT, ETC SOUS LINUX
INSTALLATION JAVA EE 5, JRE 6, ECLIPSE, TOMCAT, ETC SOUS WINDOWS
Les applications Web en java
Les filtres Java (javax.servlet.Filter)
I Généralités
I.1 Le formulaire principal
I.2 Les objets créés par Visual
I.3 Les variables références
I.4 Le garbage collector
II Créer évènements
II.1 Rappel évènements
II.2 Procédure à suivre
II.2.1 Créer son EventArgs
II.2.2 Créer EmetEvent
II.2.3 Déclarations autres
I Généralités
I.1 Applications winforms
I.2 Applications MFC
I.3 Objets managés ou pas
I.4 Objets non managés
I.5 Objets managés - handle
I.6 Le top-level ^
II Créer évènements
II.1 Rappel évènements
II.2 Procédure à suivre
II.2.1 Créer son EventArgs
II.2.2 Créer EmetEvent
II.2.3 Déclarations autres
I Généralités
I.1 Puissant et Accessible
I.2 Créer ses classes
II Créer évènements
II.1 Rappel évènements
II.2 Procédure à suivre
III Les services Windows
IV Le .net remoting
V Communication Tcp avec TcpClient et TcpListener
II.2.1 Créer son EventArgs
II.2.2 Créer EmetEvent
II.2.3 Déclarations autres
I Généralités
I.1 Un EDI formidable
I.2 Inclure C# ou VB
I.3 L'objet Response
I.4 Les évènements
II ASP .net et les bdd
II.1 Essayer plusieurs fois la requête
I 2.1 Fichiers distincts
I.2.2 Avec la balise script
I.2.3 Inclure réellement
I.2.4 Avec Response.Write()
I.3.1 La méthode Response.Redirect()
I.4.1 Résoudre problème post
Installation Postgre Linux
Cours Postgresql
Le Shell Unix( Linux, Ubuntu)
Les scripts C-Shell
Programmation système Unix
Reseau Linux
Les iptables
Windows Presentation Foundation(WPF)
Le Framework 3.0
Windows Workflow Foundation(WF)
ASP 3.0 Classique
Cours Javascript - DOM - DHTML
Chat Ajax
VBA Excel 2003
Assembleur
Perl
Inscription
Liste membres
Livre d'or
Forum
Accueil
>
Java Standard Edition
>
Classes anonymes et internes locales
____________________________________________________________________________________________________
Connexion
Java SE - Les classes internes locales et les classes anonymes
Sommaire :
I) Définition
II) Les classes internes locales
III) Les classes anonymes
III-1) Définition
III-2) Syntaxe des classes anonymes
IV) Code source complet de l'exemple
IV-1) Classe FrameUnBouton(package presentation)
IV-2) Classe Main(package main)
V) Téléchargement de l'exemple
I) Définition
Les classes internes locales, et les classes anonymes, sont des classes internes non static (voyez le chapitre sur les classes internes éventuellement).
Extrait java.sun.com:
"Additionally, there are two special kinds of inner classes: local classes and anonymous classes (also called anonymous inner classes)."
et
"There are two additional types of inner classes. You can declare an inner class within the body of a method. Such a class is known as a local inner class. You can also declare an inner class within the body of a method without naming it. These classes are known as anonymous inner classes. You will encounter such classes in advanced Java programming."
Une classe interne locale est une classe interne non static déclarée à l'intérieur d'une méthode.
Une classe anonyme est une classe interne locale qui n'a pas de nom.
II) Les classes internes locales
Comme nous venons de le voir, une classe interne locale est une classe interne non static( inner class), déclarée dans le body d'une méthode.
Par conséquent, les attributs et méthodes d'instance de la classe englobante sont accessibles, et avec la même syntaxe que pour les classes internes non static. Les variables locales de la méthode en question, sont accessibles si elles sont final (c'est à dire les constantes).
Aucun modificateur d'accès n'est autorisé pour la classe interne locale( ni private, ni public, etc). Elle est visible uniquement localement, c'est à dire uniquement dans le bloc où elle a été déclarée.
Exemple faisant partie du projet d'exemple:
public class FrameUnBouton extends JFrame { private JButton monBouton; private JButton btnDeux; //(...) private void initialiserComposants() { final int MON_INT = 25; //(...) class maClMouseList extends MouseAdapter { //pas de spécificateurs d'accès possibles public void mouseReleased(MouseEvent e) { btnDeux.setText("Appui"); //juste pour montrer que l'attribut btnDeux est accessible System.out.println("released bouton 2"); System.out.println("MON_INT=" + MON_INT); } } this.btnDeux.addMouseListener(new maClMouseList()); //Ajouts des composants à la fenetre this.add(monBouton); this.add(btnDeux); } //(...) }
III) Les classes anonymes
III-1) Définition
Une classe anonyme est une classe interne locale qui ne possède pas de nom. En effet, dans certains cas, il n'est pas utile de nommer une classe, car on ne va l'utiliser qu'une seule fois!
L'exemple typique est celui des évènements AWT. Dans l'exemple ci-dessous, on a besoin de créer un objet d'une classe héritant de MouseAdapter, et contenant notre méthode mouseReleased. Et on veut donner cet objet à la méthode addMouseListener de notre bouton. La classe ne servira ici qu'à créer l'objet, et plus jamais après. Inutile de la nommer. On utilise une classe anonyme.
public class FrameUnBouton extends JFrame { private JButton monBouton; private JButton btnDeux; //(...) private void initialiserComposants() { final int MON_INT = 25; // (...) this.monBouton.addMouseListener(new MouseAdapter() { public void mouseReleased(MouseEvent e) { if (e.getClickCount()<2) return; System.out.println("clickcount: " + e.getClickCount()); if (e.getClickCount()==2) { java.awt.Toolkit.getDefaultToolkit().beep(); } } }); // (...) } //(...) }
III-2) Syntaxe des classes anonymes
Notre exemple:
private void initialiserComposants() { final int MON_INT = 25; // (...) this.monBouton.addMouseListener(new MouseAdapter() { public void mouseReleased(MouseEvent e) { if (e.getClickCount()<2) return; System.out.println("clickcount: " + e.getClickCount()); if (e.getClickCount()==2) { java.awt.Toolkit.getDefaultToolkit().beep(); } } public int maMeth(){ //on ne pourra jamais accéder à cette méthode de l'extérieur!!! return 1; } }); // (...) }
C'est d'abord une classe interne locale, elle se situe dans une méthode.
On effectue obligatoirement un new en même temps que la déclaration de classe, et d'ailleurs c'est la seule instanciation qu'on pourra faire avec cette classe.
N'ayant pas de nom, cette classe ne sera plus jamais accessible.
Le new effectuera une instanciation de notre classe anonyme, et non pas de la classe indiquée juste après le new, qui est la classe dont hérite la classe anonyme.
Il ne peut pas y avoir de constructeur dans une classe anonyme, car elle n'a pas de nom. C'est le constructeur de la superclasse qui est utilisé, selon les paramètres qui suivent le new.
Dans le cas où la superclasse est une interface, la classe anonyme implémentera cette interface. Et elle héritera de Object.
Remarquez dans la syntaxe qu'un ";" figure après le bloc contenant la classe, car c'est bien la fin de la ligne du new.
Une classe anonyme est considérée comme final. Par conséquent, elle ne peut être abstraite.
L'objet créé est un objet du type de notre classe anonyme, mais, n'ayant pas de nom, on peut utiliser le fait que notre objet est également du type de la superclasse ou de l'interface(quand on aura besoin du type de notre objet).
Remarque: ceci implique qu'on ne pourra pas amener de nouvelles méthodes public à une classe anonyme, car on mettra l'objet dans une variable du type de la classe mère ou de l'interface.
Ceci implique qu'on ne pourrait pas accéder aux nouvelles méthodes, même si on en avait écrites dans la classe anonyme(comme le montre la méthode maMeth de l'exemple). En effet, on ne pourra pas caster la variable contenant notre objet, car on n'a pas le nom de la classe anonyme.
IV) Code source complet de l'exemple
IV-1) Classe FrameUnBouton(package presentation)
package presentation; import java.awt.Color; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JButton; import javax.swing.JFrame; /** * * @author sabri Koffler * Exemple d'utilisation des classes internes * en Java * */ public class FrameUnBouton extends JFrame { private JButton monBouton; private JButton btnDeux; //*** ACCESSEURS *** public JButton getMonBouton() { return monBouton; } public void setMonBouton(JButton monBouton) { this.monBouton = monBouton; } public JButton getBtnDeux() { return btnDeux; } public void setBtnDeux(JButton btnDeux) { this.btnDeux = btnDeux; } //*** FIN ACCESSEURS *** private void initialiserComposants() { final int MON_INT = 25; //Initialisations pour FrameUnBouton // //pour pouvoir positionner en absolue this.setLayout(null); this.setBounds(200, 300, 200, 250); //Initialisations pour monBouton this.monBouton = new JButton(); this.monBouton.setLayout(null); this.monBouton.setText("Un"); this.monBouton.setBounds(50, 100, 100, 32); this.monBouton.setBackground(new Color(0,0,0)); //noir this.monBouton.setForeground(new Color(204, 204, 204)); //un gris-beige this.monBouton.addMouseListener(new MouseAdapter() { public void mouseReleased(MouseEvent e) { if (e.getClickCount()<2) return; System.out.println("clickcount: " + e.getClickCount()); if (e.getClickCount()==2) { java.awt.Toolkit.getDefaultToolkit().beep(); } } public int maMeth(){ //on ne pourra jamais accéder à cette méthode de l'extérieur!!! return 1; } }); //Initialisations pour monBouton btnDeux this.btnDeux = new JButton(); this.btnDeux.setLayout(null); this.btnDeux.setText("Deux"); this.btnDeux.setBounds(50, 150, 100, 32); this.btnDeux.setBackground(new Color(0,0,0)); //noir this.btnDeux.setForeground(new Color(204, 204, 204)); //un gris-beige // class maClMouseList extends MouseAdapter { //pas de spécificateurs d'accès possibles public void mouseReleased(MouseEvent e) { btnDeux.setText("Appui"); //juste pour montrer que l'attribut btnDeux est accessible System.out.println("released bouton 2"); System.out.println("MON_INT=" + MON_INT); //juste pour montrer que la variable locale est accessible } } this.btnDeux.addMouseListener(new maClMouseList()); //Ajouts des composants à la fenetre this.add(monBouton); this.add(btnDeux); } public FrameUnBouton() { initialiserComposants(); } }
IV-2) Classe Main(package main)
package main; import javax.swing.JFrame; //Mes imports import presentation.*; /** * * @author sabri Koffler pour www.infkoffler.com, exemple du cours Java Standard * @version 1.0 (de l'application) / 31/10/2008 * Créé 31/10/2008 * Programme d'exemple pour les classes internes locales et les classes anonymes en java. * Les classes ne sont pas sécurisées volontairement pour * l'exemple * * Classe Main créée uniquement pour la méthode main * */ public class Main { /** * @param args */ public static void main(String[] args) { JFrame maFenetre = new FrameUnBouton(); maFenetre.setVisible(true); } }
Téléchargement de l'exemple
Projet d'exemple, V1.0
RETOUR HAUT