SlideShare uma empresa Scribd logo
1 de 103
Baixar para ler offline
Java
La syntaxe
Les aspects techniques
jd@olek.fr - Version du 22/10/13

mercredi 23 octobre 13
Rapide historique
• 1995 : sortie de la première version
• Rachat de Sun par Oracle en 2009
• Langage issu des concepts objets
• Plus mature que C++, Smalltalk...
• Portable sur plateformes hétérogènes
• Principe de virtualisation de l’exécution
mercredi 23 octobre 13
Différentes versions
•
•
•

1996 : JDK 1.0 (211 classes)
1997 : JDK 1.1 (477 classes)
1998 : Java 2 (1 524 classes)

•
•
•

•
•
•
•
•
mercredi 23 octobre 13

J2ME : Mobile Edition
J2SE : Reprise du Java “standard”
J2EE : Enterprise Edition (serveur)

2000 : J2SE 1.3 (1 840 classes)
2002 : J2SE 1.4 (2 723 classes)
2004 : J2SE 5.0 (3 270 classes)
2006 : Java SE 6 (3 777 classes)
2011 : Java SE 7 (8 000 classes)
Cycle de compilation
d’un langage ‘classique’
Compilateur
Code source
toto.c

Editeur de liens

Code objet
toto.o

•Fichier texte
•Fichier binaire
•Compatibilité si langage •Compatibilité CPU
normé

Code
exécutable
toto.exe

•Fichier binaire
•Compatibilité OS

Liaison avec des bibliothèques
faisant la liaison avec le système

mercredi 23 octobre 13
Compilation/exécution
en Java
Compilateur
Code source
Toto.java

•Fichier texte
•Compatibilité totale

(norme gérée par Sun)

Exécution par la JVM
Bytecode
Toto.class

•Fichier binaire
•Compatibilité JVM

Code interprété
ou émulé

•Exécution directe en
mémoire
•Compatibilité OS

Liaison avec des bibliothèques
elles aussi en bytecode

mercredi 23 octobre 13
Caractéristiques du
langage (1)
• Hétérogène
• Peut s’exécuter dans des environnements
très divers

• Pas de problème de compatibilité
• Même au niveau des types
• Même au niveau de l’interface graphique
mercredi 23 octobre 13
Caractéristiques du
langage (2)

• Objet
• Bénéficie des retours d’expériences
d’avant 95

• Ce n’est pas une adaptation d’un langage
existant

• Tout est encapsulé dans des classes

• Simple
• La syntaxe est simplifiée et abordable
mercredi 23 octobre 13
Caractéristiques du
langage (3)

• Robuste
• La JVM détecte les erreurs et gère les
éventuelles fuites mémoire

• Orienté réseau
• Gestion native des threads
• Protocoles réseaux inclus en standard
• Informatique distribuée
mercredi 23 octobre 13
Caractéristiques du
langage (4)

• (relativement) ouvert sur l’extérieur
• Les interfaces JNI permettent de faire

passerelle avec les parties “natives” du
système (matériel, réseau, OS...)

• Très typé Web
• J2EE fournit un serveur d’application
complet pour le Web

• Tous les standards sont là : XML, Ajax...
mercredi 23 octobre 13
Points faibles
• L’étape d’interprétation de la JVM entraine
bien sûr une plus grande lenteur et
lourdeur

• La syntaxe est simplifiée par rapport à
d’autres langages (C++...)

• En revanche, certaines subtilités

“techniques” ne sont pas possibles

mercredi 23 octobre 13
Environnements de
développement
• L’ex Leader : Borland JBuilder
• Aujourd’hui : Eclipse / IBM Rational App Dev
• Base OpenSource donnée par IBM
• Extensions par Plugins
• Plugins OpenSource ou IBM
• Chez Sun : NetBeans
mercredi 23 octobre 13
Les commandes de
base
• java : appel à la JVM
• javac : compilateur, produit des .class
• javap : désassembleur
• javadoc : génère la documentation
• jar : gestion des Java ARchives
mercredi 23 octobre 13
Compilation manuelle
• Vérifier la présence des variables
d’environnement :

• JAVA_HOME : pointe sur le JDK
• PATH : doit intégrer $JAVA_HOME/bin
• CLASSPATH : doit intégrer

$JAVA_HOME/lib ainsi que vos propres
librairies (répertoires et .jar)

mercredi 23 octobre 13
My first class
• Et c’est parti ! Dans un fichier texte Essai.java, on
tape :

public class Essai
{
public static void main(String args[])
{
System.out.println(“Goodbye cruel world !”);
}
}
http://fr.wikipedia.org/wiki/Hello_world
mercredi 23 octobre 13
Utilisation de base des
commandes
• javac Essai.java
• Compile notre fichier Essai.java
• On obtient un fichier Essai.class
• java Essai
• Lance la classe contenue dans Essai.class
mercredi 23 octobre 13
Notion de packages

• Les classes sont organisées en packages,
afin de les organiser

• Les packages sont des répertoires
• On prend souvent le nom de domaine de la
société pour garantir un nom unique

• Dans le code, un package est représenté
sous la forme :

package fr.olek.cours.debutant;

mercredi 23 octobre 13
Déclaration d’une
classe dans un package
package fr.olek.cours.repondeur;
public class Repondeur
{
...
}
Le fichier se trouve dans :
/fr/ecoms/cours/repondeur/

mercredi 23 octobre 13
Appel d’une classe dans
un package
• La syntaxe est plutôt lourde :
public class Essai
{
public static void main(String args[])
{
fr.olek.cours.repondeur.Repondeur r=
new fr.olek.cours.repondeur.Repondeur();
}
}
mercredi 23 octobre 13
Utilisation de la clause
import

• Il vaut mieux l’importer :

import fr.olek.cours.repondeur.Repondeur;
public class Essai
{
public static void main(String args[])
{
Repondeur r=new Repondeur();
}
}
mercredi 23 octobre 13
Divers usages d’import

• import n’importe pas “physiquement” les packages
mentionnés

• Simple indication à la JVM pour savoir où trouver
les classes utilisées

• Il est possible d’importer toutes les classes d’un
package d’un coup :

import fr.olek.cours.repondeur.*;

• Attention, ça n’inclue pas les sous-packages !
import fr.olek.*; // ne va pas importer “Repondeur”
mercredi 23 octobre 13
Régler les ambiguités
• Dans certains cas, des classes portent le même
nom, dans des packages différents

import java.awt.*; // contient une classe “Point”
import fr.olek.geometrie.Point;
...
Point p=new Point(); // on utilise le nôtre

mercredi 23 octobre 13
Imports statiques

• Nouveauté de Java 5.0
• Permet d’éviter la syntaxe classe.méthode
ou classe.attribut

• Exemple :
import static java.lang.Math;
...
aire=rayon*java.lang.Math.PI;
aire=rayon*Math.PI;
aire=rayon*PI;
mercredi 23 octobre 13
Les commentaires

• Pour commenter une seule ligne :
// Ligne de commentaire

• Bloc de commentaire :
/* Début de bloc
....
Blabliblu */

• Bloc de commentaire de documentation
/** Début de bloc
....
Blabliblu */
mercredi 23 octobre 13
Les types de données
• On les appelle “types scalaires”
• 3 grands types :
• Numériques
• Entiers
• Réels
• Booléens
• Caractères
mercredi 23 octobre 13
Les types numériques
• Ils sont tous complètement normalisés !
• Quelque soit la plateforme, un même
type aura toujours la même
représentation

• Les entiers sont par défaut signés
• long et short sont des types à part entière
mercredi 23 octobre 13
Les différents types
numériques disponibles
Type Taille mémoire
byte

1 octet

short

2 octets

int

4 octets

long

8 octets

• Par défaut, les nombres sont de type int
• Les suffixes permettent de forcer un type : 1234L
mercredi 23 octobre 13
Types réels
Type Taille mémoire
float

4 octets

double

8 octets

• Contrairement à C/C++, il existe une vraie
arithmétique en float

• Par défaut, un nombre à virgule est un double
• Suffixe pour un float : 12.24F
mercredi 23 octobre 13
Type booléen

• Fini les réprésentations via des entiers 0 et 1
(ou 0 et -1, ou 1 et 2...)

• Java propose un type boolean à part entière
• 2 constantes particulières
• true
• false
• boolean est le seul type utilisé pour les tests
• Toute expression de test est donc booléenne
mercredi 23 octobre 13
Exemple de test
booléen

Expression
booléenne

if(a==b) ....

• Pour tester un booléen :
boolean flag=false;
...
if(flag==true)
if(flag)
mercredi 23 octobre 13

Expression
redondante

if(flag==false)
if(!flag)
Conditions
if(expression)
instruction1;
else
instruction2;
instruction3;

mercredi 23 octobre 13

