Les classes internes (1) Les classes internes (2) Les blocs d
Transcription
Les classes internes (1) Les classes internes (2) Les blocs d
Les classes internes (1) Les classes internes (2) ♦Exemple ♦ Une classe peut être un membre d’une classe donnée ⇒ Classe emboîtée (englobée) dans une autre classe ou classe interne ♦ Quatre types de classes internes : • Classe membre statique : déclarée static (ne peut pas accéder aux membres d’instance) • Classe membre : membre d’instance (classe interne, inner class) • Classe locale : définie dans un bloc Java • Classe locale anonyme : classe locale ne possédant pas de nom ⇒ Définition de classe + instanciation d’objets ♦ Une classe interne peut accéder à tous les membres de la classe qui l’englobe (même privés). Le langage Java B. Djafri (64) class EnclosingClass{ . . . static class AStaticNestedClass { . . . } class InnerClass { . . . } uneJFrame.addWindowListener(new WindowAdapter() { // définition + instanciation public void windowClosing(WindowEvent e) { System.exit(0); }} ); } • Une instance de InnerClass ne peut exister qu’à l’intérieur d’une instance de EnclosingClass. • Elle a un accès direct aux variables d’instance et les méthodes de l’objet englobant. Le langage Java Les blocs d’initialisation (1) Les blocs d’initialisation (2) ♦ Blocs de code entre accolades ♦ Méthodes d’initialisation de la classe (static) : moyen d’initialiser les champs de la classe : initialiseurs statiques. ♦ Un initialiseur statique n’a pas accès aux membres d’instances et à this. ♦ Équivalents aux constructeurs d’objets (non static) : initialiseurs d’instance. ♦ Une classe peut avoir un nombre quelconque d’initialiseurs (statique ou non). Le langage Java B. Djafri (65) B. Djafri (66) public class TestBlocInit { private static double[] sin = new double[360]; // un initialiseur statique qui remplit le tableau static { // début for(int i=0; i<360; i++) { sin[i] = Math.sin(i); } } // fin de l’initialiseur ... // le reste de la définition de la classe } Le langage Java B. Djafri (67) Les blocs d’initialisation (3) Les unités de compilation public class TestBlocInit2 { private double[] cos = new double[360]; // un initialiseur d’instance qui remplit le tableau { // début de l’initialiseur for(int i=0; i<360; i++) { cos[i] = Math.cos(i); } } // fin de l’initialiseur ... // le reste de la définition de la classe } Le langage Java B. Djafri (68) ♦ Unité de compilation = code source d'une classe (fichier .java). ♦ Il est recommandé (mais pas imposé) de ne mettre qu'une classe par unité de compilation (une classe par fichier .java). ♦ L'unité de compilation doit avoir le même nom que la classe qu'elle contient. Le langage Java Les packages (1) Les packages (2) ♦ Un package est une collection nommée de classes. ♦ Un package regroupe des classes apparentées sous un même espace de ‘désignation’. ♦ Les packages peuvent contenir des sous-packages. ♦ Classe : nom simple / nom complet qui inclut le nom du package ♦ L'instruction package nomPackage indique à quel package appartient la ou les classe(s) de l'unité de compilation (le fichier). ♦ Les packages permettent au compilateur et à la JVM de localiser les classes à charger. Le langage Java B. Djafri (69) B. Djafri (70) ♦ Les répertoires ou les archives (zip ou jar) contenant les packages doivent être présents dans la variable d'environnement CLASSPATH. ♦ En dehors du package, les noms des classes sont accessibles par nomPackage.nomClasse ♦ L'instruction import nomPackage permet d'utiliser des classes sans les préfixer par leur nom de package (nom complet). ♦ Les APIs Java (la plate-forme Java 2) sont organisées en packages (java.lang, java.util, java.io, ...). Le langage Java B. Djafri (71) Les exceptions (1) Les packages (3) CLASSPATH = $Java/j2re1.4.2_01/lib/classes.zip:$HOME/Java:. CLASSPATH = C:\jdk\j2re1.4.2_01\lib\classes.jar;C:\djafri\Java;. //~djafri/Java/TDs/TD1/Point.java package TDs.TD1; public class Point{ ... } ♦ Permettent de séparer un bloc d'instructions de la gestion des erreurs pouvant survenir dans ce bloc. //~djafri/Java/TDs/TD2/Point3D.java package TDs.TD2; public class Point3D{ ... } try { // Code Java pouvant lever (déclencher) des Exceptions // ExceptionType : IOException, SecurityException, ... } catch (ExceptionType e) { // routine d’urgence //~djafri/Java/TDs/TestClasse.java package TDs; import TDs.TD1.*; // import TDs.TD1.Point; public class TestClasss{ // Gestion des ExceptionType et des sous-classes de ExceptionType } catch (Exception e){ // Gestion des autres exceptions } finally { // code optionnel exécuté dans tous les cas } public static void main(String[] args) { TDs.TD1.Point p1 = new TDs.TD1.Point(5, 7); Point p2 = new Point(7, 11); TDs.TD2.Point3D p3 = new TDs.TD2.Point3D(3, 5, 7); Point3D p4 = new Point3D(7, 9, 11); // error: class TDs.Point3D not found } Le langage Java B. Djafri (72) Le langage Java Les exceptions (2) Les exceptions (3) ♦ Instances de classes dérivant de java.lang.Exception ♦ La levée d'une exception provoque une remontée dans l'appel des méthodes jusqu'à ce qu'un bloc catch acceptant cette exception soit trouvé. ♦ Si aucun bloc catch n'est trouvé, l'exception est capturée par l'interpréteur et le programme s'arrête. ♦ Un bloc finally (optionnel) peut-être ajouté à la suite des catch. Son contenu est exécuté après un catch ou après un break, un continue ou un return dans le bloc try ♦ L'appel d’une méthode pouvant lever une exception doit • soit être contenu dans un bloc try/catch • soit être situé dans une méthode propageant (throws) cette classe d'exception Object getContent() { try { openConnection(); } catch(IOException e) { ... } finaly { ... } ... 6 7 } Le langage Java B. Djafri (73) B. Djafri (74) Le langage Java 1 void openConnection() throws IOException{ 4 5 openSocket(); sendRequest(); receiveResponse(); 2 void sendRequest() throws IOException { } 3 write(header); write(body); // ERROR } B. Djafri (75) L’utilitaire javadoc Commentaires généraux (1) ♦ Appliqué aux fichiers sources, produit des fichiers html au même format que la doc java des APIs. ♦ Commentaires destinés à la documentation : /** … */ ♦ Le commentaire est placé immédiatement au dessus de ce qu’il veut décrire. ♦ Commentaire = texte libre + balises qui commencent par @. ♦ Possibilité d’utiliser des balises html : <i> .. </i>, <img...> Le langage Java B. Djafri (76) ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ @version version (omise par défaut) @since version_d_origine @author nom (omise par défaut) @param description_variables @throws description_classe @return description @see lien (<a href="...">text</a>) @deprecated texte (signifie ‘déconseillé’) @exception info_exceptions_levées Le langage Java Commentaires généraux (2) B. Djafri (77) Commentaires généraux (3) /** calcule @param @throws @return import java.io.*; /** * Une classe simple pour lire les données entrées au clavier. * * @version 2.0 26.11.02 * @author B. Djafri */ */ public double distance(Point p) throws PointException { public class Clavier{ static InputStreamReader source = new InputStreamReader(System.in); static BufferedReader tampon = new BufferedReader(source); // ensemble de méthodes statiques ... ... return laDistace; } } Le langage Java la distance par rapport à un autre <i>point</i> p un objet de la classe <code>Point</code> une <a href=“PE.html">PointException</a> si p est null la distance calculée B. Djafri (78) Le langage Java B. Djafri (79) Quelques conseils pour la conception ♦ ♦ ♦ ♦ Les données doivent être privées Initialisez toujours les données N’utilisez pas trop les types de base dans une classe Tous les champs n’ont pas besoin de méthodes d’accès et de méthodes d’altération ♦ Subdivisez les classes ayant ‘trop de responsabilités’ ♦ Donnez des noms significatifs aux classes, aux variables et aux méthodes ♦ Commentez au maximum le code des classes Le langage Java B. Djafri (80) Les différences avec C++ ♦ ♦ ♦ ♦ ♦ Pas de structures ni d’unions Pas de types énumérés Pas de typedef Pas de préprocesseur Pas de variables ni de fonctions en dehors des classes ♦ Pas de fonctions à nombre variable d’arguments Le langage Java ♦ Pas d'héritage multiple de classes ♦ Pas de types paramétriques (template) ♦ Pas de surcharge d’opérateurs ♦ Pas de passage par copie pour les objets ♦ Pas de pointeurs, seulement des références B. Djafri (81)