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)