•Chaque expression est booléenne
•Chaque instruction peut être remplacée
par un bloc :

{

if(expression1)
instruction1;
else if(expression2) }
instruction2;
else if(expression3)
instruction3;
else
instruction4;

instruction 1;
...
instruction n;
Choix multiples

int choix;
switch(choix)
{
case 1: Exécuté si choix=1
i=3;
break;
Ordre de débranchement
case 2:
case 3:
i=4;
break;
Exécuté si choix=2 ou 3
default:
i=3;
Choix par défaut
}
mercredi 23 octobre 13

switch/case ne
marche qu’avec
des types scalaires !
(=>pas de String)
Boucles

• La boucle type en Java est while :
while(condition)
{
instruction1;
}
Exécuté au
moins une fois

mercredi 23 octobre 13

do
{
instruction1;
} while(condition)
Boucle for

• Héritée du langage C
• En fait, un condensé d’une boucle while
avec incrémentation

for(exp_init;
exp_test;
exp_maj)
{
instruction1;
}

exp_init;
while(exp_test)
{
instruction1;
exp_maj;
}

Exemple : for(int i=0;i<10;i++) ...
mercredi 23 octobre 13
Caractères
•
•
•
•

mercredi 23 octobre 13

Particularité de Java : tout caractère est au format
UNICODE sur 16 bits
Saisie d’une constante caractère :
char
char
char
char

c1=’A’;
c2=’t’;
c3=’060’;
c4=’u0030’;

//
//
//
//
//

Caractère en dur
Séquence d’échappement classique du C
Exactement 3 chiffres en octal
Exactement 4 chiffres en hexadécimal
pour une constante UNICODE

Attention aux caractères Français accentués
Unicode conseillé...

•

char eacute=’u00E9’;

// le caractère « é »

char est de toute manière peu utilisé
On préférera utiliser la classe String

•
Chaîne de caractères
• Fini les bidouilles de tableau de caractères
• On utilise une classe à part entière
String s=new String(“bonjour les amis”);

• ou plutôt :
String s=”bonjour les amis”;

mercredi 23 octobre 13
Concaténation
String nom=”Paul”;
String phrase=”Bonjour,”+nom+”, comment va ?”;

• On peut également concaténer des éléments autres
que “String”

• Ils seront automatiquement convertis
int age=10;
String phrase=”Tu as “+age+” ans”;

mercredi 23 octobre 13
Concaténation par
buffer

• La concaténation classique de String implique une
reconstruction systématique

String s=”Bonjour”;
s=s+” les amis”; // s est une nouvelle instance

• La classe StringBuffer résoud ce problème d’efficacité
StringBuffer sb=new StringBuffer();
sb.append(“Bonjour”);
sb.append(“ les amis”);
String s=sb.toString();
mercredi 23 octobre 13
Comparaison de
chaînes de caractères
• La comparaison directe va comparer les
pointeurs, pas le contenu :
if(s1==s2) ...

• La comparaison de contenu nécessite
l’utilisation de la méthode equals() :
if(s1.equals(s2)) ...

mercredi 23 octobre 13
Intérêt d’une classe
• Rappel : une classe =
• des informations (attributs)
• des actions pour manipuler ces
informations (méthodes)

• Ici, chaque instance de String rassemble :
• La chaîne de caractères
• De quoi retravailler cette chaîne
mercredi 23 octobre 13
Encapsulation dans une
chaîne de caractères
Avant :
La chaîne :
char[50]
Les outils :
(répartis dans
diverses librairies)
strcmp
strstr
strpos
...
mercredi 23 octobre 13

Après :

String
chaine
substr(int,int)
size()
equals(String)
...
Méthode vs Fonction
• Taille d’une chaîne en PHP via la fonction
strlen :

$taille=strlen($chaine);

• Equivalent en Java :

Un outil auquel on fournit
la donnée

int taille=chaine.length();
Une donnée encapsulant ses
outils
mercredi 23 octobre 13
Méthodes utiles de
String
trim()
Supprime les espaces
toLowerCase()
Force en minuscules
toUpperCase()
Force en majuscule
subString(int,int)
Retourne une sous-chaîne
indexOf(String) Retourne la position d’une sous chaine
charAt(int)
Renvoie le caractère à la position donnée
length()
Renvoie la longueur de chaîne
...
...

mercredi 23 octobre 13
Utilisation de la Javadoc

mercredi 23 octobre 13
Utilisation de la Javadoc
临河而羡鱼,不如归家织网

mercredi 23 octobre 13
Utilisation de la Javadoc
临河而羡鱼,不如归家织网
Si tu donnes un poisson à un homme, il mangera un jour.
Si tu lui apprend à pêcher, il mangera toujours. 

mercredi 23 octobre 13
Liste des
packages

Index des
méthodes
Package
Héritage

Liste des
classes

mercredi 23 octobre 13
Clic pour voir le
détail

Regarder le
type de sortie pour
choisir une bonne
méthode

Méthode
statique
mercredi 23 octobre 13
Transtypage / Casting
• Le transtypage permet de gérer les
conversions d’un type à un autre

• Différents cas se présentent :
• D’un type scalaire à un autre
• D’une classe à une autre
• Entre classes et types scalaires
mercredi 23 octobre 13
Casting entre types
scalaires
• Tout est possible, mais attention aux pertes
de précision

int i=10;
double d=10.1;
d=i; // interdit
d=(double)i; // autorisé
i=(int)d; // autorisé, mais perte de précision

mercredi 23 octobre 13
Perte de précisions
dans les calculs
• Exemple :
int i=4;
int j=3;
double result=i/j;

i/j est une expression
donnant un entier

• Pour limiter la perte, il faut :
double result=i/(double)j;
ou
double result=(double)i/j;
mercredi 23 octobre 13

int / double est un
double
Cast entre classes :
downcasting
Livre livre=new Livre(...);
Produit prod;
prod=(Produit) livre; // autorisé
prod=livre; // autorisé, car un livre EST un produit

mercredi 23 octobre 13
Cast entre classes :
upcasting
Produit prod=new Livre(...); // autorisé (downcast)
Livre livre;
livre=prod; // interdit
livre=(Livre)prod; // autorisé, mais risqué

mercredi 23 octobre 13
Cast entre classes et
types scalaires
• Ex : passer un String en int, ou inversement
• Ce n’est pas possible directement
• Deux notions totalement différentes
• On passe par un intermédiaire
• Les class wrappers (enrobeurs)
mercredi 23 octobre 13
Les class Wrappers
• Ce sont des classes encapsulant des types
scalaires

• Ex : Integer iWrap=new Integer(12);

• Permet de faire bénéficier ses types
scalaires des atouts d’une classe :

• Fournir la donnée avec ses outils
mercredi 23 octobre 13
Class Wrappers
disponibles
Type primitif
boolean
byte
double
short
int
long
float
char

mercredi 23 octobre 13

Wrapper
Boolean
Byte
Double
Short
Integer
Long
Float
Character
Conversion d’un String
en int

Javadoc du class Wrap Integer :

String s=”12”;
Integer iWrap=new Integer(s);

int val=iWrap.intValue();
mercredi 23 octobre 13
Conversion String/int avec
une méthode statique
Javadoc du class Wrap Integer :

String s=”12”;
int val=Integer.parseInt(s);
Syntaxe
classe.méthode()

mercredi 23 octobre 13
Conversion int en String

• On utilise encore le classwrap Integer :
int val=12;
Integer iWrap=new Integer(val);
String s=iWrap.toString();

• Il existe aussi une méthode statique dans String :
String s=String.valueOf(val);

• Autre méthode, plus “douteuse” :
String s=””+val;
mercredi 23 octobre 13
Autoboxing de Java5

• Dans certains cas, l’encapsulation de types
dans des classwrap est automatique en
Java>5

• Exemple :
Avant :
List l=new ArrayList();
int val=100;
l.add(new Integer(val));

Après :
List l=new
ArrayList<Integer>();
int val=100;
l.add(val);

Conversion
implicite
mercredi 23 octobre 13
Listes dynamiques
• Classes héritant de la structure List :
• ArrayList : redimensionnement auto d’un
tableau

• LinkedList : véritable liste chaînée
• Chaque classe a ses atouts en termes
d’efficacité

• Mais l’utilisation est la même
mercredi 23 octobre 13
Exploitation d’une liste
• Création :
ArrayList liste=new ArrayList();

• Remplissage :
liste.add(element);

• Récupération d’un élément :
Voiture v=(Voiture)liste.get(i);

mercredi 23 octobre 13
Typage de listes en
Java >5
• Avant : upcasting risqué
Voiture v=(Voiture)liste.get(i);

• Après : listes typées et typage implicite
ArrayList<Voiture> liste=new ArrayList<Voiture>();
...
Voiture v=liste.get(i);

