Chapitre 2 : Le Langage Java
Le Langage
Java © Rémy Courdier (Révisions M. Gangat)
1996-2003 - Le langage Java - Version du cours 2.8
1
Sommaire
La Grammaire Types Opérateurs et Structures de contrôles Tableaux Exceptions
Les Objets dans Java Classes, attributs et méthodes Le polymorphisme et Java Paquetages
Les Classes de bases Chaînes de caractères Outils mathématiques Dates Tableaux et tables de hachages
© Rémy Courdier (Révisions M. Gangat)
1996-2003 - Le langage Java - Version du cours 2.8
2
La Grammaire Les Types dans Java
Types de bases (package Java.lang) booléen, char(16 bits), byte(8 bits), short(16 bits), int (32 bits), long(64 bits), float (32 b), double (64 b)
Déclaration et Initialisation int iToto; boolean bVraiFaux = true; double e = 3.00e+8, dPi= 3.14, dPi2 = 3.14 * 3.14; char a = ‘a’, nligne = ‘\n’;
déclaration et initialisation n’importe où dans l’objet les variables globales sont mises à false, Zéro ou caractère nul Les variables locales doivent être explicitement initialisées
Pas de type de données complexes (structure) en dehors des mécanismes ‘objet’ (Inner Classes)
Pas de sizeof en Java Toutes les données typées ont la même taille sur tous les OS
© Rémy Courdier (Révisions M. Gangat)
1996-2003 - Le langage Java - Version du cours 2.8
3
La Grammaire Opérateurs
assignement
lvalue = rvalue; //@ mémoire
operateurs arithmétiques
AND (&&), OR(||), NOT (!)
précédence
a = x + y - 2/2 + z;
Unaire, Arith., relationnelle, logique, cond., assignement
operateurs unaires
opérateurs relationnels generent un résultat booleén <, >, >=, ==, !=
© Rémy Courdier (Révisions M. Gangat)
opérateur de String + int x = 0, y = 1, z = 2; String sString = "x, y, z "; System.out.println(sString + x + y + z); conversion de x,y,z dans leur représentation en String
auto incrementation ++i //(i = i + 1); i++; --i //(i = i - 1); i--; x += 4 //(x = x+4)
opérateur de décalage gauche (<<), droite (>>) gauche zero extension (>>>)
x = -a; x = a * (-b);
opérateur sur les bits AND(&) OR(|) XOR(^) NOT(~)
+ ,- , /, *, %( modulo)
opérateurs logiques
opérateur de transtypage void casts() { int i = 200; long l = (long)i;//(long)200; }
1996-2003 - Le langage Java - Version du cours 2.8
4
La Grammaire Structures de contrôle
Notion de Bloc { string s = “c’est comme en C...”; ... }
// cette déclaration // a une portée limitée // a ce bloc
Déclarations conditionnelles if (condition) instruction; [else instruction;]
static int ternary(int i) { if (i<1) return i * 100; else return i * 10; // return i<10 ? i*100 : i*10; _____________________________________}__________________________________ switch (int expression) { switch (xCursor) { case int expression : case milieuEcran: instruction; corpDePage = true; [case int expression : break; instruction; case basEcran: ... case hautEcran: default : corpDePage = false; instructions;] } } 5 © Rémy Courdier (Révisions M. Gangat) 1996-2003 - Le langage Java - Version du cours 2.8
La Grammaire Structures de contrôle (2)
Boucles Tantque while (condition) { ... //instructions }
Répéter
// WhileTest.java /** * Demonstrates the while loop */ public class WhileTest { public static void main(String args[]) { double r = 0; while (r < 0.99d) { r = Math.random(); System.out.println(r); } } }
do { ... //instructions // ListCharacters.java /** * Demonstrates "for" loop by listing } while(condition);
Pour for(init, condition, incrémentation) { ... //instructions }
© Rémy Courdier (Révisions M. Gangat)
* all the ASCII characters. */ public class ListCharacters { public static void main(String args[]) { for ( char c = 0; c < 128; c++ ) if (c != 26 ) // ANSI Clear screen System.out.println( "value: " + (int)c + " character: " + c ); } }
1996-2003 - Le langage Java - Version du cours 2.8
6
La Grammaire Structures de contrôle (3)
Break et Continue : break quitte la boucle continue passe à l’itération suivante
// BreakAndContinue.java /** les clauses break et continue */ public class BreakAndContinue { public static void main(String args[]) { for(int i = 0; i < 100; i++) { if(i == 74) break; // Out of loop if(i % 9 != 0) continue; // Next iter. System.out.println(i); } int i = 0; // An "infinite loop": while(true) { i++; int j = i * 27; if(j == 1269) break; // Out of loop if(i % 10 != 0) continue; // Top System.out.println(i); }
L’infame Goto : Dans de très rare cas le goto peut être efficace => le goto existe encore en Java Ce cours ne dit pas comment l’utiliser... } }
Résultat : (avec un nombre par ligne) 0 9 18 27 36 45 54 63 72 10 20 30 40
© Rémy Courdier (Révisions M. Gangat)
1996-2003 - Le langage Java - Version du cours 2.8
7
La grammaire Tableaux simples
Opérateur spéciale “new” permet de construire une instance de tableau spéc. de la la taille : notation []
Un tableau en Java ne contient que des élements de type référence Eléments d’un tableau = références à ces objets il n’y a pas allocation de la mémoire pour les éléments ref = null jusqu’à affectation la méthode System.arraycopy permet la copie d’élément d’un tableau dans un autre
le champ length est une variable qui donne la taille du tableau
© Rémy Courdier (Révisions M. Gangat)
import java.util.*; /** TabNew.java * Création de tableaux par l’operateur new */ public class TabNew { static Random rand = new Random(); static int pRand(int mod) { return Math.abs(rand.nextInt()) % mod; } public static void main(String args[]) { // déclaration et init. de tableaux int tab[]; // <=> int [] tab; tab = new int[pRand(20)]; // int tab[] = {1,2,3,4,5}; // utilisation de tableaux prt("length of tab = " + tab.length); for(int i = 0; i < tab.length; i++) prt("tab[" + i + "] = " + tab[i]); } static void prt(String s) { System.out.println(s); } }
1996-2003 - Le langage Java - Version du cours 2.8
8
La grammaire Tableaux multi-dimensionnels
gestion de tableaux de tableaux
au moins la première dimension du tableau doit être initialisée
les tableaux ne sont pas forcément rectangulaires
Un tableau est instance de classes spéciales dans le langage Java
Gestion des débordements tableauMultidim [900] // lève une exception
© Rémy Courdier (Révisions M. Gangat)
// tableau multi-dimensionnels ... pieceEchec [][] jeuEchec; jeuEchec = new pieceEchec [8][8]; pieceEchec [] initFirstLine = { new pieceEchec(“Tour”), new pieceEchec(“Cavalier”), ... } jeuEchec[0] = initFirstLine; jeuEchec[0][1]= new pieceEchec (“Pion”); ... // tableau triangulaire int tri [][] new int [8][]; for (int i=0; i < tri.length; i++) { triangle[i] = new int [i+1]; for (int j =0; j < i+1; j++) tri[i][j] = i+j; }
1996-2003 - Le langage Java - Version du cours 2.8
9
La grammaire les exceptions : “I take exception to that”
Le principe Moyen de passer le contrôle à un niveau de code capable de gérer correctement une erreur Gestion des erreurs une seule fois Séparation du code de gestion d’erreur du code opératoire
Implémentation toute code qui a un problème lève une exception void testeHeure(int heure) throws HorsLimiteException { if (heure>24) throw new HorsLimiteException (“er...”); }
Chaque appelant de ce code doit intercepter l’exception sinon le compilateur peut sévir try { ...//code qui peut planter } catch (UneException e) {...}
© Rémy Courdier (Révisions M. Gangat)
/** ex : exception du package java.io */ private void fire(...){ ... getArea().paintGun(this); try { Thread.sleep(50); } catch (InterruptedException e) {} ... } /** ex : exceptions du package java.lang * de gestion facultative */ public int getSize(){ String string = size.getText(); try { value = Integer.parseInt(string); if (value < 1) throw new IllegalArgumentException(); } catch (NumberFormatException e) { value = 100; } catch (IllegalArgumentException e) { System.exit(1); } }
1996-2003 - Le langage Java - Version du cours 2.8
10
La grammaire les exceptions (suite)
Le renvoi d’exception fait suivre une exception aprés traitement partiel de l’erreur catch (UneException e) { System.err.println(“er...”); throw e; }
la clause finally précise le traitement à la sortie du bloc catch (UneException e) { System.err.println(“UneEr”); } finally { System.exit(0); }
Capture de toutes les exceptions catch (Exception e) { System.err.println(“erreur”); }
© Rémy Courdier (Révisions M. Gangat)
Exemple d’exceptions Java en souligné les principales à attraper java.io.IOException java.io.EOFException java.io.FileNotFoundException java.io.InterruptedIOException java.net.MalformedURLException java.net.ProtocolException java.net.SocketException java.io.UTFDataFormatException java.net.UnknownHostException java.net.UnknownServiceException java.lang.IllegalAccessException java.lang.InstantiationException java.lang.InterruptedException java.lang.NoSuchMethodException java.lang.RuntimeException java.lang.ArithmeticException java.lang.ArrayStoreException java.lang.ClassCastException java.util.EmptyStackException java.lang.IllegalArgumentException java.lang.IllegalThreadStateException java.lang.NumberFormatException ...
1996-2003 - Le langage Java - Version du cours 2.8
11
Sommaire
La Grammaire Types Opérateurs et Structures de contrôles Tableaux Exceptions
Les Objets dans Java Classes, attributs et méthodes Le polymorphisme et Java Paquetages
Les Classes de bases Chaînes de caractères Outils mathématiques Dates Tableaux et tables de hachages
© Rémy Courdier (Révisions M. Gangat)
1996-2003 - Le langage Java - Version du cours 2.8
12
Les Objets dans Java Les objets
Principes Regroupement des attributs et des méthodes Sert souvent à modéliser des objets réels Les attributs représentent l’état de l’objet Les méthodes représentent son comportement
En général, les attributs ne sont accessibles que par les méthodes : Encapsulation Méthodes ou attributs peuvent être masquées
Avantages L’encapsulation améliore l’autonomie et l’indépendance Æ facilite la réutilisation Le fonctionnement interne de l’objet n’est pas exposé et peut être facilement modifié
© Rémy Courdier (Révisions M. Gangat)
1996-2003 - Le langage Java - Version du cours 2.8
13
Les Objets dans Java Les classes
Principe Modèle ou prototype définissant les attributs et les méthodes communes aux objets d’un certain type Les objets construits à partir de ces classes sont des instances Chaque instance possède ses attributs et ses méthodes Les attributs et les méthodes d’instance sont spécifiques à chaque objet Les attributs et les méthodes de classe sont partagées entres tous les objets
© Rémy Courdier (Révisions M. Gangat)
1996-2003 - Le langage Java - Version du cours 2.8
14
Les Objets dans Java Classes, Attributs, Méthodes
Création de classes et d’objets
déclaration d’une classe /** documentation * @author R.Courdier * @version 2.0 */ class Labyrinthe { // corps de la classe }
création d’un objet de cette classe Labyrinthe unLab; unLab = new Labyrinthe();
Constructeur méthode de même nom que la classe appelée lors de la création d’un objet il peut y avoir plusieurs constructeurs
© Rémy Courdier (Révisions M. Gangat)
Attributs déclaration dans le corps de classe /** documentation */ int nbCellX, nbcelly;
utilisation dans une méthode unLab.nbCellX = 50;
Méthodes déclaration dans le corps de classe /** documentation * @param arg1... * @return RetType * @exception pas d’exception */ RetType nomFunc( //args ) { // corps de méthode }
utilisation dans une méthode RetType x = unLab.nomFunc();
1996-2003 - Le langage Java - Version du cours 2.8
15
Les Objets dans Java Classes, Attributs, Méthodes
Variable et méthode de classe : le mot clé “static” pour une Variable : variable qui existe pour la classe globalement et non spécifiquement pour chaque instance – toutes les instances se partagent la même variable Pour une Méthode : méthode qui à un sens pour la classe elle même indépendamment d’une instance donnée static Date d; static { d=new Date(); }
// init au moment du chargement // de la classe
System.out.println (ClassName.nbInst);
La pseudo variable “this” référence sur l’objet courant au sein des méthodes d’une classe Labyrinthe f() { ...// corps de méthode return this; // retourne la référence à l’objet courant }
© Rémy Courdier (Révisions M. Gangat)
1996-2003 - Le langage Java - Version du cours 2.8
16
Les Objets dans Java L’héritage
Principe Regrouper les caractéristiques générales des classes dans une superclasse Æ facilite la structuration et la réutilisation du code Certaines classes peuvent être abstraites Æ pas d’instances Certaines méthodes peuvent ne pas être implémentées Æ méthodes abstraites
© Rémy Courdier (Révisions M. Gangat)
1996-2003 - Le langage Java - Version du cours 2.8
17
Les Objets dans Java Le polymorphisme : classes dérivées et spécialisation
classe dérivée l’opérateur instanceof
notation : class WallCell extends Cell{ // corps de la classe void display(){...} }
classe non dérivable final class WallCell extends Cell{ // corps de la classe void display(){...} }
class WallCell extends Cell {...} class FloorCell extends Cell{...} ... if (aCell instanceof WallCell) { ... } else{...}
Une méthode protected dans la calsse de base est visible dans la dérivée
spécialisation utilisation d’une méthode de la classe de base : aWall = new WallCell(); super.display(); // ((Cell)aWall).display(); conversion à éviter
Une méthode ou une variable final ne peut être masquée par spécialisation © Rémy Courdier (Révisions M. Gangat)
1996-2003 - Le langage Java - Version du cours 2.8
18
Les Objets dans Java Le polymorphisme : classes et méthodes abstraites
Les classes abstraites classes non instanciables directement abstract class myClass { ...}
Une telles classe peut contenir des méthodes sans corps. De telles méthodes sont qualifiées d’abstraites abstract void f(); les méthodes abstraites définissent le format des méthodes à implanter dans les classes dérivées. Le compilateur vérifie la cohérence de l’arbre d’héritage et oblige toute classe non abstraite à ne plus avoir de méthodes abstraites
abstract class Cell { public abstract void display(); } class Wall extends Cell { public void display(){ ...//corps } } class Floor extends Cell { public void display(){ ...//corps } } class Lab { void displayLine(Cell[] tCell) { for (int i=0; i
ligneDeLab[i++] = new Floor; displayLine (ligneDeLab); } }
© Rémy Courdier (Révisions M. Gangat)
1996-2003 - Le langage Java - Version du cours 2.8
19
Les Objets dans Java Les interfaces
Principe Une classe abstraite n’ayant que des méthodes abstraites Ensemble de méthodes non implémentées et de constantes Lorsqu’une classe implémente une interface, elle doit implémenter toutes les méthodes de l’interface
Avantages Permet de regrouper les similarités entre classes sans forcer des relations d’héritage entre les classes Permet de définir des spécifications que d’autres classes devront implémenter
© Rémy Courdier (Révisions M. Gangat)
1996-2003 - Le langage Java - Version du cours 2.8
20
Les Objets dans Java Le polymorphisme : Les interfaces
définition de classes abstraites “pures” déclaration de méthodes sans corps que des variables vue comme static final (constantes allouées à la compilation). toutes les déclaration sont par défaut public
Une interface n’est pas instanciable mais peut être implémentée par une classe interface Cell { class Wall implements Cell { void display(){ ...//corps } void display(); } }
Java n’autorise pas l’héritage multiple, possibilité pour une classe d’implémenter cependant plusieurs interfaces
Préférer quand c’est possible de définir plutôt des interfaces que des classes abstraites
© Rémy Courdier (Révisions M. Gangat)
1996-2003 - Le langage Java - Version du cours 2.8
21
Les Objets dans Java Le polymorphisme : Les interfaces
Exemple: Interface Connection : Utilisée pour se connecter à une base de donnée en JDBC. Les pilotes JDBC des bases de données vont implémenter les méthodes de cette interface définie si dessous : public interface Connection { public Statement createStatement(); public void commit(); public void close(); ... } Les programme Java pourront y accéder de manière transparente: maConnection.commit();
© Rémy Courdier (Révisions M. Gangat)
1996-2003 - Le langage Java - Version du cours 2.8
22
Les Objets dans Java Le polymorphisme : Les inner classes
Définition d’une classe à l’intérieur d’une autre classe class Labyrinthe { ... class LigneLabyrinthe { ... } }
Une inner classe est vue comme une classe amie qui a accès aux attributs et méthodes privées de la classe englobante.
Une classe peut également être définie dans une méthode ou à tout niveau de bloc fonctionnel
Un fichier .class est produit par le compilateur Labyrinthe.class Labyrinthe$LigneLabyrinthe.class
Une inner classe peut être anonyme: new JPanel() { public Dimension getPreferredSize() { return new Dimension(100,100); } }
© Rémy Courdier (Révisions M. Gangat)
1996-2003 - Le langage Java - Version du cours 2.8
23
Les Objets dans Java Paquetages ou packages
Regroupement de classes sous un même espace de nommage
A l’intérieur d’un paquetage les attributs et méthodes non qualifiés (public,private,protected) sont visibles des autres classes du paquetage
A l’extérieur d’un paquetage seuls les attributs et méthodes public sont visibles
Bien connaître les paquetages disponibles est fondamental en Java import java.util.*
// on utilise ce paquetage pour notre code
Pour qu’une classe fasse partie d’un paquetage il faut ajouter en tête du fichier le nom du paquetage package nomDuPaquetage;
© Rémy Courdier (Révisions M. Gangat)
// on ajoute ce code au paquetage
1996-2003 - Le langage Java - Version du cours 2.8
24
Les Objets dans Java Règles de visibilité par défaut sans mot clé particulier :
accessible à partir de toute autre classe appartenant au même package que cette classe
public :
accessible dans la classe et à partir de toute autre classe
protected :
accessible dans la classe, les sous-classes ou les classes du package
private protected :
accessible dans la classe et les sous-classes
private :
accessible dans la classe de déclaration uniquement
le mot clé final : sur une variable : correspond à la définition d’une constante sur une méthode : pas de surcharge ou de spécialisation possible Sur une classe: la classe ne peut plus être dérivée
© Rémy Courdier (Révisions M. Gangat)
1996-2003 - Le langage Java - Version du cours 2.8
25
Sommaire
La Grammaire Types Opérateurs et Structures de contrôles Tableaux Exceptions
Les Objets dans Java Classes, attributs et méthodes Le polymorphisme et Java Paquetages
Les Classes de bases Chaînes de caractères Outils mathématiques Dates Tableaux et tables de hachages
© Rémy Courdier (Révisions M. Gangat)
1996-2003 - Le langage Java - Version du cours 2.8
26
java.util Classes d’utilité générale
BitSet :
construit des tableaux extensibles de bits avec les opérations and, or, xor,...
Date,Calendar :
nombres aléatoires nextInt(),nextFloat(),...
manipulation de dates
StringTokenizer s = new StringTokenizer ( “bientot la fin”); while( s.hasMoreTokens()) println(s.nextToken());
HashMap: couleurs.put(“rouge“,Color.red);
Properties :
Hashtable qui peut être sauvée et chargée sur des flots d’entrée/sortie InputStream ou OutputStream
© Rémy Courdier (Révisions M. Gangat)
StringTokenizer découpe une chaine en tooken
implémentation d’une collection indexée
Stack gestion d’une pile d’objets push, pop, peek, search, objectAt
ArrayList Tableau extensibles get, contains,,... size() retourne le nbre d’éléments
Random
Iterator Permet de parcourir une collection for(Iterator it = collection.iterator(); it.hasNext();) { item = it.next(); }
1996-2003 - Le langage Java - Version du cours 2.8
27
Références
The Java™ Language Specification Second Edition http://java.sun.com/docs/books/jls/index.html version HTML ou PDF
Learning the Java Language http://java.sun.com/docs/books/tutorial/java/TOC.html
Cours JAVA http://www-sor.inria.fr/~dedieu/java/cours/
© Rémy Courdier (Révisions M. Gangat)
1996-2003 - Le langage Java - Version du cours 2.8
28