mercredi 23 octobre 13
Parcours de liste par
boucle for
ArrayList<Voiture> liste=new ArrayList<Voiture>();
...
for(int i=0;i<liste.size();i++)
{
size() détermine
Voiture v=liste.get(i); le nb d’éléments
...
}

mercredi 23 octobre 13
Parcours de liste par
itérateur
ArrayList<Voiture> liste=new ArrayList<Voiture>();
...
Iterator<Voiture> it=liste.iterator();
while(it.hasNext())
{
Voiture v=it.next();
...
}

mercredi 23 octobre 13
Parcours de liste par
itérateur implicite (Java5)
ArrayList<Voiture> liste=new ArrayList<Voiture>();
...
for(Voiture v: liste)
{
v.accelere();
Il s’agit en fait d’un «foreach»
...
}

mercredi 23 octobre 13
Expression d’une
instance en String

• Par défaut, Java ne sait pas comment “afficher”
une instance

Voiture v=new Voiture();
System.out.println(v);

➡Voiture@2a18bdf

• Cet affichage est en fait effectué par une
méthode toString() de la classe Object

• Rappel : toutes les classes héritent d’Object
mercredi 23 octobre 13
Surcharge de toString()

• Surcharger cette méthode permet de

personnaliser l’affichage de l’instance
public class Voiture
{
...
public String toString()
{
return “Je suis la voiture “
+this.nom;
Voiture v=new Voiture();
}
System.out.println(v);
}
Je suis la voiture XXX

➡

mercredi 23 octobre 13
Intérêts de la méthode
toString()
• Le concept d’instance “autodescriptive” est
très intéressant pour le debug

• Il est possible d’utiliser des appels à
toString() en cascade :

• Ex : ArrayList possède une méthode

toString() qui va appeler le toString() de
chacun de ses éléments

mercredi 23 octobre 13
Exceptions
• Une exception représente soit :
• Une erreur (système)
• Une erreur (de votre application)
• Un cas alternatif
mercredi 23 octobre 13
Section de code
critique
• Le code potentiellement source d’erreur
sera encadré par un bloc try :

try
{
FileReader f=new FileReader(“unfic.txt”);
}

mercredi 23 octobre 13
Capture des erreurs
• Chaque bloc try est suivi d’un ou plusieurs
blocs catch

• Si une erreur apparaît, l’exécution de try

est stoppée, et le bloc catch apparaît à la
place

mercredi 23 octobre 13
Enchaînement try/catch
try
{
...
}
catch(IOException ioe)
{
.... gestion de l’erreur de type IO
}
catch(Exception e)
{ ... gestion des autres erreurs }
mercredi 23 octobre 13
.......
try
{
...
instruction à problème
.....
}
catch(IOException ioe)
{
.... gestion de l’erreur de type IO
}
......
mercredi 23 octobre 13
.......
try
{
...
instruction à problème
.....
}
catch(IOException ioe)
{
.... gestion de l’erreur de type IO
}
......
mercredi 23 octobre 13
.......
try
{
...
instruction à problème
.....
}
catch(IOException ioe)
{
.... gestion de l’erreur de type IO
}
......
mercredi 23 octobre 13
.......
try
{
...
instruction à problème
.....
}
catch(IOException ioe)
{
.... gestion de l’erreur de type IO
}
......
mercredi 23 octobre 13
.......
try
{
...
instruction à problème
.....
}
catch(IOException ioe)
{
.... gestion de l’erreur de type IO
}
......
mercredi 23 octobre 13
.......
try
{
...
instruction à problème
.....
}
catch(IOException ioe)
{
.... gestion de l’erreur de type IO
}
......
mercredi 23 octobre 13
Que faire en cas
d’erreur ?
• L’erreur peut se réparer localement ?
• On fait un try/catch
• L’erreur est grave, il faut sortir de la
méthode

• On relance l’exception via un throws
mercredi 23 octobre 13
Avant la remontée
d’erreur
void uneMethode()
{
....
instructionAProbleme
...
}

{
....
inst.uneMethode();
...
}

mercredi 23 octobre 13
Remontée d’erreur
void uneMethode()
throws IOException
{
....
instructionAProbleme
...
}

{
....
Cet appel
est devenu section
try
de code critique
{
inst.uneMethode();
}
catch(IOException ioe)
{ ... }
...
}

mercredi 23 octobre 13
Différentes exceptions
• Celles héritant de Exception
• “checked exceptions”, les plus connues
• Celles héritant de Error
• Erreurs système graves
• Celles héritant de RuntimeException
• “unchecked exceptions”, n’obligeant pas
un try/catch pour les gérer

mercredi 23 octobre 13
Le bloc finally
•

Est exécuté qu’il y
aie une erreur ou
non

• Finalement presque

identique au bloc de
données après le
catch

• Mais est exécuté

même en cas de
sortie anticipée de la
fonction

mercredi 23 octobre 13

try
{
.....
}
catch(Exception e)
{
.... ; return;
}
finally
{
.. // est exécuté avant le return
}
Générer ses propres
exceptions
1) Définir l’exception

• Il s’agit d’une classe héritant de Exception

public class QINegatifException extends Exception
{
public QINegatifException(String nom)
{
super(“Attention, “+nom+” a un QI d’huitre !”);
}
Appel
constructeur classe
}
mère

mercredi 23 octobre 13
Générer ses propres
exceptions
2) Lancer l’exception

• Lorsque celà vous parait utile, vous lancez l’exception
{
...
if(qi<0)
throw new QINegatifException(“bob”);
...
}
mercredi 23 octobre 13
Générer ses propres
exceptions
3) Définir le code critique

• La méthode où vous avez lancé l’exception devient
section de code critique

void ajoutLofteur(Lofteur l) throws QINegatifException
{
Ne pas confondre
...
avec throw (sans S)
if(l.getQi()<0)
throw new QINegatifException(l.getNom());
...
}
mercredi 23 octobre 13
Générer ses propres
exceptions
4) Lever l’exception

• On gère l’appel au code critique comme à l’accoutumée
try
L’utilisateur de la
{
classe est obligé par le
compilateur de gérer l’exception
...
‘proprement’
loft.ajoutLofteur(l);
...
}
catch(QINegatifException qie) { ... }
mercredi 23 octobre 13
Comment gérer
l’erreur ?

• Le plus souvent, on se contente d’afficher l’erreur
• System.err.println(e.getMessage());
• e.printStackTrace();
• Autant que possible, effectuer un traitement
adéquat

• Le plus souvent, tout ce joue dans ce qu’on va
mettre dans le try / en dehors du try

mercredi 23 octobre 13
Lire un fichier de
propriétés
• La plupart des applis Java stockent leurs

paramètres dans un fichier texte de type :
machin.properties

• Il existe une petite classe permettant de
faciliter l’accès à ces propriétés

mercredi 23 octobre 13
Utilisation de la classe
Properties

Fichier
monappli.properties

import java.util.Properties;

monappli.url=http://www.olek.fr
monappli.chemin=/usr/local/appli

Properties prop = new Properties();
// Lecture du fichier contenant les données de configuration
FileInputStream in = new FileInputStream("monappli.properties");
prop.load(in);
in.close();
// Extraction des propriétés
String url = prop.getProperty("monappli.url");
String user = prop.getProperty("monappli.chemin");

mercredi 23 octobre 13
Marshalling XML
• Objectif : sauvegarder une trace de ses
données sous forme d’un fichier XML

• Exemple : fichier de configuration
• On peut utiliser :
• Des outils complets de marshalling
(CastorXML, par ex)

• Les classes standards de Java
• XStream (http://xstream.codehaus.org)
mercredi 23 octobre 13
Avec Java standard
• Depuis la v1.4, on dispose de classes
XMLEncoder et XMLDecoder

• Usage :
XMLEncoder e = new XMLEncoder(
new BufferedOutputStream(
new FileOutputStream("Test.xml")));
e.writeObject(instanceASerialiser);
e.close();

mercredi 23 octobre 13
Limitation de ces
classes

• Utilisation impérative de beans

(constructeur sans paramètre et get/set
systématiques)

• Code XML généré lourd
• On voit les objets ArrayList, etc...
• A réserver à l’archivage de petites classes
isolées

• Par ex, classe de configuration
mercredi 23 octobre 13
Avec XStream

XStream xstream = new XStream(new DomDriver());

// écriture du XML à partir d’une instance de classe
xstream.toXML(inst, new BufferedOutputStream(
new FileOutputStream("Test.xml")));
// lecture du XML et récupération de l’instance
MaClasse inst=(MaClasse)
xstream.fromXML(new BufferedInputStream(
new FileInputStream("Test.xml")));

• On peut également gérer des “mappings”

permettant de préciser les noms utilisés au
final dans le XML

mercredi 23 octobre 13
Sérialisation
• Va prendre une “image “ d’une instance
telle qu’elle est présente en mémoire

• Et la transforme en suite d’octets que l’on
peut manipuler directement

• Pour transfert via le réseau
• Pour stockage dans un fichier ou une
base (dans un blob)

mercredi 23 octobre 13
Mise en place
• Les classes à stocker doivent implémenter
l’interface Serializable

• Cette interface est vide, aucune méthode à
implémenter

• Elle joue simplement le rôle de marqueur

• On utilise ensuite les outils

ObjectOutputStream et ObjectInputStream

mercredi 23 octobre 13
ObjectOutputStream
• Exemple de stockage dans un fichier :
! FileOutputStream fos = new FileOutputStream("t.tmp");
! ObjectOutputStream oos = new ObjectOutputStream(fos);
! oos.writeObject(moninstance);
! oos.close();
fos.close();

mercredi 23 octobre 13
ObjectInputStream
• Relecture de l’objet à partir du fichier
! FileInputStream fis = new FileInputStream("t.tmp");
! ObjectInputStream ois = new ObjectInputStream(fis);
! MaClasse instanceRecup=(MaClasse)ois.readObject();
! oos.close();
fos.close();

mercredi 23 octobre 13
Qu’est ce qui est
sérialisé ?

• Données ET méthodes
• Vraie encapsulation
• Sérialisation en cascade
• Si des attributs pointent vers d’autres

objets, ils sont sérialisés (même les listes)

• Pour ignorer un attribut : transient
mercredi 23 octobre 13
Gestion des logs
• Objectif : remplacer les bêtes “println” qui
parsement nos programmes

• Pourquoi ?
• Pouvoir les rediriger où l’on veut
(fichier...)

• Gérer différents niveaux d’affichage
• Debug, erreurs...
mercredi 23 octobre 13
L’outil Log4J d’Apache
• Autre possibilité : java.util.logging
• Permet la gestion de différents niveaux d’erreur
• DEBUG >WARN>INFO>ERROR
• Ainsi que le reroutage sur divers périphériques
• CONSOLE, LOGFILE...
• Possibilité de gérer des roulements de
fichiers

mercredi 23 octobre 13
Utilisation de Log4J
	
	
	
	
	
	
	
	
	
	
	
	
	

mercredi 23 octobre 13

// récup du fichier de configuration	
PropertyConfigurator.configure("log4j.properties");
//initialisation du Logger
Logger log=Logger.getLogger(Essai.class);
// émission de messages
log.debug("debug!!");
log.warn("warn !");
log.fatal("fatal !");
log.info("info !");
Fichier de configuration
# Set root category priority to INFO and its only appender to
CONSOLE.
log4j.rootCategory=INFO, CONSOLE
#log4j.rootCategory=INFO, CONSOLE, LOGFILE
# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Threshold=INFO
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[%t] %-5p %c - %m%n

mercredi 23 octobre 13

Mais conteúdo relacionado

Mais procurados

Cours php & Mysql - 1ére partie
Cours php & Mysql - 1ére partieCours php & Mysql - 1ére partie
Cours php & Mysql - 1ére partiekadzaki
 
Chapitre 6 traitement des exceptions
Chapitre 6  traitement des exceptionsChapitre 6  traitement des exceptions
Chapitre 6 traitement des exceptionsAmir Souissi
 
Uml: Diagrammes de classes -- Concepts avances --- 27
Uml: Diagrammes de classes -- Concepts avances --- 27Uml: Diagrammes de classes -- Concepts avances --- 27
Uml: Diagrammes de classes -- Concepts avances --- 27megaplanet20
 
diagramme de séquence UML
diagramme de séquence UMLdiagramme de séquence UML
diagramme de séquence UMLAmir Souissi
 
Administration des base de donnees sous oracle 10g
Administration des base de donnees sous oracle 10g Administration des base de donnees sous oracle 10g
Administration des base de donnees sous oracle 10g noble Bajoli
 
Entreprise Java Beans (EJB)
Entreprise Java Beans (EJB)Entreprise Java Beans (EJB)
Entreprise Java Beans (EJB)Heithem Abbes
 
Concevoir, développer et sécuriser des micro-services avec Spring Boot
Concevoir, développer et sécuriser des micro-services avec Spring BootConcevoir, développer et sécuriser des micro-services avec Spring Boot
Concevoir, développer et sécuriser des micro-services avec Spring BootDNG Consulting
 
Rapport de mini projet de programation web
Rapport de mini projet de programation webRapport de mini projet de programation web
Rapport de mini projet de programation webMOHAMMED MOURADI
 
Introduction à React JS
Introduction à React JSIntroduction à React JS
Introduction à React JSAbdoulaye Dieng
 

Mais procurados (20)

Cours php & Mysql - 1ére partie
Cours php & Mysql - 1ére partieCours php & Mysql - 1ére partie
Cours php & Mysql - 1ére partie
 
Support NodeJS avec TypeScript Express MongoDB
Support NodeJS avec TypeScript Express MongoDBSupport NodeJS avec TypeScript Express MongoDB
Support NodeJS avec TypeScript Express MongoDB
 
Chapitre 6 traitement des exceptions
Chapitre 6  traitement des exceptionsChapitre 6  traitement des exceptions
Chapitre 6 traitement des exceptions
 
Uml: Diagrammes de classes -- Concepts avances --- 27
Uml: Diagrammes de classes -- Concepts avances --- 27Uml: Diagrammes de classes -- Concepts avances --- 27
Uml: Diagrammes de classes -- Concepts avances --- 27
 
diagramme de séquence UML
diagramme de séquence UMLdiagramme de séquence UML
diagramme de séquence UML
 
Java
JavaJava
Java
 
Polymorphisme (cours, résumé)
Polymorphisme (cours, résumé)Polymorphisme (cours, résumé)
Polymorphisme (cours, résumé)
 
Administration des base de donnees sous oracle 10g
Administration des base de donnees sous oracle 10g Administration des base de donnees sous oracle 10g
Administration des base de donnees sous oracle 10g
 
Plsql
PlsqlPlsql
Plsql
 
Support de cours technologie et application m.youssfi
Support de cours technologie et application m.youssfiSupport de cours technologie et application m.youssfi
Support de cours technologie et application m.youssfi
 
Entreprise Java Beans (EJB)
Entreprise Java Beans (EJB)Entreprise Java Beans (EJB)
Entreprise Java Beans (EJB)
 
Polymorphisme, interface et classe abstraite
Polymorphisme, interface et classe abstraitePolymorphisme, interface et classe abstraite
Polymorphisme, interface et classe abstraite
 
Support de cours angular
Support de cours angularSupport de cours angular
Support de cours angular
 
Concevoir, développer et sécuriser des micro-services avec Spring Boot
Concevoir, développer et sécuriser des micro-services avec Spring BootConcevoir, développer et sécuriser des micro-services avec Spring Boot
Concevoir, développer et sécuriser des micro-services avec Spring Boot
 
Langage C#
Langage C#Langage C#
Langage C#
 
Rapport de mini projet de programation web
Rapport de mini projet de programation webRapport de mini projet de programation web
Rapport de mini projet de programation web
 
Introduction à ASP.NET
Introduction à ASP.NETIntroduction à ASP.NET
Introduction à ASP.NET
 
Cours java
Cours javaCours java
Cours java
 
Introduction à Angular
Introduction à AngularIntroduction à Angular
Introduction à Angular
 
Introduction à React JS
Introduction à React JSIntroduction à React JS
Introduction à React JS
 

Destaque (20)

Java - implémentation des concepts objets
Java - implémentation des concepts objetsJava - implémentation des concepts objets
Java - implémentation des concepts objets
 
Plan d'action WAI
Plan d'action WAIPlan d'action WAI
Plan d'action WAI
 
Internet mobile
Internet mobileInternet mobile
Internet mobile
 
Télétravail et égilité : un mariage impossible ?
Télétravail et égilité : un mariage impossible ?Télétravail et égilité : un mariage impossible ?
Télétravail et égilité : un mariage impossible ?
 
Ecommerce
EcommerceEcommerce
Ecommerce
 
Agilité et Entreprise libérée
Agilité et Entreprise libéréeAgilité et Entreprise libérée
Agilité et Entreprise libérée
 
Genielogiciel
GenielogicielGenielogiciel
Genielogiciel
 
JAVA, JDBC et liaison base de données
JAVA, JDBC et liaison base de donnéesJAVA, JDBC et liaison base de données
JAVA, JDBC et liaison base de données
 
Développement web mobile avec IONIC 2
Développement web mobile avec IONIC 2Développement web mobile avec IONIC 2
Développement web mobile avec IONIC 2
 
Mod 11 virtual
Mod 11 virtualMod 11 virtual
Mod 11 virtual
 
Ateliers Innovez par les services
Ateliers Innovez par les servicesAteliers Innovez par les services
Ateliers Innovez par les services
 
Tarea miii 01_2015
Tarea miii 01_2015Tarea miii 01_2015
Tarea miii 01_2015
 
Paseos yunquera
Paseos yunqueraPaseos yunquera
Paseos yunquera
 
Les premiers pas avec power point 2007 et 2010
Les premiers pas avec power point 2007 et 2010Les premiers pas avec power point 2007 et 2010
Les premiers pas avec power point 2007 et 2010
 
La Celestina
La CelestinaLa Celestina
La Celestina
 
Radio vs Com. Politique
Radio vs Com. PolitiqueRadio vs Com. Politique
Radio vs Com. Politique
 
Exposición metodo
Exposición metodoExposición metodo
Exposición metodo
 
Presentacion tesoreria 2010 [1]
Presentacion tesoreria 2010 [1]Presentacion tesoreria 2010 [1]
Presentacion tesoreria 2010 [1]
 
Expresión oral
Expresión oralExpresión oral
Expresión oral
 
2010 03-10 powerpointapc
2010 03-10 powerpointapc2010 03-10 powerpointapc
2010 03-10 powerpointapc
 

Semelhante a Java - notions de bases pour développeur

Javaday Paris 2022 - Java en 2022 : profiter de Java 17
Javaday Paris 2022 - Java en 2022 : profiter de Java 17Javaday Paris 2022 - Java en 2022 : profiter de Java 17
Javaday Paris 2022 - Java en 2022 : profiter de Java 17Jean-Michel Doudoux
 
Introduction Erlang - altnet fr Juin 2013
Introduction Erlang - altnet fr Juin 2013Introduction Erlang - altnet fr Juin 2013
Introduction Erlang - altnet fr Juin 2013Yann Schwartz
 
devoxx 2022 - 10 ans de Devoxx FR et de Java.pdf
devoxx 2022 - 10 ans de Devoxx FR et de Java.pdfdevoxx 2022 - 10 ans de Devoxx FR et de Java.pdf
devoxx 2022 - 10 ans de Devoxx FR et de Java.pdfJean-Michel Doudoux
 
intro-csharp developement master 2 IF APP
intro-csharp developement master 2 IF APPintro-csharp developement master 2 IF APP
intro-csharp developement master 2 IF APPfrwebhelp
 
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018Loic Yon
 
Programmation concurrente en Java
Programmation concurrente en JavaProgrammation concurrente en Java
Programmation concurrente en JavaFlorian Beaufumé
 
Systemes d'explotation: Threads
Systemes d'explotation: ThreadsSystemes d'explotation: Threads
Systemes d'explotation: ThreadsAlexandru Radovici
 
JavaLesBasespourles debutantset pour vous.pdf
JavaLesBasespourles debutantset pour vous.pdfJavaLesBasespourles debutantset pour vous.pdf
JavaLesBasespourles debutantset pour vous.pdfhindguendouz2000
 
0251-formation-java-programmation-objet.pdf
0251-formation-java-programmation-objet.pdf0251-formation-java-programmation-objet.pdf
0251-formation-java-programmation-objet.pdfOmbotimbe Salifou
 
I le langage java d'una manière avancée introduction
I  le langage java d'una manière avancée introductionI  le langage java d'una manière avancée introduction
I le langage java d'una manière avancée introductionsabrine_hamdi
 
GPGPU facile avec JavaCL, et trivial avec ScalaCL !
GPGPU facile avec JavaCL, et trivial avec ScalaCL !GPGPU facile avec JavaCL, et trivial avec ScalaCL !
GPGPU facile avec JavaCL, et trivial avec ScalaCL !ochafik
 
Dotnet csharp
Dotnet csharpDotnet csharp
Dotnet csharpSDFG5
 
Langage Java et Programmation Orienté Objet
Langage Java et Programmation Orienté ObjetLangage Java et Programmation Orienté Objet
Langage Java et Programmation Orienté ObjetMohammed Jaafar
 

Semelhante a Java - notions de bases pour développeur (20)

Javaday Paris 2022 - Java en 2022 : profiter de Java 17
Javaday Paris 2022 - Java en 2022 : profiter de Java 17Javaday Paris 2022 - Java en 2022 : profiter de Java 17
Javaday Paris 2022 - Java en 2022 : profiter de Java 17
 
Introduction Erlang - altnet fr Juin 2013
Introduction Erlang - altnet fr Juin 2013Introduction Erlang - altnet fr Juin 2013
Introduction Erlang - altnet fr Juin 2013
 
Nouveautés de java 8
Nouveautés de java 8Nouveautés de java 8
Nouveautés de java 8
 
devoxx 2022 - 10 ans de Devoxx FR et de Java.pdf
devoxx 2022 - 10 ans de Devoxx FR et de Java.pdfdevoxx 2022 - 10 ans de Devoxx FR et de Java.pdf
devoxx 2022 - 10 ans de Devoxx FR et de Java.pdf
 
intro-csharp developement master 2 IF APP
intro-csharp developement master 2 IF APPintro-csharp developement master 2 IF APP
intro-csharp developement master 2 IF APP
 
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
 
Programmation concurrente en Java
Programmation concurrente en JavaProgrammation concurrente en Java
Programmation concurrente en Java
 
Systemes d'explotation: Threads
Systemes d'explotation: ThreadsSystemes d'explotation: Threads
Systemes d'explotation: Threads
 
SdE 10 - Threads
SdE 10 - ThreadsSdE 10 - Threads
SdE 10 - Threads
 
Bonnes pratiques développement android
Bonnes pratiques développement androidBonnes pratiques développement android
Bonnes pratiques développement android
 
Introduction a Java
Introduction a JavaIntroduction a Java
Introduction a Java
 
XB-Java.ppt
XB-Java.pptXB-Java.ppt
XB-Java.ppt
 
JavaLesBasespourles debutantset pour vous.pdf
JavaLesBasespourles debutantset pour vous.pdfJavaLesBasespourles debutantset pour vous.pdf
JavaLesBasespourles debutantset pour vous.pdf
 
0251-formation-java-programmation-objet.pdf
0251-formation-java-programmation-objet.pdf0251-formation-java-programmation-objet.pdf
0251-formation-java-programmation-objet.pdf
 
Splunk
SplunkSplunk
Splunk
 
I le langage java d'una manière avancée introduction
I  le langage java d'una manière avancée introductionI  le langage java d'una manière avancée introduction
I le langage java d'una manière avancée introduction
 
GPGPU facile avec JavaCL, et trivial avec ScalaCL !
GPGPU facile avec JavaCL, et trivial avec ScalaCL !GPGPU facile avec JavaCL, et trivial avec ScalaCL !
GPGPU facile avec JavaCL, et trivial avec ScalaCL !
 
Dotnet csharp
Dotnet csharpDotnet csharp
Dotnet csharp
 
Langage Java et Programmation Orienté Objet
Langage Java et Programmation Orienté ObjetLangage Java et Programmation Orienté Objet
Langage Java et Programmation Orienté Objet
 
Introduction Kotlin
Introduction KotlinIntroduction Kotlin
Introduction Kotlin
 

Java - notions de bases pour développeur

  • 1. Java La syntaxe Les aspects techniques jd@olek.fr - Version du 22/10/13 mercredi 23 octobre 13
  • 2. Rapide historique • 1995 : sortie de la première version • Rachat de Sun par Oracle en 2009 • Langage issu des concepts objets • Plus mature que C++, Smalltalk... • Portable sur plateformes hétérogènes • Principe de virtualisation de l’exécution mercredi 23 octobre 13
  • 3. Différentes versions • • • 1996 : JDK 1.0 (211 classes) 1997 : JDK 1.1 (477 classes) 1998 : Java 2 (1 524 classes) • • • • • • • • mercredi 23 octobre 13 J2ME : Mobile Edition J2SE : Reprise du Java “standard” J2EE : Enterprise Edition (serveur) 2000 : J2SE 1.3 (1 840 classes) 2002 : J2SE 1.4 (2 723 classes) 2004 : J2SE 5.0 (3 270 classes) 2006 : Java SE 6 (3 777 classes) 2011 : Java SE 7 (8 000 classes)
  • 4. Cycle de compilation d’un langage ‘classique’ Compilateur Code source toto.c Editeur de liens Code objet toto.o •Fichier texte •Fichier binaire •Compatibilité si langage •Compatibilité CPU normé Code exécutable toto.exe •Fichier binaire •Compatibilité OS Liaison avec des bibliothèques faisant la liaison avec le système mercredi 23 octobre 13
  • 5. Compilation/exécution en Java Compilateur Code source Toto.java •Fichier texte •Compatibilité totale (norme gérée par Sun) Exécution par la JVM Bytecode Toto.class •Fichier binaire •Compatibilité JVM Code interprété ou émulé •Exécution directe en mémoire •Compatibilité OS Liaison avec des bibliothèques elles aussi en bytecode mercredi 23 octobre 13
  • 6. Caractéristiques du langage (1) • Hétérogène • Peut s’exécuter dans des environnements très divers • Pas de problème de compatibilité • Même au niveau des types • Même au niveau de l’interface graphique mercredi 23 octobre 13
  • 7. Caractéristiques du langage (2) • Objet • Bénéficie des retours d’expériences d’avant 95 • Ce n’est pas une adaptation d’un langage existant • Tout est encapsulé dans des classes • Simple • La syntaxe est simplifiée et abordable mercredi 23 octobre 13
  • 8. Caractéristiques du langage (3) • Robuste • La JVM détecte les erreurs et gère les éventuelles fuites mémoire • Orienté réseau • Gestion native des threads • Protocoles réseaux inclus en standard • Informatique distribuée mercredi 23 octobre 13
  • 9. Caractéristiques du langage (4) • (relativement) ouvert sur l’extérieur • Les interfaces JNI permettent de faire passerelle avec les parties “natives” du système (matériel, réseau, OS...) • Très typé Web • J2EE fournit un serveur d’application complet pour le Web • Tous les standards sont là : XML, Ajax... mercredi 23 octobre 13
  • 10. Points faibles • L’étape d’interprétation de la JVM entraine bien sûr une plus grande lenteur et lourdeur • La syntaxe est simplifiée par rapport à d’autres langages (C++...) • En revanche, certaines subtilités “techniques” ne sont pas possibles mercredi 23 octobre 13
  • 11. Environnements de développement • L’ex Leader : Borland JBuilder • Aujourd’hui : Eclipse / IBM Rational App Dev • Base OpenSource donnée par IBM • Extensions par Plugins • Plugins OpenSource ou IBM • Chez Sun : NetBeans mercredi 23 octobre 13
  • 12. Les commandes de base • java : appel à la JVM • javac : compilateur, produit des .class • javap : désassembleur • javadoc : génère la documentation • jar : gestion des Java ARchives mercredi 23 octobre 13
  • 13. Compilation manuelle • Vérifier la présence des variables d’environnement : • JAVA_HOME : pointe sur le JDK • PATH : doit intégrer $JAVA_HOME/bin • CLASSPATH : doit intégrer $JAVA_HOME/lib ainsi que vos propres librairies (répertoires et .jar) mercredi 23 octobre 13
  • 14. My first class • Et c’est parti ! Dans un fichier texte Essai.java, on tape : public class Essai { public static void main(String args[]) { System.out.println(“Goodbye cruel world !”); } } http://fr.wikipedia.org/wiki/Hello_world mercredi 23 octobre 13
  • 15. Utilisation de base des commandes • javac Essai.java • Compile notre fichier Essai.java • On obtient un fichier Essai.class • java Essai • Lance la classe contenue dans Essai.class mercredi 23 octobre 13
  • 16. Notion de packages • Les classes sont organisées en packages, afin de les organiser • Les packages sont des répertoires • On prend souvent le nom de domaine de la société pour garantir un nom unique • Dans le code, un package est représenté sous la forme : package fr.olek.cours.debutant; mercredi 23 octobre 13
  • 17. Déclaration d’une classe dans un package package fr.olek.cours.repondeur; public class Repondeur { ... } Le fichier se trouve dans : /fr/ecoms/cours/repondeur/ mercredi 23 octobre 13
  • 18. Appel d’une classe dans un package • La syntaxe est plutôt lourde : public class Essai { public static void main(String args[]) { fr.olek.cours.repondeur.Repondeur r= new fr.olek.cours.repondeur.Repondeur(); } } mercredi 23 octobre 13
  • 19. Utilisation de la clause import • Il vaut mieux l’importer : import fr.olek.cours.repondeur.Repondeur; public class Essai { public static void main(String args[]) { Repondeur r=new Repondeur(); } } mercredi 23 octobre 13
  • 20. Divers usages d’import • import n’importe pas “physiquement” les packages mentionnés • Simple indication à la JVM pour savoir où trouver les classes utilisées • Il est possible d’importer toutes les classes d’un package d’un coup : import fr.olek.cours.repondeur.*; • Attention, ça n’inclue pas les sous-packages ! import fr.olek.*; // ne va pas importer “Repondeur” mercredi 23 octobre 13
  • 21. Régler les ambiguités • Dans certains cas, des classes portent le même nom, dans des packages différents import java.awt.*; // contient une classe “Point” import fr.olek.geometrie.Point; ... Point p=new Point(); // on utilise le nôtre mercredi 23 octobre 13
  • 22. Imports statiques • Nouveauté de Java 5.0 • Permet d’éviter la syntaxe classe.méthode ou classe.attribut • Exemple : import static java.lang.Math; ... aire=rayon*java.lang.Math.PI; aire=rayon*Math.PI; aire=rayon*PI; mercredi 23 octobre 13
  • 23. Les commentaires • Pour commenter une seule ligne : // Ligne de commentaire • Bloc de commentaire : /* Début de bloc .... Blabliblu */ • Bloc de commentaire de documentation /** Début de bloc .... Blabliblu */ mercredi 23 octobre 13
  • 24. Les types de données • On les appelle “types scalaires” • 3 grands types : • Numériques • Entiers • Réels • Booléens • Caractères mercredi 23 octobre 13
  • 25. Les types numériques • Ils sont tous complètement normalisés ! • Quelque soit la plateforme, un même type aura toujours la même représentation • Les entiers sont par défaut signés • long et short sont des types à part entière mercredi 23 octobre 13
  • 26. Les différents types numériques disponibles Type Taille mémoire byte 1 octet short 2 octets int 4 octets long 8 octets • Par défaut, les nombres sont de type int • Les suffixes permettent de forcer un type : 1234L mercredi 23 octobre 13
  • 27. Types réels Type Taille mémoire float 4 octets double 8 octets • Contrairement à C/C++, il existe une vraie arithmétique en float • Par défaut, un nombre à virgule est un double • Suffixe pour un float : 12.24F mercredi 23 octobre 13
  • 28. Type booléen • Fini les réprésentations via des entiers 0 et 1 (ou 0 et -1, ou 1 et 2...) • Java propose un type boolean à part entière • 2 constantes particulières • true • false • boolean est le seul type utilisé pour les tests • Toute expression de test est donc booléenne mercredi 23 octobre 13
  • 29. Exemple de test booléen Expression booléenne if(a==b) .... • Pour tester un booléen : boolean flag=false; ... if(flag==true) if(flag) mercredi 23 octobre 13 Expression redondante if(flag==false) if(!flag)
  • 30. Conditions if(expression) instruction1; else instruction2; instruction3; mercredi 23 octobre 13 •Chaque expression est booléenne •Chaque instruction peut être remplacée par un bloc : { if(expression1) instruction1; else if(expression2) } instruction2; else if(expression3) instruction3; else instruction4; instruction 1; ... instruction n;
  • 31. Choix multiples int choix; switch(choix) { case 1: Exécuté si choix=1 i=3; break; Ordre de débranchement case 2: case 3: i=4; break; Exécuté si choix=2 ou 3 default: i=3; Choix par défaut } mercredi 23 octobre 13 switch/case ne marche qu’avec des types scalaires ! (=>pas de String)
  • 32. Boucles • La boucle type en Java est while : while(condition) { instruction1; } Exécuté au moins une fois mercredi 23 octobre 13 do { instruction1; } while(condition)
  • 33. Boucle for • Héritée du langage C • En fait, un condensé d’une boucle while avec incrémentation for(exp_init; exp_test; exp_maj) { instruction1; } exp_init; while(exp_test) { instruction1; exp_maj; } Exemple : for(int i=0;i<10;i++) ... mercredi 23 octobre 13
  • 34. Caractères • • • • mercredi 23 octobre 13 Particularité de Java : tout caractère est au format UNICODE sur 16 bits Saisie d’une constante caractère : char char char char c1=’A’; c2=’t’; c3=’060’; c4=’u0030’; // // // // // Caractère en dur Séquence d’échappement classique du C Exactement 3 chiffres en octal Exactement 4 chiffres en hexadécimal pour une constante UNICODE Attention aux caractères Français accentués Unicode conseillé... • char eacute=’u00E9’; // le caractère « é » char est de toute manière peu utilisé On préférera utiliser la classe String •
  • 35. Chaîne de caractères • Fini les bidouilles de tableau de caractères • On utilise une classe à part entière String s=new String(“bonjour les amis”); • ou plutôt : String s=”bonjour les amis”; mercredi 23 octobre 13
  • 36. Concaténation String nom=”Paul”; String phrase=”Bonjour,”+nom+”, comment va ?”; • On peut également concaténer des éléments autres que “String” • Ils seront automatiquement convertis int age=10; String phrase=”Tu as “+age+” ans”; mercredi 23 octobre 13
  • 37. Concaténation par buffer • La concaténation classique de String implique une reconstruction systématique String s=”Bonjour”; s=s+” les amis”; // s est une nouvelle instance • La classe StringBuffer résoud ce problème d’efficacité StringBuffer sb=new StringBuffer(); sb.append(“Bonjour”); sb.append(“ les amis”); String s=sb.toString(); mercredi 23 octobre 13
  • 38. Comparaison de chaînes de caractères • La comparaison directe va comparer les pointeurs, pas le contenu : if(s1==s2) ... • La comparaison de contenu nécessite l’utilisation de la méthode equals() : if(s1.equals(s2)) ... mercredi 23 octobre 13
  • 39. Intérêt d’une classe • Rappel : une classe = • des informations (attributs) • des actions pour manipuler ces informations (méthodes) • Ici, chaque instance de String rassemble : • La chaîne de caractères • De quoi retravailler cette chaîne mercredi 23 octobre 13
  • 40. Encapsulation dans une chaîne de caractères Avant : La chaîne : char[50] Les outils : (répartis dans diverses librairies) strcmp strstr strpos ... mercredi 23 octobre 13 Après : String chaine substr(int,int) size() equals(String) ...
  • 41. Méthode vs Fonction • Taille d’une chaîne en PHP via la fonction strlen : $taille=strlen($chaine); • Equivalent en Java : Un outil auquel on fournit la donnée int taille=chaine.length(); Une donnée encapsulant ses outils mercredi 23 octobre 13
  • 42. Méthodes utiles de String trim() Supprime les espaces toLowerCase() Force en minuscules toUpperCase() Force en majuscule subString(int,int) Retourne une sous-chaîne indexOf(String) Retourne la position d’une sous chaine charAt(int) Renvoie le caractère à la position donnée length() Renvoie la longueur de chaîne ... ... mercredi 23 octobre 13
  • 43. Utilisation de la Javadoc mercredi 23 octobre 13
  • 44. Utilisation de la Javadoc 临河而羡鱼,不如归家织网 mercredi 23 octobre 13
  • 45. Utilisation de la Javadoc 临河而羡鱼,不如归家织网 Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprend à pêcher, il mangera toujours.  mercredi 23 octobre 13
  • 47. Clic pour voir le détail Regarder le type de sortie pour choisir une bonne méthode Méthode statique mercredi 23 octobre 13
  • 48. Transtypage / Casting • Le transtypage permet de gérer les conversions d’un type à un autre • Différents cas se présentent : • D’un type scalaire à un autre • D’une classe à une autre • Entre classes et types scalaires mercredi 23 octobre 13
  • 49. Casting entre types scalaires • Tout est possible, mais attention aux pertes de précision int i=10; double d=10.1; d=i; // interdit d=(double)i; // autorisé i=(int)d; // autorisé, mais perte de précision mercredi 23 octobre 13
  • 50. Perte de précisions dans les calculs • Exemple : int i=4; int j=3; double result=i/j; i/j est une expression donnant un entier • Pour limiter la perte, il faut : double result=i/(double)j; ou double result=(double)i/j; mercredi 23 octobre 13 int / double est un double
  • 51. Cast entre classes : downcasting Livre livre=new Livre(...); Produit prod; prod=(Produit) livre; // autorisé prod=livre; // autorisé, car un livre EST un produit mercredi 23 octobre 13
  • 52. Cast entre classes : upcasting Produit prod=new Livre(...); // autorisé (downcast) Livre livre; livre=prod; // interdit livre=(Livre)prod; // autorisé, mais risqué mercredi 23 octobre 13
  • 53. Cast entre classes et types scalaires • Ex : passer un String en int, ou inversement • Ce n’est pas possible directement • Deux notions totalement différentes • On passe par un intermédiaire • Les class wrappers (enrobeurs) mercredi 23 octobre 13
  • 54. Les class Wrappers • Ce sont des classes encapsulant des types scalaires • Ex : Integer iWrap=new Integer(12); • Permet de faire bénéficier ses types scalaires des atouts d’une classe : • Fournir la donnée avec ses outils mercredi 23 octobre 13
  • 55. Class Wrappers disponibles Type primitif boolean byte double short int long float char mercredi 23 octobre 13 Wrapper Boolean Byte Double Short Integer Long Float Character
  • 56. Conversion d’un String en int Javadoc du class Wrap Integer : String s=”12”; Integer iWrap=new Integer(s); int val=iWrap.intValue(); mercredi 23 octobre 13
  • 57. Conversion String/int avec une méthode statique Javadoc du class Wrap Integer : String s=”12”; int val=Integer.parseInt(s); Syntaxe classe.méthode() mercredi 23 octobre 13
  • 58. Conversion int en String • On utilise encore le classwrap Integer : int val=12; Integer iWrap=new Integer(val); String s=iWrap.toString(); • Il existe aussi une méthode statique dans String : String s=String.valueOf(val); • Autre méthode, plus “douteuse” : String s=””+val; mercredi 23 octobre 13
  • 59. Autoboxing de Java5 • Dans certains cas, l’encapsulation de types dans des classwrap est automatique en Java>5 • Exemple : Avant : List l=new ArrayList(); int val=100; l.add(new Integer(val)); Après : List l=new ArrayList<Integer>(); int val=100; l.add(val); Conversion implicite mercredi 23 octobre 13
  • 60. Listes dynamiques • Classes héritant de la structure List : • ArrayList : redimensionnement auto d’un tableau • LinkedList : véritable liste chaînée • Chaque classe a ses atouts en termes d’efficacité • Mais l’utilisation est la même mercredi 23 octobre 13
  • 61. Exploitation d’une liste • Création : ArrayList liste=new ArrayList(); • Remplissage : liste.add(element); • Récupération d’un élément : Voiture v=(Voiture)liste.get(i); mercredi 23 octobre 13
  • 62. Typage de listes en Java >5 • Avant : upcasting risqué Voiture v=(Voiture)liste.get(i); • Après : listes typées et typage implicite ArrayList<Voiture> liste=new ArrayList<Voiture>(); ... Voiture v=liste.get(i); mercredi 23 octobre 13
  • 63. Parcours de liste par boucle for ArrayList<Voiture> liste=new ArrayList<Voiture>(); ... for(int i=0;i<liste.size();i++) { size() détermine Voiture v=liste.get(i); le nb d’éléments ... } mercredi 23 octobre 13
  • 64. Parcours de liste par itérateur ArrayList<Voiture> liste=new ArrayList<Voiture>(); ... Iterator<Voiture> it=liste.iterator(); while(it.hasNext()) { Voiture v=it.next(); ... } mercredi 23 octobre 13
  • 65. Parcours de liste par itérateur implicite (Java5) ArrayList<Voiture> liste=new ArrayList<Voiture>(); ... for(Voiture v: liste) { v.accelere(); Il s’agit en fait d’un «foreach» ... } mercredi 23 octobre 13
  • 66. Expression d’une instance en String • Par défaut, Java ne sait pas comment “afficher” une instance Voiture v=new Voiture(); System.out.println(v); ➡Voiture@2a18bdf • Cet affichage est en fait effectué par une méthode toString() de la classe Object • Rappel : toutes les classes héritent d’Object mercredi 23 octobre 13
  • 67. Surcharge de toString() • Surcharger cette méthode permet de personnaliser l’affichage de l’instance public class Voiture { ... public String toString() { return “Je suis la voiture “ +this.nom; Voiture v=new Voiture(); } System.out.println(v); } Je suis la voiture XXX ➡ mercredi 23 octobre 13
  • 68. Intérêts de la méthode toString() • Le concept d’instance “autodescriptive” est très intéressant pour le debug • Il est possible d’utiliser des appels à toString() en cascade : • Ex : ArrayList possède une méthode toString() qui va appeler le toString() de chacun de ses éléments mercredi 23 octobre 13
  • 69. Exceptions • Une exception représente soit : • Une erreur (système) • Une erreur (de votre application) • Un cas alternatif mercredi 23 octobre 13
  • 70. Section de code critique • Le code potentiellement source d’erreur sera encadré par un bloc try : try { FileReader f=new FileReader(“unfic.txt”); } mercredi 23 octobre 13
  • 71. Capture des erreurs • Chaque bloc try est suivi d’un ou plusieurs blocs catch • Si une erreur apparaît, l’exécution de try est stoppée, et le bloc catch apparaît à la place mercredi 23 octobre 13
  • 72. Enchaînement try/catch try { ... } catch(IOException ioe) { .... gestion de l’erreur de type IO } catch(Exception e) { ... gestion des autres erreurs } mercredi 23 octobre 13
  • 73. ....... try { ... instruction à problème ..... } catch(IOException ioe) { .... gestion de l’erreur de type IO } ...... mercredi 23 octobre 13
  • 74. ....... try { ... instruction à problème ..... } catch(IOException ioe) { .... gestion de l’erreur de type IO } ...... mercredi 23 octobre 13
  • 75. ....... try { ... instruction à problème ..... } catch(IOException ioe) { .... gestion de l’erreur de type IO } ...... mercredi 23 octobre 13
  • 76. ....... try { ... instruction à problème ..... } catch(IOException ioe) { .... gestion de l’erreur de type IO } ...... mercredi 23 octobre 13
  • 77. ....... try { ... instruction à problème ..... } catch(IOException ioe) { .... gestion de l’erreur de type IO } ...... mercredi 23 octobre 13
  • 78. ....... try { ... instruction à problème ..... } catch(IOException ioe) { .... gestion de l’erreur de type IO } ...... mercredi 23 octobre 13
  • 79. Que faire en cas d’erreur ? • L’erreur peut se réparer localement ? • On fait un try/catch • L’erreur est grave, il faut sortir de la méthode • On relance l’exception via un throws mercredi 23 octobre 13
  • 80. Avant la remontée d’erreur void uneMethode() { .... instructionAProbleme ... } { .... inst.uneMethode(); ... } mercredi 23 octobre 13
  • 81. Remontée d’erreur void uneMethode() throws IOException { .... instructionAProbleme ... } { .... Cet appel est devenu section try de code critique { inst.uneMethode(); } catch(IOException ioe) { ... } ... } mercredi 23 octobre 13
  • 82. Différentes exceptions • Celles héritant de Exception • “checked exceptions”, les plus connues • Celles héritant de Error • Erreurs système graves • Celles héritant de RuntimeException • “unchecked exceptions”, n’obligeant pas un try/catch pour les gérer mercredi 23 octobre 13
  • 83. Le bloc finally • Est exécuté qu’il y aie une erreur ou non • Finalement presque identique au bloc de données après le catch • Mais est exécuté même en cas de sortie anticipée de la fonction mercredi 23 octobre 13 try { ..... } catch(Exception e) { .... ; return; } finally { .. // est exécuté avant le return }
  • 84. Générer ses propres exceptions 1) Définir l’exception • Il s’agit d’une classe héritant de Exception public class QINegatifException extends Exception { public QINegatifException(String nom) { super(“Attention, “+nom+” a un QI d’huitre !”); } Appel constructeur classe } mère mercredi 23 octobre 13
  • 85. Générer ses propres exceptions 2) Lancer l’exception • Lorsque celà vous parait utile, vous lancez l’exception { ... if(qi<0) throw new QINegatifException(“bob”); ... } mercredi 23 octobre 13
  • 86. Générer ses propres exceptions 3) Définir le code critique • La méthode où vous avez lancé l’exception devient section de code critique void ajoutLofteur(Lofteur l) throws QINegatifException { Ne pas confondre ... avec throw (sans S) if(l.getQi()<0) throw new QINegatifException(l.getNom()); ... } mercredi 23 octobre 13
  • 87. Générer ses propres exceptions 4) Lever l’exception • On gère l’appel au code critique comme à l’accoutumée try L’utilisateur de la { classe est obligé par le compilateur de gérer l’exception ... ‘proprement’ loft.ajoutLofteur(l); ... } catch(QINegatifException qie) { ... } mercredi 23 octobre 13
  • 88. Comment gérer l’erreur ? • Le plus souvent, on se contente d’afficher l’erreur • System.err.println(e.getMessage()); • e.printStackTrace(); • Autant que possible, effectuer un traitement adéquat • Le plus souvent, tout ce joue dans ce qu’on va mettre dans le try / en dehors du try mercredi 23 octobre 13
  • 89. Lire un fichier de propriétés • La plupart des applis Java stockent leurs paramètres dans un fichier texte de type : machin.properties • Il existe une petite classe permettant de faciliter l’accès à ces propriétés mercredi 23 octobre 13
  • 90. Utilisation de la classe Properties Fichier monappli.properties import java.util.Properties; monappli.url=http://www.olek.fr monappli.chemin=/usr/local/appli Properties prop = new Properties(); // Lecture du fichier contenant les données de configuration FileInputStream in = new FileInputStream("monappli.properties"); prop.load(in); in.close(); // Extraction des propriétés String url = prop.getProperty("monappli.url"); String user = prop.getProperty("monappli.chemin"); mercredi 23 octobre 13
  • 91. Marshalling XML • Objectif : sauvegarder une trace de ses données sous forme d’un fichier XML • Exemple : fichier de configuration • On peut utiliser : • Des outils complets de marshalling (CastorXML, par ex) • Les classes standards de Java • XStream (http://xstream.codehaus.org) mercredi 23 octobre 13
  • 92. Avec Java standard • Depuis la v1.4, on dispose de classes XMLEncoder et XMLDecoder • Usage : XMLEncoder e = new XMLEncoder( new BufferedOutputStream( new FileOutputStream("Test.xml"))); e.writeObject(instanceASerialiser); e.close(); mercredi 23 octobre 13
  • 93. Limitation de ces classes • Utilisation impérative de beans (constructeur sans paramètre et get/set systématiques) • Code XML généré lourd • On voit les objets ArrayList, etc... • A réserver à l’archivage de petites classes isolées • Par ex, classe de configuration mercredi 23 octobre 13
  • 94. Avec XStream XStream xstream = new XStream(new DomDriver()); // écriture du XML à partir d’une instance de classe xstream.toXML(inst, new BufferedOutputStream( new FileOutputStream("Test.xml"))); // lecture du XML et récupération de l’instance MaClasse inst=(MaClasse) xstream.fromXML(new BufferedInputStream( new FileInputStream("Test.xml"))); • On peut également gérer des “mappings” permettant de préciser les noms utilisés au final dans le XML mercredi 23 octobre 13
  • 95. Sérialisation • Va prendre une “image “ d’une instance telle qu’elle est présente en mémoire • Et la transforme en suite d’octets que l’on peut manipuler directement • Pour transfert via le réseau • Pour stockage dans un fichier ou une base (dans un blob) mercredi 23 octobre 13
  • 96. Mise en place • Les classes à stocker doivent implémenter l’interface Serializable • Cette interface est vide, aucune méthode à implémenter • Elle joue simplement le rôle de marqueur • On utilise ensuite les outils ObjectOutputStream et ObjectInputStream mercredi 23 octobre 13
  • 97. ObjectOutputStream • Exemple de stockage dans un fichier : ! FileOutputStream fos = new FileOutputStream("t.tmp"); ! ObjectOutputStream oos = new ObjectOutputStream(fos); ! oos.writeObject(moninstance); ! oos.close(); fos.close(); mercredi 23 octobre 13
  • 98. ObjectInputStream • Relecture de l’objet à partir du fichier ! FileInputStream fis = new FileInputStream("t.tmp"); ! ObjectInputStream ois = new ObjectInputStream(fis); ! MaClasse instanceRecup=(MaClasse)ois.readObject(); ! oos.close(); fos.close(); mercredi 23 octobre 13
  • 99. Qu’est ce qui est sérialisé ? • Données ET méthodes • Vraie encapsulation • Sérialisation en cascade • Si des attributs pointent vers d’autres objets, ils sont sérialisés (même les listes) • Pour ignorer un attribut : transient mercredi 23 octobre 13
  • 100. Gestion des logs • Objectif : remplacer les bêtes “println” qui parsement nos programmes • Pourquoi ? • Pouvoir les rediriger où l’on veut (fichier...) • Gérer différents niveaux d’affichage • Debug, erreurs... mercredi 23 octobre 13
  • 101. L’outil Log4J d’Apache • Autre possibilité : java.util.logging • Permet la gestion de différents niveaux d’erreur • DEBUG >WARN>INFO>ERROR • Ainsi que le reroutage sur divers périphériques • CONSOLE, LOGFILE... • Possibilité de gérer des roulements de fichiers mercredi 23 octobre 13
  • 102. Utilisation de Log4J mercredi 23 octobre 13 // récup du fichier de configuration PropertyConfigurator.configure("log4j.properties"); //initialisation du Logger Logger log=Logger.getLogger(Essai.class); // émission de messages log.debug("debug!!"); log.warn("warn !"); log.fatal("fatal !"); log.info("info !");
  • 103. Fichier de configuration # Set root category priority to INFO and its only appender to CONSOLE. log4j.rootCategory=INFO, CONSOLE #log4j.rootCategory=INFO, CONSOLE, LOGFILE # CONSOLE is set to be a ConsoleAppender using a PatternLayout. log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.CONSOLE.Threshold=INFO log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=[%t] %-5p %c - %m%n mercredi 23 octobre 13