Les bases de la programmation en Java



                 Christophe Vaudry
        mél : thegeekintheshell@gmail.com
    ...
Historique de ce document

– Cecours de Java a été conçu sur la base de transparents
 que m'avait fourni à l'époque une co...
Présentation générale
Les origines de Java



         Algol                                     Simula

                                       ...
Historique de Java (1)

– Un   projet :
   ■   ‘ The Green Project ’ en 1991 chez Sun
   ■   Préparation de la convergence...
Historique de Java (2)

1991 : Oak
   ■   James Gosling développe un nouveau langage, Oak (chêne)
   ■   Raison : pallier ...
Historique de Java (3)

– 1993   : Deux constats pour un nouveau débouché
   ■   Essor de l’Internet
   ■   La technologie...
Les différentes versions de Java (1)

– Trois   versions de Java depuis 1995
   ■   Java 1.0 en 1995
   ■   Java 1.1 en 19...
Les différentes versions de Java (2)

– Evolution    très rapide et succès du langage
   ■   Un langage vivant
         □ ...
Que penser de Java? (1)

– Les   plus :
   ■    Il a su bénéficier de l’essor d’Internet mais aussi s’imposer dans de
    ...
Que penser de Java? (2)

– Les   moins :
   ■    Trop ‘médiatisé’?
   ■    Problèmes de compatibilité
          □ Avec les...
Que penser de Java? (3)

– Un   bon langage
   ■   Un langage adapté aux besoins de développements actuels …
   ■   … qui ...
Caractéristiques du langage Java
Caractéristiques du langage Java (1)

– Simple
   ■   Apprentissage facile
         □ faible nombre de mots-clés
         ...
Caractéristiques du langage Java (2)

– Orienté   objet
   ■   Java ne permet d'utiliser que des objets (hors les types de...
Caractéristiques du langage Java (3)

– Sûr
   ■   Indispensable sur les réseaux (protection contre les virus,
       modi...
Caractéristiques du langage Java (4)

– Fiable
   ■   Gestion automatique de la mémoire (ramasse-miette ou quot;garbage
  ...
Java, un langage de programmation

– Applications    Java
   ■   programmes autonomes, quot;stand-alonequot;
– Applets   (...
Java, un langage indépendant? (1)

– Java    est un langage interprété
   ■    La compilation d'un programme Java crée du ...
Java, un langage indépendant? (2)

– Avantages     :
   ■   Portabilité
         □ Des machines virtuelles Java existent p...
Java, un langage indépendant? (3)

– Inconvénients      :
   ■   L'interprétation du code ralentit l'exécution
          □...
Langage compilé

           Etapes qui ont lieu avant l'exécution pour un langage compilé
           comme C++

Fichier
de...
Langage interprété (1)

Cas de Java
                                      Avant exécution        Exécution


             ...
Langage interprété (2)

                                                                        Librairies des
  Fichier s...
Java et Compilation

– Il   existe déjà au moins un vrai compilateur Java
       ■   Java devient bien plus rapide ...
   ...
L’API de Java (1)

– Javafournit de nombreuses librairies de classes
 remplissant des fonctionnalités très diverses : c'es...
L’API de Java (2)

– Les   principaux paquetages
   ■    java.applet : les applets sur le web
   ■    java.awt : interface...
L’API de Java (3)

– La documentation de Java est standard, que ce soit pour
 les classes de l'API ou pour les classes uti...
L’API de Java (4)

– Pour   chaque classe, il y a une page HTML contenant :
   ■   la hiérarchie d'héritage de la classe,
...
L’API de Java (5)

– Où   trouver les informations sur les classes de l’API
   ■   sous le répertoire j2sdkx.x.x/docs/api ...
L’API de Java (6)




                    31
Le multithreading (1)

– Un   processus ?
   ■   Un processus est l’entité dynamique qui représente l’exécution d’un
     ...
Le multithreading (2)

– Exemple     de threads
   ■   le ramasse-miettes (GC) est un thread quot;systèmequot;
   ■   la g...
Outil de développement : le SDK de Sun

– Environnement            de développement fourni par Sun
       ■   Il se nommai...
Java, un langage novateur?

– Java   n'est pas un langage novateur :
   ■   il a puisé ses concepts dans d'autres langages...
Java et les objets

– Java   est un langage purement « objet »
   ■   Contrairement à des langages comme C, C++, PERL, PHP...
Syntaxe du langage Java : les bases
Les commentaires

– /*   commentaire sur une ou plusieurs lignes */
       ■   Identiques à ceux existant dans le langage ...
Exemple (1)

                                               La classe est l’unité de
          Fichier Bonjour.java       ...
Instructions, blocs et blancs

– Les instructions Java se terminent par un ;
– Les blocs sont délimités par :

   { pour l...
Exemple (2)


             Fichier Bonjour.java             Accolades délimitant le
                                      ...
Exemple (3)


             Fichier Bonjour.java            Une méthode peut recevoir
                                     ...
Compilation et exécution (1)

                                             Le nom du fichier est nécessairement
    Fichie...
Compilation et exécution (2)




                               44
Compilation et exécution (3)




                               45
Compilation et exécution (4)

– On   utilise généralement un IDE
   ■   IDE = Integrated Development Environment, c’est-à-...
Compilation et exécution (5)

                               Compilation


                               Exécution




  ...
Compilation et exécution (3)

– Les   IDE recommandés
   ■    JCreator (cf copie d’écran précédente) : www.jcreator.com
  ...
Compilation et exécution (4)

– Les   IDE ne sont pas une obligation …
   ■    Pour développer en Java, un éditeur de text...
Compilation et exécution (5)

– Pourrésumer, dans un terminal, si j’ai un fichier
 Bonjour.java pour la classe Bonjour :
 ...
Le cas d’une applet

– Une   applet n’est pas un programme indépendant
   ■   Elle est incorporée dans une page HTML et ex...
Compilation et exécution : l’applet

– Dans   un terminal :
   ■   javac MonApplet.java
          □ Compilation en bytecod...
Identificateurs (1)

– On a besoin de nommer les classes, les variables, les
  constantes, etc. ; on parle d’identificateu...
Identificateurs (2)

– Conventions      sur les identificateurs :
   ■   La première lettre est minuscule pour les méthode...
Les mots réservés de Java

    abstract   default   if           private        throw

    assert     do        implements...
Les types de base et les opérateurs
Les types de bases (1)

– En  Java, tout est objet sauf les types de base.
– Il y a huit types de base :
   –   1 type boo...
Les types de bases (2)

– Lataille nécessaire au stockage de ces types est
 indépendante de la machine.
   ■   Dans des la...
Les entiers (1)

– Les   entiers (avec signe )
   ■    byte : codé sur 8 bits, peuvent représenter des entiers allant de -...
Les entiers (2)

– Notation
   ■   2 : entier normal en base décimal
   ■   2L :entier au format long en base décimal
   ■...
Les entiers (3)

ExempleCM2.java
class ExempleCM2
{
  public static void main(String args[])
   {
     System.out.println(...
Les entiers (4)

– Opérations       sur les entiers (suite)
   ■   les opérateurs d’incrémentation et de décrémentation ++...
Les réels (1)

– Les   réels
   ■    float : codé sur 32 bits, peuvent représenter des nombres allant de
          -1035 à...
les réels (2)

– Les   opérateurs
   ■    opérateurs classiques +, -, *, /
   ■    attention pour la division :
          ...
les réels (3)

ExempleOpEntier.java

class ExempleOpEntier
{
  public static void main(String args[])
  {
   System.out.pr...
Les booléens (1)

– Les   booléens
   ■    boolean :
   ■    Un booléen peut contenir 2 valeurs
          □ soit vrai : tr...
les booléens (2)

– Notation
boolean x;
x= true;
x= false;
x= (5==5); // l ’expression (5==5) est évaluée et la valeur est...
les booléens (3)


– L’opérateur         de comparaison ternaire
   ■   Un opérateur parfois intéressant qui vient du C ma...
Les booléens (4)

– Les   opérateurs logiques
   ■    et logique : &&
   ■    ou logique : ||
   ■    non logique : !
   ■...
Les booléens (5)

ExempleBooleen.java

public class ExempleBooleen
{
   public static void main (String args[])
   {
     ...
Les caractères (1)

– Les   caractères
   ■    char : contient une seule lettre
   ■    le type char désigne des caractère...
Les caractères (2)

– Notation
   char a,b,c; // a,b et c sont des variables du type char
   a='a'; // a contient la lettr...
Les caractères (3)

ExempleChar.java
public class ExempleChar
{
  public static void main (String args[])
  {
    System.o...
Initialisation des variables (1)

– Java exige que toutes les variables soient définies et
 initialisées.
   ■   Le compil...
Initialisation des variables (2)

ExempleChar.java

public class ExempleInit
{
  public static void main (String args[])
 ...
Opérateurs : mémo

 Ce sont, à peu d'exceptions près, les mêmes que ceux de C ou C++.
 Le tableau suivant en donne les règ...
Méthodes
Méthodes et paramètres (1)

– La   notion de méthodes dans les langages objets
   ■   Proches de la notion de procédure ou...
Méthodes et paramètres (2)

– Méthodes         de classe et méthode d’instances
   ■   En java on a 2 grands types de méth...
Méthodes et paramètres (3)

 – Opérateurs           d’accès à un membre d’un objet ou d’une
    classe
       ■   En java ...
Méthodes et paramètres (4)

exemple : public,     type de la valeur       couples d'un type et d'un
static                ...
Méthodes et paramètres (5)

AdditionEntier.java                                readint() est une méthode de
              ...
Portée des variables (1)

– Lesvariables sont connues et ne sont connues qu’à l’intérieur
 du bloc dans lequel elles sont ...
Portée des variables (2)

– Encas de conflit de nom entre des variables locales et des
 variables globales,
   ■   c’est t...
La classe Math (1)

– Les   fonctions mathématiques les plus connues sont
    regroupées dans la classe Math qui appartien...
La classe Math (2)

public class ExerciceAlgo2
{
  public static void main (String args[])
  {
    System.out.println(quot...
Les structures de contrôle (I)
Présentation générale

– Les    structures de contrôle classiques existent en Java :
     ■   if, else
     ■   switch, ca...
if / else (1)

– Instructions     conditionnelles
   ■   On veut effectuer une ou plusieurs instructions seulement si une
...
if / else (2)



                                    fausse
                                    (sinon)
                  ...
if / else (3)

Max.java

public class Max
{
  public static void main(String args[])
  {
     int nb1, nb2;
     nb1 = Bas...
while (1)

– Boucles    indéterminées
   ■   On veut répéter une ou plusieurs instructions un nombre indéterminés
       d...
while (2)

– Boucles    indéterminées
   ■   un autre type de boucle avec le while:
          □ do {bloc d’instructions} w...
while (3)




                                   fausse
 while () { ...}      condition




                   vraie


   ...
while (4)




                             Instructions
do { ...}while ();


                     vraie
                  ...
while (5)

Facto1.java

public class Facto1
{
  public static void main(String args[])
  {
    int n, result,i;
    n = Ba...
for (1)

– Boucles   déterminées
   ■   On veut répéter une ou plusieurs instructions un nombre déterminés
       de fois ...
for (2)

Facto2.java

public class Facto2
{
  public static void main(String args[])
  {
    int n, result,i;
    n = Basi...
Exermple – Somme des N premiers entiers
public class SommeNEntiers
{
  public static void main(String args[])
  {
    int ...
switch (1)

– Sélection   multiples
   ■   l’utilisation de if / else peut s’avérer lourde quand on doit traiter
       pl...
switch (2)

Alternative.java

public class Alternative
                                                       Variable con...
break

– Interruption     et interruption étiquetée
   ■   l’instruction break permet de sortir d ’une boucle
          □ ...
continue

– continue
   ■   l’instruction continue permet de sauter une itération dans une boucle
       sans pour autant ...
La récursivité (rappel)
Récursivité (1)

– On   définit la factorielle d’un nombre entier positif n, n!
 par
   ■   n! = n * n-1 * …* 1 sachant qu...
Récursivité (2)

public class Facto3
{
  public static void main(String args[])
  {
    int n, res;
    n = BasicIO.readin...
Récursivité (3)

– Récursivité
   ■   Pour résoudre un problème on fait appel à la résolution du même
       problème mais...
Les chaînes de caractères
La classe String (1)

– Attention ce n’est pas un type de base. Il s'agit d'une
 classe défini dans l’API Java (Dans le pa...
Différences entre objets et types de base (1)

                                                      Mémoire
             ...
Différences entre objets et types de base (2)

public class ExempleString
{
  public static void main(String args[])
  {
 ...
La classe String (2)

– Longueur      d’un objet String :
   ■   méthode int length() : renvoie la longueur de la chaîne
 ...
La classe String (3)

– Récupération      d’un caractère dans une chaîne
   ■   méthode char charAt(int pos) : renvoie le ...
La classe String (4)

– Modification      des objets String
   ■   Les String sont inaltérables en Java : on ne peut modif...
La classe String (5)

– Les   chaînes de caractères sont des objets :
   ■    pour tester si 2 chaînes sont égales il faut...
La classe String (6)

– Quelques     autres méthodes utiles
   ■   boolean startsWith(String str) : pour tester si une cha...
La classe String (7)

Plus d’informations
dans les
documentations
de l’API dans le
package
java.lang




                 ...
La classe String (8)



public class ExempleString2
{
  public static void main(String args[])
  {
   String str1 = quot;b...
Objet et référence
Objets, tableaux, types de base

– Lorsqu'une      variable est d'un type objet ou tableau :
   ■   ce n'est pas l'objet o...
Références

– La   référence en Java correspond à la notion de pointeur
   ■   La référence est, en quelque sorte, un poin...
Différences entre objets et types de base

                                                      Mémoire
                 ...
Les tableaux
Les tableaux (1)

– Les
    tableaux permettent de stocker plusieurs valeurs de
 même type dans une variable.
   ■    Les ...
Les tableaux (2)

– Le   nombre d'éléments du tableau est stocké.
   ■   Java peut ainsi détecter à l'exécution le dépasse...
Les tableaux (3)

– Initialisation
    tab[0]=1;
    tab[1]=2; //etc.
    noms[0] = new String( quot;Boulequot;);
    noms...
Les tableaux (4)

– Il
   est possible de créer des tableaux quot;rectangulairesquot; et
 des tableaux quot;non rectangula...
Les tableaux (5)

– Quelques     méthodes utiles
   ■   Dans la classe java.lang.System
         □ static void arraycopy(O...
Les tableaux (6)

– Quelques     méthodes utiles
   ■   Dans la classe java.util.Arrays
         □ static int binarySearch...
Les tableaux (7)

Tab1.java

public class Tab1
{
  public static void main (String args[])     Pour déclarer une variable ...
Les tableaux (8)

Tab1.java
                                            Mémoire

public class Tab1
{
  public static void ...
Les tableaux (9)

Tab1.java
                                            Mémoire
public class Tab1
{
  public static void m...
Les tableaux (10)

Tab2.java
                                            Mémoire

public class Tab2
{                     ...
Les tableaux (11)

Tab2.java
                                               Modification du programme
                    ...
Les bases de la programmation objet en
                  Java
Accès aux attributs d’un objet (1)

Personne.java                           Personne
                                     ...
Accès aux attributs d’un objet (2)

Application.java

public class Application
{
  public static void main(String args[])
...
Accès aux méthodes d’un objet (1)

Personne.java                         Personne
                                     nom...
Accès aux méthodes d’un objet (2)

Application.java

public class Application
{
  public static void main(String args[])
 ...
Les constructeurs (1)

– L'appel de new pour créer un nouvel objet déclenche,
  dans l'ordre :
     ■   L'allocation mémoi...
Les constructeurs (2)

– Lorsque     l'initialisation explicite n'est pas possible
   ■   par exemple lorsque la valeur in...
Les constructeurs (3)

Personne.java                               Définition d’un
                                       ...
Les constructeurs (4)

– Pour une même classe, il peut y avoir plusieurs
  constructeurs, de signatures différentes (surch...
Les constructeurs (5)

Personne.java
                                            Redéfinition d’un
public class Personne  ...
Destruction d’objets (1)

– Java n'a pas repris à son compte la notion de destructeur
 telle qu’elle existe en C++ par exe...
Destruction d’objets (2)

– Leprogrammeur n’a plus à gérer directement la
 destruction des objets,
   ■   c’était une impo...
Destruction d’objets (3)

– Il
   est possible au programmeur d'indiquer ce qu'il faut
 faire juste avant de détruire un o...
méthodes (rappel)

exemple : public,     type de la valeur    couples d'un type et d'un
static                renvoyée ou ...
Mode de passage des paramètres (1)

– Java
     n'implémente qu'un seul mode de passage des
 paramètres à une méthode :
  ...
Mode de passage des paramètres (2)

public class Personne
{
  public String nom;
  public String prenom;
  public int age;...
Mode de passage des paramètres (3)

public class exemplePassageParam
{
 public static void main(String args[])
 {
   int n...
Contrôle d’accès (1)

– Chaque       attribut et chaque méthode d'une classe peut être
 :
     ■   visible depuis les inst...
Contrôle d’accès (2)

– En   toute rigueur, il faudrait toujours que :
   ■   les attributs ne soient pas visibles,
      ...
Contrôle d’accès (3)

public class Parallelogramme
 {
    private int longueur = 0; // déclaration + initialisation explic...
Contrôle d’accès évolué (1)

– Outre   private et public, Java définit deux niveaux de
  contrôle d'accès supplémentaires....
Contrôle d’accès évolué (2)

– Un   attribut ou une méthode protégé est visible depuis :
   ■   Toute méthode d'une classe...
Contrôle d’accès évolué (3)

– Pour   résumer
   ■   private : visible uniquement par la classe
   ■   public : visible pa...
L’héritage avec Java (1)

– Java   implémente le mécanisme d'héritage simple
   ■   L’héritage permet de quot;factoriserqu...
L’héritage avec Java (2)

class Personne                                       Personne
  {                               ...
L’héritage en Java (3)

– Constructeurs       et héritage
   ■   par défaut le constructeur d’une sous-classe appelle le c...
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Prochain SlideShare
Chargement dans…5
×

Introduction àJava

5 266 vues

Publié le

Cours d'introduction à Java dispensé en 2ème année de l'ISAIP de 2004 à 2006.
26/12/2008 : Une petite correction sur un schéma p122.

Publié dans : Formation, Technologie
1 commentaire
3 j’aime
Statistiques
Remarques
Aucun téléchargement
Vues
Nombre de vues
5 266
Sur SlideShare
0
Issues des intégrations
0
Intégrations
65
Actions
Partages
0
Téléchargements
589
Commentaires
1
J’aime
3
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

Introduction àJava

  1. 1. Les bases de la programmation en Java Christophe Vaudry mél : thegeekintheshell@gmail.com blog : thegeekintheshell.blogspot.com site Web : cvaudry.developpez.com
  2. 2. Historique de ce document – Cecours de Java a été conçu sur la base de transparents que m'avait fourni à l'époque une collègue ■ Il a été utilisé à partir de 1999/2000 jusqu'en 2005/2006 et enrichi au fur et à mesure depuis. ■ Il m'a servi de support de cours à l'Ecole des Mines d'Alès, à l'IUT de Nîmes et à l'ISAIP. ■ Il ne tient pas compte des caractéristiques de Java au-delà de la version 1.5. 2
  3. 3. Présentation générale
  4. 4. Les origines de Java Algol Simula SmallTalk Pascal C C ++ Objective C Modula Ada Pascal Object Eiffel Ada 95 Java C# Adapté d'après Java – La Maîtrise de J. Bougeault 4
  5. 5. Historique de Java (1) – Un projet : ■ ‘ The Green Project ’ en 1991 chez Sun ■ Préparation de la convergence de l’électronique grand public et de l’informatique – Des acteurs : ■ Patrick Naughton ■ Mike Sheridan ■ James Gosling – Des besoins : ■ Initialement prévu d’utiliser le C++ ... ■ … mais problèmes avec le C++, d’où création d’un nouvel environnement de programmation 5
  6. 6. Historique de Java (2) 1991 : Oak ■ James Gosling développe un nouveau langage, Oak (chêne) ■ Raison : pallier aux faiblesses constatées de C++ – 1992 : Une première cible ■ La télévision digitale … ■ … création du *7 (StarSeven) et de Duke … ■ … mais un secteur encore trop jeune. 6
  7. 7. Historique de Java (3) – 1993 : Deux constats pour un nouveau débouché ■ Essor de l’Internet ■ La technologie développée avec Oak est adaptée à ce type de réseau – 1994 : De Oak à Java ■ Ecriture d'un navigateur Web en Oak, WebRunner qui deviendra bientôt HotJava – 1995 : Premières versions de Java rendues publiques 7
  8. 8. Les différentes versions de Java (1) – Trois versions de Java depuis 1995 ■ Java 1.0 en 1995 ■ Java 1.1 en 1996 – 1997 □ Apparition des Java Beans (composants) ■ Java 1.2 en 1999 (« Java 2 », version 1.2) □ Apparition de Swing, J2SE, J2ME et J2EE ■ Java 1.3 (Java 2, version 1.3) en 2001 - 2002 ■ Java 1.4 à partir de 2002, Java 1.4.2 en 2003-2004 ■ ... Java 1.5 ... ■ Java 1.6 actuellement, Java 1.7 dans les cartons... □ L’édition standard est disponible sur le site de Sun, http://java.sun.com/ , le J2SE (Java 2 platform, Standard Edition) 8
  9. 9. Les différentes versions de Java (2) – Evolution très rapide et succès du langage ■ Un langage vivant □ Qui ne cesse d’évoluer □ Qui est soutenu par une communauté de développeurs. □ Un succès certain dans le « monde universitaire », dans la recherche et l'enseignement – Une certaine maturité atteinte avec Java 2 – Des problèmes de compatibilité existent (ont existé!) ■ entre les versions 1.1 et 1.2/1.3/1.4/1.5 ■ avec certains « vieux » navigateurs non équipés de JVM correct ■ depuis la version 1.2 il y a une bonne compatibilité « ascendante » mais il peut exister encore quelques problèmes. 9
  10. 10. Que penser de Java? (1) – Les plus : ■ Il a su bénéficier de l’essor d’Internet mais aussi s’imposer dans de nombreux domaines ■ Un environnement gratuit (mais pas OpenSource!) ■ De nombreux outils disponibles dus notamment à une large communauté très active qui en fait un langage vivant. ■ Des API (Application Programming Interface) nombreuses et variées en standard, des API spécifiques disponibles gratuitement en option (3D, Multimédia, etc.) ■ Un langage généraliste qui a démontré sa souplesse et son élégance □ Utilisation dans l’industrie et dans le secteur académique □ Très utilisé comme langage d’apprentissage ■ La multitude des plateformes matérielles le supportant (portabilité) 10
  11. 11. Que penser de Java? (2) – Les moins : ■ Trop ‘médiatisé’? ■ Problèmes de compatibilité □ Avec les premières versions □ Avec certains navigateurs (les navigateurs ne sont pas écrits par Sun) ■ Problèmes de vitesse □ Existence de solutions pour y pallier (compilateur natif, compilation du bytecode à la volée) □ Grande amélioration de la vitesse avec la plateforme actuelle. ▪ Reste un point faible même si de moins en moins rédhibitoire. ■ Un langage pérenne : une concurrence redoutable (C# et la plateforme .NET) 11
  12. 12. Que penser de Java? (3) – Un bon langage ■ Un langage adapté aux besoins de développements actuels … ■ … qui a su se baser sur les acquis du passé. – Audelà de l’effet de mode, un succès mérité qui ne devrait pas se démentir dans le futur ■ Support de Sun ■ Importante communauté de développeurs ■ La portabilité du langage, les plateformes logicielles et matérielles supportées ■ Le nombre et la qualité des projets utilisant Java ■ Le développement des technologies autour de Java ■ Accord Sun-Microsoft : « convergence » de leur palteforme ? 12
  13. 13. Caractéristiques du langage Java
  14. 14. Caractéristiques du langage Java (1) – Simple ■ Apprentissage facile □ faible nombre de mots-clés □ simplifications aux fonctionnalités essentielles ■ Développeurs opérationnels rapidement □ Proche syntaxe C/C++ ... □ ...sans les dangers du C/C++ ▪ Plus d'arithmétiques sur les pointeurs, pas d'héritage multiple contrairement au C++, pas de surcharge des types primitifs et des opérateurs. 14
  15. 15. Caractéristiques du langage Java (2) – Orienté objet ■ Java ne permet d'utiliser que des objets (hors les types de base) ■ Java est un langage objet de la famille des langages de classe comme C++ ou SmallTalk ■ Les grandes idées reprises sont : encapsulation, dualité classe /instance, attribut, méthode / message, visibilité, dualité interface/implémentation, héritage simple, redéfinition de méthodes, polymorphisme – Familier ■ Syntaxe proche de celle de C/C++ 15
  16. 16. Caractéristiques du langage Java (3) – Sûr ■ Indispensable sur les réseaux (protection contre les virus, modification des fichiers, lecture de données confidentielles, etc.) Pour plus d’informations sur le thème de la sécurité sur les réseaux voir http://www.cs.princeton.edu/sip/ ▪ Une preuve : il n’existe pour l’instant aucun virus fait en Java (une grande peur lors des débuts de ce langage) alors que c'est assez courant dans des technologies concurrentes □ Notion de « bac à sable », police de sécurité, API destinés au cryptage, à la gestion de l'authentification, des certificats, ... 16
  17. 17. Caractéristiques du langage Java (4) – Fiable ■ Gestion automatique de la mémoire (ramasse-miette ou quot;garbage collectorquot;) ■ Gestion des exceptions ■ Sources d'erreurs limitées □ typage fort, □ pas d'héritage multiple, □ pas de manipulations de pointeurs, etc. ■ Vérifications faites par le compilateur facilitant une plus grande rigueur du code 17
  18. 18. Java, un langage de programmation – Applications Java ■ programmes autonomes, quot;stand-alonequot; – Applets (mini-programmes ou appliquettes) ■ Programmes exécutables uniquement par l'intermédiaire d'une autre application □ navigateur web : Netscape, Internet explorer, etc. □ application spécifique : Appletviewer (livré avec le kit de développement) ■ Java a longtemps été considéré comme étant uniquement un langage pour écrire des applets □ Cependant c'est avant tout un langage de programmation généraliste 18
  19. 19. Java, un langage indépendant? (1) – Java est un langage interprété ■ La compilation d'un programme Java crée du pseudo-code portable □ le quot;byte-codequot; ■ Sur n'importe quelle plate-forme, une machine virtuelle Java peut interpréter le pseudo-code afin qu'il soit exécuté – Les machines virtuelles Java peuvent être : ■ des interpréteurs de byte-code indépendants (pour exécuter les programmes Java) ■ contenues au sein d'un navigateur (pour exécuter des applets Java) 19
  20. 20. Java, un langage indépendant? (2) – Avantages : ■ Portabilité □ Des machines virtuelles Java existent pour de nombreuses plates- formes dont : Solaris, Windows, MacOS ■ Développement plus rapide □ courte étape de compilation pour obtenir le byte-code, □ pas d'édition de liens, □ débogagge plus aisé, ■ Le byte-code est plus compact que les exécutables classiques □ pour voyager sur les réseaux. 20
  21. 21. Java, un langage indépendant? (3) – Inconvénients : ■ L'interprétation du code ralentit l'exécution □ Il y a quelques années c’était de l'ordre de quelques dizaines de fois plus lent que C++ □ Maintenant cela dépend du type d’application □ Ce qu’il faut surtout voir c’est le rapport gain sur le temps de développement / vitesse du logiciel par rapport aux besoins de l’utilisateur. ■ Les applications ne bénéficient que du dénominateur commun des différentes plate-formes □ limitation, par exemple, des interfaces graphiques : AWT □ Dans le cas des interfaces graphiques, avec Swing ou des équivalents ce n’est plus vrai. 21
  22. 22. Langage compilé Etapes qui ont lieu avant l'exécution pour un langage compilé comme C++ Fichier de Librairies code Programme Compilation Code objet Edition de liens exécutable Autres code objet Fichier d'entête 22
  23. 23. Langage interprété (1) Cas de Java Avant exécution Exécution Autres byte code Fichier de code Byte code Machine virtuelle Compilation Java (JVM) Java javac MaClasse.class java MaClasse.java 23
  24. 24. Langage interprété (2) Librairies des Fichier source Java Class Loader Classes Java Interpréteur Compilateur JIT Compilateur Java Java (Just In Time) Système d'Exécution Fichier « Classe » Java Système d'Exploitation D'après Java – La Maîtrise de J. Bougeault 24
  25. 25. Java et Compilation – Il existe déjà au moins un vrai compilateur Java ■ Java devient bien plus rapide ... ■ ... mais perd quelques qualités (portabilité, etc.) – Autre technologie (celle préconisée par Sun): ■ La compilation à la volée : quot;Just In Time (JIT) compilersquot; ■ Le code est compilé au fur et à mesure de sa première exécution et stocké dans un cache pour être ensuite réutilisé tel quel. 25
  26. 26. L’API de Java (1) – Javafournit de nombreuses librairies de classes remplissant des fonctionnalités très diverses : c'est l'API Java ■ API (Application Program(ming) Interface /Interface pour la programmation d'applications) : Ensemble de bibliothèques permettant une programmation plus aisée car les fonctions deviennent indépendantes du matériel. ■ Ces classes sont regroupées, par catégories, en paquetages (ou quot;packagesquot;). 26
  27. 27. L’API de Java (2) – Les principaux paquetages ■ java.applet : les applets sur le web ■ java.awt : interfaces graphiques, images et dessins ■ java.beans : relatif aux JavaBeans ■ java.io : entrées / sorties ■ java.lang : chaînes de caractères, interaction avec l'OS, threads ■ java.net : sockets, URL ■ java.util : structures de données classiques ■ javax.swing : package récent proposant des composants « légers » pour la création d’interfaces graphiques ■ java.rmi : Remote Method Invocation ■ java.sql : fournit le package JDBC 27
  28. 28. L’API de Java (3) – La documentation de Java est standard, que ce soit pour les classes de l'API ou pour les classes utilisateur ■ possibilité de génération automatique avec l’outil Javadoc. – Elle est au format HTML. ■ intérêt de l'hypertexte pour naviguer dans la documentation 28
  29. 29. L’API de Java (4) – Pour chaque classe, il y a une page HTML contenant : ■ la hiérarchie d'héritage de la classe, ■ une description de la classe et son but général, ■ la liste des attributs de la classe (locaux et hérités), ■ la liste des constructeurs de la classe (locaux et hérités), ■ la liste des méthodes de la classe (locaux et hérités), ■ puis, chacune de ces trois dernières listes, avec la description détaillée de chaque élément. 29
  30. 30. L’API de Java (5) – Où trouver les informations sur les classes de l’API ■ sous le répertoire j2sdkx.x.x/docs/api dans le SDK □ les documentations de l’API se téléchargent et s’installent en général dans le répertoire dans lequel on installe java. ▪ Ces docs sont à placer à votre convenance, mais il est toujours utile de les avoir sous la main ! ■ Sur le site de Sun, on peut la retrouver à http://java.sun.com/docs/index.html 30
  31. 31. L’API de Java (6) 31
  32. 32. Le multithreading (1) – Un processus ? ■ Un processus est l’entité dynamique qui représente l’exécution d’un programme sur un processeur – Un thread (processus léger) ■ C'est une entité d'exécution qui peut se dérouler en parallèle à d'autres threads, c'est-à-dire concurremment, au sein d'une même application. □ On découpe le programme principal en un ensemble de sous- programmes qui s’exécutent indépendamment les uns des autres. – Javapermet de lancer plusieurs threads en même temps, sans bloquer les autres. 32
  33. 33. Le multithreading (2) – Exemple de threads ■ le ramasse-miettes (GC) est un thread quot;systèmequot; ■ la gestion de l'interface graphique qui peut être parallélisée avec l'accès à l'imprimante et l'envoi de données sur le réseau. – La programmation des threads est considérée comme complexe en général… – … mais relativement aisée en Java ; c’est un des avantages de ce langage. ■ Néanmoins, même si Java propose un bon support des Threads, leur programmation restent complexes quoiqu’il arrive et demandent une bonne maîtrise des algorithmes de synchronisation des processus. 33
  34. 34. Outil de développement : le SDK de Sun – Environnement de développement fourni par Sun ■ Il se nommait le JDK (Java Development Kit : Kit de développement Java). ■ On parle aussi ou on a parlé du SDK, de J2SDK (System Development Kit : Kit de développement) ou de J2SE (Java 2 Standard Edition) – Il contient : ■ les classes de base de l'API java (plusieurs centaines), ■ la documentation au format HTML ■ le compilateur : javac ■ la JVM (machine virtuelle) : java ■ le visualiseur d'applets : appletviewer ■ le générateur de documentation : javadoc ■ etc. 34
  35. 35. Java, un langage novateur? – Java n'est pas un langage novateur : ■ il a puisé ses concepts dans d'autres langages existants (Smalltalk par exemple) et sa syntaxe s’inspire de celle du C/C++. – Cette philosophie permet à Java ■ De ne pas dérouter ses utilisateurs en faisant quot;presque comme ... mais pas tout à faitquot; ■ D'utiliser des idées, concepts et techniques qui ont fait leurs preuves et que les programmeurs savent utiliser – Java a su faire une synthèse efficace de bonnes idées issues de sources d'inspiration variées ■ Smalltalk, C++, Ada, Lisp, etc. ■ Ce n'est pas pour rien que C# s'inspire d'un certain nombre de techniques mises en oeuvre en Java 35
  36. 36. Java et les objets – Java est un langage purement « objet » ■ Contrairement à des langages comme C, C++, PERL, PHP, par exemple qui ne sont pas purement objet ■ Et comme Smalltalk , Ruby, etc. ■ Java est ce qu’on nomme un langage de classe, un type particulier de langage dit à objet □ Les langages de classes sont certainement, à l’heure actuelle, le type de « langage objet » le plus répandu. ▪ Héritage de Simula et Smalltalk □ Il existe également des langages dit objet basées sur la notion de prototype (JavaScript, Self), ou des langages dit de Frame (repéresentation des connaissances) et des langages « hybrides ». 36
  37. 37. Syntaxe du langage Java : les bases
  38. 38. Les commentaires – /* commentaire sur une ou plusieurs lignes */ ■ Identiques à ceux existant dans le langage C – // commentaire de fin de ligne ■ Identiques à ceux existant en C++ – /** commentaire d'explication */ ■ Les commentaires d'explication se placent généralement juste avant une déclaration (d'attribut ou de méthode) ■ Ils sont récupérés par l'utilitaire javadoc et inclus dans la documentation ainsi générée. 38
  39. 39. Exemple (1) La classe est l’unité de Fichier Bonjour.java base de nos programmes. Le mot clé en Java pour définir une classe est public class Bonjour class { //Accolade débutant la classe MaClasse public static void main(String args[]) { //Accolade débutant la méthode main /* Pour l’instant juste une instruction */ System.out.println(“bonjour”); } //Accolade fermant la méthode main } //Accolade fermant la classe MaClasse 39
  40. 40. Instructions, blocs et blancs – Les instructions Java se terminent par un ; – Les blocs sont délimités par : { pour le début de bloc } pour la fin du bloc Un bloc permet de définir un regroupement d’instructions. La définition d’une classe ou d’une méthode se fait dans un bloc. – Lesespaces, tabulations, sauts de ligne sont autorisés. Cela permet de présenter un code plus lisible. 40
  41. 41. Exemple (2) Fichier Bonjour.java Accolades délimitant le début et la fin de la définition de la class Bonjour public class Bonjour { public static void main(String args[]) { Accolades délimitant le début System.out.println(“bonjour”); et la fin de la méthode main } } Les instructions se terminent par des ; 41
  42. 42. Exemple (3) Fichier Bonjour.java Une méthode peut recevoir des paramètres. Ici la méthode public class Bonjour main reçoit le paramètre args qui est un tableau de chaîne de caractères. { public static void main(String args[]) { System.out.println(“bonjour”); } } 42
  43. 43. Compilation et exécution (1) Le nom du fichier est nécessairement Fichier Bonjour.java celui de la classe avec l’extension .java en plus. Java est sensible à la casse des lettres. Compilation en bytecode java dans une console DOS: javac Bonjour.java Génère un fichier Bonjour.class public class Bonjour Exécution du programme (toujours depuis la console { DOS ou un terminal sous Unix) sur la JVM : public static void main(String[] args) java Bonjour Affichage de « bonjour » dans { la console System.out.println(“bonjour”); } } 43
  44. 44. Compilation et exécution (2) 44
  45. 45. Compilation et exécution (3) 45
  46. 46. Compilation et exécution (4) – On utilise généralement un IDE ■ IDE = Integrated Development Environment, c’est-à-dire un Environnement de Développement Intégré (EDI) ■ Un IDE facilite la tâche du développeur, particulièrement quand il y a beaucoup de classes à créer pour une même application □ On a vu que grosso modo on avait une classe par fichier. □ Pour chaque type d’objet on va quasiment avoir une classe □ Dans un projet un peu gros, il y a plusieurs types d’objets, donc plusieurs fichiers contenant des classes □ L’IDE permet d’assurer la compilation et le lien entre les différents fichiers à la place du développeur 46
  47. 47. Compilation et exécution (5) Compilation Exécution 47
  48. 48. Compilation et exécution (3) – Les IDE recommandés ■ JCreator (cf copie d’écran précédente) : www.jcreator.com ■ Eclipse : www.eclipse.org ■ BlueJ : http://www.bluej.org/ ■ NetBeans : http://www.netbeans.org/ – Les IDE ne sont pas une obligation … ■ Pour développer en Java, un éditeur de texte tout simple et le kit de développement de la plateforme standard suffisent. – …néanmoins pour des développements sérieux et conséquent ils sont indispensables ■ L’IDE permet de simplifier et d’automatiser certaines tâches ■ Les IDE évolués (Eclipse, NetBeans) permettent l’intégration d’outils complémentaires (Ant, CVS, BeanShell, ArgoUML, etc.) 48
  49. 49. Compilation et exécution (4) – Les IDE ne sont pas une obligation … ■ Pour développer en Java, un éditeur de texte tout simple et le kit de développement de la plateforme standard suffisent. – …néanmoins pour des développements sérieux et conséquent ils sont indispensables ■ L’IDE permet de simplifier et d’automatiser certaines tâches ■ Les IDE évolués (Eclipse, NetBeans) permettent l’intégration d’outils complémentaires (Ant, CVS, BeanShell, ArgoUML, etc.) 49
  50. 50. Compilation et exécution (5) – Pourrésumer, dans un terminal, si j’ai un fichier Bonjour.java pour la classe Bonjour : ■ javac Bonjour.java □ Compilation en bytecode java □ Indication des erreurs de syntaxe éventuelles □ Génération d’un fichier Bonjour.class si pas d’erreurs ■ java MaClasse □ Java est la machine virtuelle □ Exécution du bytecode □ Nécessité d’avoir une (et une seule) méthode main, qui est le point d’entrée dans le programme 50
  51. 51. Le cas d’une applet – Une applet n’est pas un programme indépendant ■ Elle est incorporée dans une page HTML et exécutée dans un navigateur ■ HTML dispose d'un quot;tagquot; <applet> </applet> destiné à intégrer des applets dans une page web. Entre ces tags j’indique le nom d’une classe java compilé en bytecode (un fichier « .class »). ■ Exemple : maPage.html ■ Ma classe MonApplet.java n’a pas besoin de contenir une méthode main…nous reviendrons sur les applets plus tard. <html><head><title>MonApplet</title></head> <body> <applet code=MonApplet.class width=100 height=100> </applet> </body> </html> 51
  52. 52. Compilation et exécution : l’applet – Dans un terminal : ■ javac MonApplet.java □ Compilation en bytecode java □ Indication des erreurs de syntaxe éventuelles □ Génération d’un fichier MonApplet.class si pas d’erreurs ■ appletviewer maPage.html (depuis le terminal) par exemple ou ouverture de la page HTML maPage.html depuis Nestcape Navigator ou Internet Explorer. □ Il faut que le chemin indiqué dans la paramètre code de la balise applet et permettant d’accéder au fichier « .class » soit valide ▪ Analogue à l’utilisation de liens ou de fichier de style : le fichier HTML « pointe » sur le fichier « .class » 52
  53. 53. Identificateurs (1) – On a besoin de nommer les classes, les variables, les constantes, etc. ; on parle d’identificateur. – Les identificateurs commencent par une lettre, _ ou $ ■ Attention : Java distingue les majuscules des minuscules – Conventions sur les identificateurs : ■ Si plusieurs mots sont accolés, mettre une majuscule à chacun des mots sauf le premier. □ exemple : uneVariableEntiere ■ La première lettre est majuscule pour les classes et les interfaces □ exemples : MaClasse, UneJolieFenetre 53
  54. 54. Identificateurs (2) – Conventions sur les identificateurs : ■ La première lettre est minuscule pour les méthodes, les attributs et les variables □ exemples : setLongueur, i, uneFenetre ■ Les constantes sont entièrement en majuscules □ exemple : LONGUEUR_MAX 54
  55. 55. Les mots réservés de Java abstract default if private throw assert do implements protected throws boolean double import public transient break else instanceof return true byte extends int short try case false interface static void catch final long strictfp volatile char finally native super while class float new switch throw continue for null synchronized const goto package this 55
  56. 56. Les types de base et les opérateurs
  57. 57. Les types de bases (1) – En Java, tout est objet sauf les types de base. – Il y a huit types de base : – 1 type booléen □ pour représenter les variables ne pouvant prendre que 2 valeurs (vrai et faux, 0 ou 1, etc.) : □ le type boolean avec les valeurs associées true et false – 1 type pour représenter les caractères □ char – 4 types pour représenter les entiers de divers taille □ byte, short, int et long – 2 types pour représenter les réelles □ float et double 57
  58. 58. Les types de bases (2) – Lataille nécessaire au stockage de ces types est indépendante de la machine. ■ Dans des langages comme C/C++, la taille nécessaire au stockage d’un type (le codage de ce type) dépend de la machine. – L’indépendance du codage des types de base entraîne ■ des avantages □ portabilité ■ des inconvénients □ quot;conversionsquot; coûteuses d’un type à l’autre. C’est le système logiciel (JVM) qui gère complètement le codage des types. 58
  59. 59. Les entiers (1) – Les entiers (avec signe ) ■ byte : codé sur 8 bits, peuvent représenter des entiers allant de -27 à 27 –1 (-128 à +127) ■ short : codé sur 16 bits, peuvent représenter des entiers allant de -215 à 215 –1 ■ int : codé sur 32 bits, peuvent représenter des entiers allant de -231 à 231 –1 ■ long : codé sur 64 bits, peuvent représenter des entiers allant de -263 à 263 –1 59
  60. 60. Les entiers (2) – Notation ■ 2 : entier normal en base décimal ■ 2L :entier au format long en base décimal ■ 010 : entier en valeur octale (base 8) ■ 0xF : entier en valeur hexadécimale (base 16) – Opérations sur les entiers ■ opérateurs arithmétiques +, -, * ■ / :division entière si les 2 arguments sont des entiers ■ % : reste de la division entière □ exemples : ▪ 15 / 4 donne 3 ▪ 15 % 2 donne 1 60
  61. 61. Les entiers (3) ExempleCM2.java class ExempleCM2 { public static void main(String args[]) { System.out.println(quot;Starting ExempleCM2...quot;); int i,j,k; long l; i = 2; l = 2L; j = 010; k = 0xF; System.out.println(quot;i = quot; + i + quot; et l = quot; +l); System.out.println(quot;j = quot; + j); System.out.println(quot;k = quot; + k); } } 61
  62. 62. Les entiers (4) – Opérations sur les entiers (suite) ■ les opérateurs d’incrémentation et de décrémentation ++ et -- □ ajoute ou retranche 1 à une variable int n = 12; n ++; //Maintenant n vaut 13 □ n++; « équivalent à » n = n+1; / n--; « équivalent à » n = n-1; □ 8++; est une instruction illégale □ peut s’utiliser de manière suffixée : ++n. La différence avec la version préfixée se voit quand on les utilisent dans les expressions. En version suffixée la (dé/inc)rémentation s’effectue en premier int m=7; int n=7; int a=2 * ++m; //a vaut 16, m vaut 8 int b=2 * n++; //b vaut 14, n vaut 8 62
  63. 63. Les réels (1) – Les réels ■ float : codé sur 32 bits, peuvent représenter des nombres allant de -1035 à + 1035 ■ double : codé sur 64 bits, peuvent représenter des nombres allant de -10400 à +10400 – Notation ■ 4.55 ou 4.55D réel double précision ■ 4.55f réel simple précision 63
  64. 64. les réels (2) – Les opérateurs ■ opérateurs classiques +, -, *, / ■ attention pour la division : ▪ 15 / 4 donne 3 ▪ 15 % 2 donne 1 ▪ 11.0 / 4 donne 2.75 (si l’un des termes de la division est un réel, la division retournera un réel). ■ puissance utilisation de la méthode pow de la classe Math. ▪ double y = Math.pow(x, a) équivalent à x^a, x et a étant de type double 64
  65. 65. les réels (3) ExempleOpEntier.java class ExempleOpEntier { public static void main(String args[]) { System.out.println(quot;Starting ExempleOpEntier...quot;); int i,j; float unReel; i = 10 ; j = 2; unReel = 2.0f; System.out.println(quot;i / j = quot; + i/j); System.out.println(quot;i / unReel = quot; + i/unReel); } } 65
  66. 66. Les booléens (1) – Les booléens ■ boolean : ■ Un booléen peut contenir 2 valeurs □ soit vrai : true (mot réservé) □ soit faux : false (mot réservé) – Les opérateurs logiques de comparaisons ■ Egalité : opérateur == ■ Différence : opérateur != ■ supérieur et inférieur strictement à : opérateurs > et < ■ supérieur et inférieur ou égal : opérateurs >= et <= ■ L’évaluation d’une expression avec un opérateur de comparaison renvoie un booléen 66
  67. 67. les booléens (2) – Notation boolean x; x= true; x= false; x= (5==5); // l ’expression (5==5) est évaluée et la valeur est affectée à x qui vaut alors vrai x= (5!=4); // x vaut vrai, ici on obtient vrai si 5 est différent de 4 x= (5>5); // x vaut faux, 5 n'est pas supérieur strictement à 5 x= (5<=5); // x vaut vrai, 5 est bien inférieur ou égal à 5 67
  68. 68. les booléens (3) – L’opérateur de comparaison ternaire ■ Un opérateur parfois intéressant qui vient du C manipuler ■ « ? : » int res,i,j; …. res = (i==0)? 0 : j/i; /* res contient 0 si i==0 et sinon il contient j/i */ int max = (x > y) ? x : y; String name = (name != null) ? name : quot;unkownquot; 68
  69. 69. Les booléens (4) – Les opérateurs logiques ■ et logique : && ■ ou logique : || ■ non logique : ! ■ Exemples : si a et b sont 2 variables booléennes boolean a,b, c; a= true; b= false; c= (a && b); // c vaut false c= (a || b); // c vaut true c= !(a && b); // c vaut true c=!a; // c vaut false 69
  70. 70. Les booléens (5) ExempleBooleen.java public class ExempleBooleen { public static void main (String args[]) { System.out.println(quot;Starting ExempleBooleen...quot;); boolean test1, test2, test3; int res; int i,j,k; i=0; j=2; k=3; test1 = (i == j); //false test2 = (i != k); //true test3 = (j <= k); //true res = (i==0)? 0 : j/i; if (test3) { System.out.println(quot;Nous sommes dans le ifquot;); System.out.println(quot;test3 = quot; + test3); } System.out.println(quot;test1 = quot; + test1); System.out.println(quot;test2 = quot; + test2); System.out.println(quot;res = quot; + res); }} 70
  71. 71. Les caractères (1) – Les caractères ■ char : contient une seule lettre ■ le type char désigne des caractères en représentation Unicode □ Codage sur 2 octets contrairement à ASCII/ANSI codé sur 1 octet. Le codage ASCII/ANSI est un sous-ensemble d’Unicode □ Notation hexadécimale des caractères Unicode de ‘ u0000 ’ à ‘ uFFFF ’. □ Plus d’information sur Unicode à : www.unicode.org 71
  72. 72. Les caractères (2) – Notation char a,b,c; // a,b et c sont des variables du type char a='a'; // a contient la lettre 'a' b= 'u0022' //b contient le caractère guillemet : quot; c=97; // x contient le caractère de rang 97 : 'a' 72
  73. 73. Les caractères (3) ExempleChar.java public class ExempleChar { public static void main (String args[]) { System.out.println(quot;Starting ExempleChar...quot;); char a,b,c; a='a'; b='u0022'; c=97; System.out.println(quot;a = quot; + a); System.out.println(quot;b = quot; + b); System.out.println(quot;c = quot; + c); } } 73
  74. 74. Initialisation des variables (1) – Java exige que toutes les variables soient définies et initialisées. ■ Le compilateur sait déterminer si une variable est susceptible d'être utilisée avant initialisation et produit une erreur de compilation. ■ Donc, le compilateur force l’initialisation de toutes variables avant son utilisation □ C’est une sécurité mais oblige à faire attention à ce point pour éviter une erreur de compilation ■ Erreur de compilation du type □ Z:TravailJavaexosExempleInit.java:8: variable a might not have been initialized 74
  75. 75. Initialisation des variables (2) ExempleChar.java public class ExempleInit { public static void main (String args[]) { System.out.println(quot;Starting ExempleInit...quot;); int a,b,c; b = 10; c = b + a; } } Z:TravailIUTEnseignements2003-2004SRC2AJavaexosExempleInit.java:8: variable a might not have been initialized 75
  76. 76. Opérateurs : mémo Ce sont, à peu d'exceptions près, les mêmes que ceux de C ou C++. Le tableau suivant en donne les règles d'associativité de gauche à droite ou de droite à gauche. Les plus Droite à Gauche .[]() prioritaires DàG ++ - - + - ~ ! (cast_operator) GàD */% GàD +- GàD << >> >>> GàD < > <= >= instanceof GàD = = != GàD & GàD ^ GàD && GàD ³ DàG ?: DàG = *= /= %= += -= <<= >>= >>>= &= ^= = Les moins prioritaires 76
  77. 77. Méthodes
  78. 78. Méthodes et paramètres (1) – La notion de méthodes dans les langages objets ■ Proches de la notion de procédure ou de fonction dans les langages procéduraux. □ La méthode c’est avant tout le regroupement d’un ensemble d’instructions suffisamment générique pour pouvoir être réutilisées □ Comme pour les procédures ou les fonctions (au sens mathématiques) on peut passer des paramètres aux méthodes et ces dernières peuvent renvoyer des valeurs (grâce au mot clé return). 78
  79. 79. Méthodes et paramètres (2) – Méthodes de classe et méthode d’instances ■ En java on a 2 grands types de méthodes les méthodes de classe (défini avec le mot clé static comme pour la méthode main) et les méthodes d’instance : □ Une méthode est un message que l’on envoie ▪ à une classe : méthode de classe ou ▪ à un objet : méthode d’instance (ou méthode) □ La méthode main est toujours une méthode de classe ▪ Pour utiliser une méthode d’instance, il faut d’abord créer un objet qui peut « recevoir » cette méthode ▪ La méthode main est le point d’entrée dans le programme et est la première méthode lancée, avant la création du premier objet. Il est donc nécessaire que cela soit une méthode de classe. 79
  80. 80. Méthodes et paramètres (3) – Opérateurs d’accès à un membre d’un objet ou d’une classe ■ En java nous avons l’opérateur « . » qui permet d’accéder à un attribut ou une méthode d’un objet ou d’une classe ■ On précise le nom de l’objet ou de la classe, suivi du point, suivi du nom de l’attribut ou du nom de la méthode. readint est une méthode de la classe (méthode static) BasicIO. Pour l’utiliser on écrit : Basic.readint(quot;Entrer un entier:quot;); La méthode indexOf est une méthode d’instance de String Si on a un objet String nommé « s » et initialisé avec une valeur, on pourra appeler la méthode indexOf de la manière suivante : s = new String(quot;Bonjourquot;); int index_j = s.indexOf(quot;jquot; ); Attention : BasicIO ne fait pas partie des classes fournies en standard en Java ; c'est une classe utilisée dans le cadre de ce cours pour faciliter la saisie des données. 80
  81. 81. Méthodes et paramètres (4) exemple : public, type de la valeur couples d'un type et d'un static renvoyée ou void identificateur séparés par des « , » <modificateur> <type-retour> <nom> (<liste-param>) {<bloc>} public double add (double number1, double number2) { Notre méthode retourne ici une return (number1 +number2); valeur } Définition d’une méthode en Java 81
  82. 82. Méthodes et paramètres (5) AdditionEntier.java readint() est une méthode de classe. Elle est défini comme public class AdditionEntier static dans la classe BasicIO. { C’est un message que l’on public static void main(String args[]) envoie à la classe BasicIO { int nb1, nb2, result; nb1 = BasicIO.readint(quot;Entrer un entier:quot;); nb2 = BasicIO.readint(quot;Entrer un entier:quot;); result = nb1 + nb2; méthode println() System.out.println(quot;Somme = quot; + result); est une méthode d’instance } c’est un message que l’on } envoie à l’objet System.out qui est un objet particulier représentant la sortie standard 82
  83. 83. Portée des variables (1) – Lesvariables sont connues et ne sont connues qu’à l’intérieur du bloc dans lequel elles sont déclarées public class Bidule { int i, j, k; public void truc(int z) { int j,r; Ce sont 2 variables différentes r = z; } public void machin() k est connu au niveau de la méthode { machin() car déclaré dans le bloc de la k = r; classe. Par contre r n’est pas défini pour } machin(). On obtient une erreur à la } compilation 83
  84. 84. Portée des variables (2) – Encas de conflit de nom entre des variables locales et des variables globales, ■ c’est toujours la variable la plus locale qui est considérée comme étant la variable désignée par cette partie du programme □ Attention par conséquent à ce type de conflit quand on manipule des variables globales. public class Bidule { int i, k, j; public void truc(int z) { int j,r; C’est le j défini en local j = z; qui est utilisé dans } la méthode truc() } 84
  85. 85. La classe Math (1) – Les fonctions mathématiques les plus connues sont regroupées dans la classe Math qui appartient au package java.lang ■ les fonctions trigonométriques ■ les fonctions d’arrondi, de valeur absolue, ... ■ la racine carrée, la puissance, l’exponentiel, le logarithme, etc. – Ce sont des méthodes de classe (static) double calcul = Math.sqrt (Math.pow(5,2) + Math.pow(7,2)); double sqrt(double x) : racine carrée de x double pow(double x, double y) : x puissance y 85
  86. 86. La classe Math (2) public class ExerciceAlgo2 { public static void main (String args[]) { System.out.println(quot;ExerciceAlgo2...quot;); double val = BasicIO.readdouble(quot;Entrer un nombrequot;); double val_abs; val_abs = Math.abs(val); System.out.println(quot;La valeur absolue de votre nombre est : quot;+ val_abs); } } 86
  87. 87. Les structures de contrôle (I)
  88. 88. Présentation générale – Les structures de contrôle classiques existent en Java : ■ if, else ■ switch, case, default, break ■ for ■ while ■ do, while –A utiliser avec parcimonie ■ <étiquette> : suivie d'une boucle for, while ou do ■ break <étiquette> ou break; ■ continue <étiquette> ou continue; 88
  89. 89. if / else (1) – Instructions conditionnelles ■ On veut effectuer une ou plusieurs instructions seulement si une certaine condition est vraie if (condition) instruction; et plus généralement : if (condition) { bloc d’instructions} condition doit être un booléen ou renvoyer une valeur booléenne ■ On veut effectuer une ou plusieurs instructions si une certaine condition est vérifiée sinon effectuer d’autres instructions if (condition) instruction1; else instruction2; et plus généralement if (condition) { 1er bloc d’instructions} else {2ème bloc d’instruction} ■ La structure if() {…} else if() {…} else if (){…} else {}est possible en Java 89
  90. 90. if / else (2) fausse (sinon) condition Série 2 d’actions vraie (alors) Série 1 d’actions 90
  91. 91. if / else (3) Max.java public class Max { public static void main(String args[]) { int nb1, nb2; nb1 = BasicIO.readint(quot;Entrer un entier:quot;); nb2 = BasicIO.readint(quot;Entrer un entier:quot;); if (nb1 > nb2) System.out.println(quot;l’entier le plus grand est quot;, nb1); else System.out.println(quot;l’entier le plus grand est quot;, nb2); } } 91
  92. 92. while (1) – Boucles indéterminées ■ On veut répéter une ou plusieurs instructions un nombre indéterminés de fois : on répète l’instruction ou le bloc d’instruction tant que une certaine condition reste vraie ■ nous avons en Java une première boucle while (tant que) □ while (condition) {bloc d’instructions} □ les instructions dans le bloc sont répétées tant que la condition reste vraie. □ On ne rentre jamais dans la boucle si la condition est fausse dès le départ 92
  93. 93. while (2) – Boucles indéterminées ■ un autre type de boucle avec le while: □ do {bloc d’instructions} while (condition) □ les instructions dans le bloc sont répétées tant que la condition reste vraie. □ On rentre toujours au moins une fois dans la boucle : la condition est testée en fin de boucle. 93
  94. 94. while (3) fausse while () { ...} condition vraie Instructions 94
  95. 95. while (4) Instructions do { ...}while (); vraie condition fausse 95
  96. 96. while (5) Facto1.java public class Facto1 { public static void main(String args[]) { int n, result,i; n = BasicIO.readint(quot;Entrer une valeur pour nquot;); result = 1; i = n; while (i > 1) { result = result * i; i--; } System.out.println( quot;la factorielle de quot; + n + quot; vaut quot; + result); } } 96
  97. 97. for (1) – Boucles déterminées ■ On veut répéter une ou plusieurs instructions un nombre déterminés de fois : on répète l’instruction ou le bloc d’instructions pour un certain nombre de pas. ■ La boucle for for (int i = 1; i <= 10; i++) System.out.println(i); //affichage des nombres de 1 à 10 ■ une boucle for est en fait équivalente à une boucle while for (instruction1; expression1; expression2) {bloc} … est équivalent à … instruction 1; while (expression1) {bloc; expression2} 97
  98. 98. for (2) Facto2.java public class Facto2 { public static void main(String args[]) { int n, result,i; n = BasicIO.readint(quot;Entrer une valeur pour nquot;); result = 1; for(i =n; i > 1; i--) { result = result * i; } System.out.println( quot;la factorielle de quot; + n + quot; vaut quot; + result); } } 98
  99. 99. Exermple – Somme des N premiers entiers public class SommeNEntiers { public static void main(String args[]) { int n; n = BasicIO.readint(quot;Entrer un entierquot;); System.out.println(quot;La somme vaut quot; + SommeNEntiers.somme(n)); } public static int somme(int n) { int res = 0; while (n > 0) { res = res + n; n--; } return res; } } 99
  100. 100. switch (1) – Sélection multiples ■ l’utilisation de if / else peut s’avérer lourde quand on doit traiter plusieurs sélections et de multiples alternatives ■ pour cela existe en Java le switch / case assez identique à celui de C/ C++ ■ La valeur sur laquelle on teste doit être un char ou un entier (à l’exclusion d’un long). ■ En règle général l’exécution des instructions correspondant à une alternative commence au niveau du case correspondant et se termine à la rencontre d’une instruction break ou arrivée à la fin du switch 100
  101. 101. switch (2) Alternative.java public class Alternative Variable contenant la valeur { que l’on veut tester. public static void main(String args[]) { int nb = ESBasique.litInt(quot;Entrer un entier:quot;); switch(nb) Première alternative : { on affiche 1 et on sort case 1: du bloc du switch au break; System.out.println(quot;1quot;); break; case 2: Deuxième alternative : System.out.println(quot;2quot;); break; on affiche 2 et on sort default: du bloc du switch au break; System.out.println(quot;Autre nombrequot;); break; } } Alternative par défaut: } on réalise une action par défaut. 101
  102. 102. break – Interruption et interruption étiquetée ■ l’instruction break permet de sortir d ’une boucle □ on sort du bloc d’instructions dans lequel on est pour remonter dans le bloc contenant ■ On peut aussi utilisée un étiquetage pour quitter un ensemble de boucles imbriquées □ l’étiquette doit précéder la plus externe des boucles que l ’on veut quitter. □ <étiquette> : suivie d'une boucle □ break <étiquette> ou break; □ continue <étiquette> ou continue; 102
  103. 103. continue – continue ■ l’instruction continue permet de sauter une itération dans une boucle sans pour autant sortir de la boucle □ à l’arrivée sur l’instruction continue on passe à l’itération suivante de la boucle sans aller jusqu’à la fin de la boucle. □ continue <étiquette> ou continue; 103
  104. 104. La récursivité (rappel)
  105. 105. Récursivité (1) – On définit la factorielle d’un nombre entier positif n, n! par ■ n! = n * n-1 * …* 1 sachant que par convention la 0! = 1 ■ Définir une classe Java qui calcule la factorielle par récurrence ■ On rappelle que □ n! = n* n-1 * … *1 = n * (n-1* n-2 * …*1) = n *(n-1)! 105
  106. 106. Récursivité (2) public class Facto3 { public static void main(String args[]) { int n, res; n = BasicIO.readint(quot;Entrer un nombre entier positifquot;); if (n >=0) { res = facto_recur(n);} else { res = 0;} System.out.println(quot;La factorielle de quot; + n + quot; vaut : quot; + res); } public static int facto_recur(int n) { if ((n == 1) || (n ==0)) {return 1;} else {return (n*facto_recur(n-1));} } } 106
  107. 107. Récursivité (3) – Récursivité ■ Pour résoudre un problème on fait appel à la résolution du même problème mais dans un cas plus « simple » ■ Schéma de résolution identique mais à un niveau inférieur □ Classiquement la résolution du problème au niveau « n » fait intervenir la résolution du problème au niveau « n-1 » ▪ La factorielle ▪ La puissance □ En mathématique on a des suites définies selon une équation de récurrence ▪ Un = q * Un-1 + r □ Problème classique des tours de Hanoi… 107
  108. 108. Les chaînes de caractères
  109. 109. La classe String (1) – Attention ce n’est pas un type de base. Il s'agit d'une classe défini dans l’API Java (Dans le package java.lang) String s=quot;aaaquot;; // s contient la chaîne quot;aaaquot; mais String s=new String(quot;aaaquot;); // identique à la ligne précédente – La concaténation ■ l’opérateur + entre 2 « String » les concatène : String str1 = quot;Bonjour ! quot;; String str2 = null; str2 = quot;Comment vas-tu ?quot;; String str3 = str1 + str2; / * Concaténation de chaînes : str3 contient quot; Bonjour ! Comment vas-tu ?quot; 109
  110. 110. Différences entre objets et types de base (1) Mémoire 3 int x=3,y=3; x == y est vrai 3 0x768 0x852 String s1=quot;abcquot;,s2=quot;abcquot;; Abc s1 == s2 est faux... .... Quand on compare 2 variables d’un type de base on compare leur valeur. Quand on compare 2 objet Abc avec les opérateurs on compare leur référence (leur .... adresse en mémoire). Introduction de la méthode equals() pour les objets : s1.equals(s2) est vrai 110
  111. 111. Différences entre objets et types de base (2) public class ExempleString { public static void main(String args[]) { String s1=new String(quot;abcquot;); String s2=new String(quot;abcquot;); String s_abc1 = quot;abcquot;; String s_abc2 = quot;abcquot;; int x = 3, y =3; System.out.println(quot;x = quot; + x + quot; y = quot; + y + quot; et x == y vaut quot; + (x == y)); System.out.println(quot;s1 = new String(quot;abcquot;); --> quot; + s1); System.out.println(quot;s2 = new String(quot;abcquot;); --> quot; + s2); System.out.println(quot;s1 == s2 vaut quot; + (s1 == s2)); System.out.println(quot;s1.equals(s2) vaut quot; + (s1.equals(s2))); System.out.println(quot;s_abc1 = quot;abcquot;; --> quot; + s_abc1); System.out.println(quot;s_abc2 = quot;abcquot;; --> quot; + s_abc2); System.out.println(quot;s_abc1 == s_abc2 vaut quot; + (s_abc1 == s_abc2)); System.out.println(quot;s_abc1.equals(s_abc2) vaut quot; + (s_abc1.equals(s_abc2))); } } 111
  112. 112. La classe String (2) – Longueur d’un objet String : ■ méthode int length() : renvoie la longueur de la chaîne String str1 = quot;bonjourquot;; int n = str1.length(); // n vaut 7 – Sous-chaînes ■ méthode String substring(int debut, int fin) ■ extraction de la sous-chaine depuis la position debut jusqu’à la position fin non-comprise. String str2 = str1.substring(0,3); // str2 contient la valeur quot;bonquot; ■ le premier caractère d’une chaîne occupe la position 0 ■ le deuxième paramètre de substring indique la position du premier caractère que l’on ne souhaite pas copier 112
  113. 113. La classe String (3) – Récupération d’un caractère dans une chaîne ■ méthode char charAt(int pos) : renvoie le caractère situé à la position pos dans la chaîne de caractère à laquelle on envoie se message String str1 = quot;bonjourquot;; char unJ = str1.charAt(3); // unJ contient le caractère 'j' 113
  114. 114. La classe String (4) – Modification des objets String ■ Les String sont inaltérables en Java : on ne peut modifier individuellement les caractères d’une chaîne. ■ Par contre il est possible de modifier le contenu de la variable contenant la chaîne (la variable ne référence plus la même chaîne). str1 = str1.substring(0,3) + quot; soirquot;; /* str1 contient maintenant la chaîne quot;bonsoirquot; */ ■ Quand on a besoin de manipuler directement les chaînes de caractères il existe la classe StringBuffer (cf. TP) 114
  115. 115. La classe String (5) – Les chaînes de caractères sont des objets : ■ pour tester si 2 chaînes sont égales il faut utiliser la méthode boolean equals(String str) et non == ■ pour tester si 2 chaînes sont égales à la casse près il faut utiliser la méthode boolean equalsIgnoreCase(String str) String str1 = quot;BonJourquot;; String str2 = quot;bonjourquot;; String str3 = quot;bonjourquot;; boolean a, b, c, d; a = str1.equals(quot;BonJourquot;); //a contient la valeur true b = (str2 == str3); //b contient la valeur false c = str1.equalsIgnoreCase(str2);//c contient la valeur true d = quot;bonjourquot;.equals(str2); //d contient la valeur true 115
  116. 116. La classe String (6) – Quelques autres méthodes utiles ■ boolean startsWith(String str) : pour tester si une chaine de caractère commence par la chaine de caractère str ■ boolean endsWith(String str) : pour tester si une chaîne de caractère se termine par la chaine de caractère str String str1 = quot;bonjour quot;; boolean a = str1.startsWith(quot;bonquot;);//a vaut true boolean b = str1.endsWith(quot;jourquot;);//b vaut true 116
  117. 117. La classe String (7) Plus d’informations dans les documentations de l’API dans le package java.lang 117
  118. 118. La classe String (8) public class ExempleString2 { public static void main(String args[]) { String str1 = quot;bonjourquot;; System.out.println(quot;Il y a quot; + str1.length() + quot; caractères dans str1quot;); String str2 = str1.substring(0,3); System.out.println(quot;str2 contient la chaine : quot; + str2); char unJ = str1.charAt(3); System.out.println(quot;Le 3eme caractère de str1 est : quot; + unJ); String str3 = quot;BonJourquot;; System.out.println(quot;str1.equals(quot;BonJourquot;); vaut : quot; + str1.equals(quot;BonJourquot;)); System.out.println(quot;str1.equalsIgnoreCase(str3); vaut quot; + str1.equalsIgnoreCase(str3)); System.out.println(quot;quot;bonjourquot;.equals(str1); vaut quot; + quot;bonjourquot;.equals(str1)); System.out.println(quot;str1.startsWith(quot;bonquot;); vaut quot; + str1.startsWith(quot;bonquot;)); System.out.println(quot;str1.endsWith(quot;Jourquot;); vaut quot; + str1.endsWith(quot;jourquot;)); } } 118
  119. 119. Objet et référence
  120. 120. Objets, tableaux, types de base – Lorsqu'une variable est d'un type objet ou tableau : ■ ce n'est pas l'objet ou le tableau lui-même qui est stocké dans la variable mais une référence vers cet objet ou ce tableau (on retrouve la notion d’adresse mémoire ou du pointeur en C). – Lorsqu'une variable est d'un type de base : ■ La variable contient la valeur. – Lorsqu’unevariable est d’un type « complexe » (Chaine, Tableau, Objet quelconque) ■ La variable contient la valeur de l’adresse à laquelle se trouve l’objet 120
  121. 121. Références – La référence en Java correspond à la notion de pointeur ■ La référence est, en quelque sorte, un pointeur pour lequel le langage assure une manipulation transparente (pour l’utilisateur), comme si c'était une valeur □ pas de déréférencement : on manipule toujours l’objet et jamais directement le « pointeur ». Contrairement au C/C++, il n’y a pas d’arithmétique sur les pointeurs – Attention ■ La référence n’étant pas une valeur, c'est au programmeur de prévoir l'allocation mémoire nécessaire pour stocker effectivement l'objet □ utilisation de l’opérateur new 121
  122. 122. Différences entre objets et types de base Mémoire 3 int x=3,y=3; x == y est vrai 3 0x768 0x852 String s1=new String(quot;abcquot;),s2=new String(quot;abcquot;); Abc s1 == s2 est faux... .... Quand on compare 2 variables d’un type de base on compare leur valeur. Quand on compare 2 objet Abc avec les opérateurs on compare leur référence (leur .... adresse en mémoire). Introduction de la méthode equals() pour les objets : s1.equals(s2) est vrai 122
  123. 123. Les tableaux
  124. 124. Les tableaux (1) – Les tableaux permettent de stocker plusieurs valeurs de même type dans une variable. ■ Les valeurs contenues dans la variable sont repérées par un indice ■ En langage Java, les tableaux sont des objets – Déclaration ■ type_elt_tableau nom_var_tab [ ]; □ int tab [ ]; String chaines [ ]; – Création d'un tableau ■ nom_var_tab = new type_elt_tableau [taille_tableau]; □ tab = new int [20]; //tableau de 20 entiers de type int □ chaines = new String [100]; //tableau de 100 chaînes 124
  125. 125. Les tableaux (2) – Le nombre d'éléments du tableau est stocké. ■ Java peut ainsi détecter à l'exécution le dépassement d'indice et générer une exception. ■ Mot clé length □ Le nombre d’éléments (la taille) est récupérable par nomTableau.length tab = new int [20]; int taille = tab.length; //taille vaut 20 – Comme en C/C++ ou en JavaScript, les indices d’un tableau commencent à ‘ 0 ’. ■ Donc un tableau de taille 100 aura ses indices qui iront de 0 à 99. 125
  126. 126. Les tableaux (3) – Initialisation tab[0]=1; tab[1]=2; //etc. noms[0] = new String( quot;Boulequot;); noms[1] = new String( quot;Billquot;);//etc – Création et initialisation simultanées String noms [ ] = {quot;Boulequot;,quot;Billquot;}; Point pts[ ] = { new Point (0, 0), new Point (10, -1)}; 126
  127. 127. Les tableaux (4) – Il est possible de créer des tableaux quot;rectangulairesquot; et des tableaux quot;non rectangulairesquot;. ■ Des tableaux à 2 dimensions : notion de matrices ■ on parle plus généralement de tableau multidimensionnel. – Exemples : int matrice [ ] [ ] = new int [4] [3]; int tab [ ] [ ] = new int [4] [ ]; tab [0] = new int [5]; tab [1] = new int [8]; tab [2] = new int [3]; tab [3] = new int [10]; 127
  128. 128. Les tableaux (5) – Quelques méthodes utiles ■ Dans la classe java.lang.System □ static void arraycopy(Object src, int src_position, Object dst, int dst_position, int length) qui copie le tableau src à partir de l’indice src_position dans le tableau dst, en le remplissant à partir de dst_position et en copiant length élément(s). 128
  129. 129. Les tableaux (6) – Quelques méthodes utiles ■ Dans la classe java.util.Arrays □ static int binarySearch ( type[ ] tab, type elt_a_chercher) qui recherche de elt_a_chercher. Renvoie l’indice si trouver, une valeur négative sinon. Dans ce dernier cas, (-r +1) désigne la position à laquelle il faudrait insérer elt_a_chercher pour que tab reste trié. □ static boolean equals(type[ ] tab1, type[ ] tab2) pour comparer 2 tableaux de même type. □ static void fill(type[ ] tab, type elt_de_remplissage) pour remplir un tableau avec un même élément. □ static void sort(type[ ] tab) qui réalise un quickSort ascendant sur les éléments de tab. 129
  130. 130. Les tableaux (7) Tab1.java public class Tab1 { public static void main (String args[]) Pour déclarer une variable tableau { on indique le type des éléments du int tab[ ] ; tableau et le nom de la variable tableau tab = new int[4]; suivi de [ ] tab[0]=5; tab[1]=3; tab[2]=7; on utilise new <type> [taille]; tab[3]=tab[0]+tab[1]; pour initialiser le tableau } } On peut ensuite affecter des valeurs au différentes cases du tableau : Les indices vont toujours de <nom_tableau>[indice] 0 à (taille-1) 130
  131. 131. Les tableaux (8) Tab1.java Mémoire public class Tab1 { public static void main (String args[]) { int tab[ ] ; 0x0000 0x258 tab = new int[4]; tab[0]=5; 0 tab[1]=3; 0 tab[2]=7; tab[3]=tab[0]+tab[1]; 0 } 0 } 131
  132. 132. Les tableaux (9) Tab1.java Mémoire public class Tab1 { public static void main (String args[]) { 0x258 int tab[ ] ; tab = new int[4]; tab[0]=5; 0 5 tab[1]=3; 0 3 tab[2]=7; tab[3]=tab[0]+tab[1]; 0 7 } 0 8 } 132
  133. 133. Les tableaux (10) Tab2.java Mémoire public class Tab2 { 0x0258 public static void main (String args[]) { String tab[ ] ; 0x0106 0x0000 tab = new String[4]; 0x0115 0x0000 tab[0]=new String(quot;Pierrequot;); 0x0234 0x0000 tab[1]=new String(quot;Paulquot;); tab[2]=new String(quot;Jacquesquot;); 0x0599 0x0000 tab[3]=new String(quot;Philippequot;); } } quot;Pierrequot; 133
  134. 134. Les tableaux (11) Tab2.java Modification du programme pour afficher le contenu public class Tab2 du tableau. { public static void main (String args[]) { String tab[ ] ; tab = new String[4]; tab[0]=new String(quot;Pierrequot;); tab[1]=new String(quot;Paulquot;); tab[2]=new String(quot;Jacquesquot;); tab[3]=new String(quot;Philippequot;); for (int i=0;i<tab.length;i++) { System.out.println(quot;Prénom Numero : quot; + i + tab[i]); }} } 134
  135. 135. Les bases de la programmation objet en Java
  136. 136. Accès aux attributs d’un objet (1) Personne.java Personne nom : String prenom : String public class Personne age : Integer { public String nom; getNom() public String prenom; setNom() public int age; public void setNom(String unNom) { nom = unNom; } public String getNom() { return (nom); } } 136
  137. 137. Accès aux attributs d’un objet (2) Application.java public class Application { public static void main(String args[]) { Personne jean = new Personne(); jean.nom = quot;Jeanquot; ; jean.prenom = quot;Pierrequot; ; } } Remarque : Contrairement aux variables, les attributs d'une classe, s'ils ne sont pas initialisés, se voient affecter automatiquement une valeur par défaut. Cette valeur vaut : 0 pour les variables numériques, false pour les booléens, et null pour les références. 137
  138. 138. Accès aux méthodes d’un objet (1) Personne.java Personne nom : String prenom : String public class Personne age : Integer { public String nom; getNom() public String prenom; setNom() public int age; public void setNom(String unNom) { nom = unNom; } public String getNom() { return (nom); } } 138
  139. 139. Accès aux méthodes d’un objet (2) Application.java public class Application { public static void main(String args[]) { Personne jean = new Personne(); jean.setNom(quot;Jeanquot;) ; } } 139
  140. 140. Les constructeurs (1) – L'appel de new pour créer un nouvel objet déclenche, dans l'ordre : ■ L'allocation mémoire nécessaire au stockage de ce nouvel objet et l'initialisation par défaut de ces attributs, ■ L'initialisation explicite des attributs, s'il y a lieu, ■ L'exécution d'un constructeur. – Un constructeur est une méthode d'initialisation. public class Application { Le constructeur est ici celui public static void main(String args[]) par défaut (pas de { constructeur défini dans Personne jean = new Personne(); la classe Personne) jean.setNom(quot;Jeanquot;) ; } } 140
  141. 141. Les constructeurs (2) – Lorsque l'initialisation explicite n'est pas possible ■ par exemple lorsque la valeur initiale d'un attribut est demandée dynamiquement à l'utilisateur, il est possible de réaliser l'initialisation au travers d'un constructeur. – Le constructeur est une méthode : ■ de même nom que la classe, ■ sans type de retour. – Toute classe possède au moins un constructeur ■ Si le programmeur ne l'écrit pas, il en existe un par défaut, sans paramètres, de code vide. 141
  142. 142. Les constructeurs (3) Personne.java Définition d’un Constructeur. Le public class Personne constructeur par défaut { (Personne() )n’existe plus. public String nom; Le code précédent occasionnera public String prenom; une erreur public int age; public Personne(String unNom, String unPrenom, int unAge) { nom=unNom; public class Application prenom=unPrenom; { age = unAge; public static void main(String args[]) } { } Personne jean = new Personne(); jean.setNom(quot;Jeanquot;) ; } } Va donner une erreur à la compilation 142
  143. 143. Les constructeurs (4) – Pour une même classe, il peut y avoir plusieurs constructeurs, de signatures différentes (surcharge). – L'appel de ces constructeurs est réalisé avec le new auquel on fait passer les paramètres. – p1 = new Personne(quot;Pierrequot;, quot;Richardquot;, 56); – Déclenchement du quot;bonquot; constructeur ■ Il se fait en fonction des paramètres passés lors de l'appel (nombre et types). C'est le mécanisme de quot;lookupquot;. – Attention ■ Si le programmeur crée un constructeur (même si c'est un constructeur avec paramètres), le constructeur par défaut n'est plus disponible. Attention aux erreurs de compilation ! 143
  144. 144. Les constructeurs (5) Personne.java Redéfinition d’un public class Personne Constructeur sans paramètres { public String nom; public String prenom; public int age; public Personne() { nom=null; prenom=null; On définit plusieurs constructeurs age = 0; qui se différencient uniquement } par leurs paramètres (on parle public Personne(String unNom, de leur signature) String unPrenom, int unAge) { nom=unNom; prenom=unPrenom; age = unAge; } } 144
  145. 145. Destruction d’objets (1) – Java n'a pas repris à son compte la notion de destructeur telle qu’elle existe en C++ par exemple. ■ C'est le ramasse-miettes (ou Garbage Collector - GC en anglais) qui s'occupe de collecter les objets qui ne sont plus référencés. ■ Le ramasse-miettes fonctionne en permanence dans un thread de faible priorité (en « tâche de fond »). □ Il est basé sur le principe du compteur de références. ■ Il faut faire attention certains bibliothèques graphiques (SWT) exigent du programmeur qu’il gère lui-même la libération des la mémoire par les objets inutilisés. □ Cependant ce n’est pas le cas général en Java. 145
  146. 146. Destruction d’objets (2) – Leprogrammeur n’a plus à gérer directement la destruction des objets, ■ c’était une importante source d'erreurs □ on parlait de fuite de mémoire ou « memory leak » en anglais – Désactivation du GC ■ Le ramasse-miettes peut être quot;désactivéquot; en lançant l'interpréteur java avec l'option -noasyncgc. – Activation du gc ■ le ramasse-miettes peut être lancé explicitement par une application avec l'appel System.gc(); 146
  147. 147. Destruction d’objets (3) – Il est possible au programmeur d'indiquer ce qu'il faut faire juste avant de détruire un objet. ■ C'est le but de la méthode finalize() de l'objet. ■ Cette méthode est utile, par exemple, pour : □ fermer une base de données, □ fermer un fichier, □ couper une connexion réseau, □ etc. 147
  148. 148. méthodes (rappel) exemple : public, type de la valeur couples d'un type et d'un static renvoyée ou void identificateur séparés par des « , » <modificateur> <type-retour> <nom> (<liste-param>) {<bloc>} public double add (double number1, double number2) { Notre méthode retourne ici une return (number1 +number2); valeur } 148
  149. 149. Mode de passage des paramètres (1) – Java n'implémente qu'un seul mode de passage des paramètres à une méthode : ■ le passage par valeur (comme le C) – Conséquences : ■ l'argument passé à une méthode ne peut être modifié, ■ si l'argument est un objet, c'est sa référence qui est passée par valeur. □ Ainsi, le contenu de l'objet peut être modifié, mais pas la référence elle-même. 149
  150. 150. Mode de passage des paramètres (2) public class Personne { public String nom; public String prenom; public int age; public Personne() { nom=null; prenom=null; age = 0; } public Personne(String nom, String prenom, int age) { this.nom=nom; this.prenom=prenom; this.age=age; } public void affiche_personne() { System.out.println(this.prenom + quot; quot; + this.nom + quot; quot; + this.age);} } 150
  151. 151. Mode de passage des paramètres (3) public class exemplePassageParam { public static void main(String args[]) { int nombre = 5; System.out.println(nombre); modification_nombre(nombre); System.out.println(nombre); Personne etudiant = new Personne(quot;Terieurquot;,quot;Alexquot;, 20); etudiant.affiche_personne(); modification_personne(etudiant); etudiant.affiche_personne(); } public static void modification_personne (Personne p) { p.nom = quot;Terieurquot;; p.prenom = quot;Alainquot;; p.age = 21; } public static void modification_nombre (int unNombre) { unNombre = 16; } } 151
  152. 152. Contrôle d’accès (1) – Chaque attribut et chaque méthode d'une classe peut être : ■ visible depuis les instances de toutes les classes d'une application. En d'autres termes, son nom peut être utilisé dans l'écriture d'une méthode de ces classes. Il est alors public. ■ visible uniquement depuis les instances de sa classe. En d'autres termes, son nom peut être utilisé uniquement dans l'écriture d'une méthode de sa classe. Il est alors privé. – Les mots réservés sont : – public – private 152
  153. 153. Contrôle d’accès (2) – En toute rigueur, il faudrait toujours que : ■ les attributs ne soient pas visibles, □ Les attributs ne devraient pouvoir être lus ou modifiés que par l'intermédiaire de méthodes prenant en charge les vérifications et effets de bord éventuels. ■ les méthodes quot;utilitairesquot; ne soient pas visibles, ■ seules les fonctionnalités de l'objet, destinées à être utilisées par d'autres objets soient visibles. ■ C’est la notion d’encapsulation ■ Nous verrons dans la suite que l’on peut encore affiner le contrôle d’accès . 153
  154. 154. Contrôle d’accès (3) public class Parallelogramme { private int longueur = 0; // déclaration + initialisation explicite private int largeur = 0; // déclaration + initialisation explicite public int profondeur = 0; // déclaration + initialisation explicite public void affiche ( ) {System.out.println(quot;Longueur= quot; + longueur + quot; Largeur = quot; + largeur + quot; Profondeur = quot; + profondeur); }} public class ProgPpal { public static void main(String args[]) { Parallelogramme p1 = new Parallelogramme(); p1.longueur = 5; // Invalide car l'attribut est privé p1.profondeur = 4; // OK p1.affiche( ); // OK }} 154
  155. 155. Contrôle d’accès évolué (1) – Outre private et public, Java définit deux niveaux de contrôle d'accès supplémentaires. – S'il n'y a pas de modificateur explicite dans la déclaration d'un attribut ou d'une méthode, celui-ci est visible depuis toute méthode d'une classe quelconque du même paquetage. ■ On l'appelle accès friendly. ■ Pas de mot réservé. 155
  156. 156. Contrôle d’accès évolué (2) – Un attribut ou une méthode protégé est visible depuis : ■ Toute méthode d'une classe quelconque appartenant au même paquetage, ■ Toute méthode d'une sous-classe. ■ Mot réservé : protected. – Une classe ou une interface peut être ■ publique (c'est-à-dire accessible partout où son paquetage l'est) ■ friendly (c'est-à-dire accessible seulement dans son paquetage). 156
  157. 157. Contrôle d’accès évolué (3) – Pour résumer ■ private : visible uniquement par la classe ■ public : visible par toutes mes classes ■ protected : visible par les sous-classes et par le package □ attention, la signification de protected en Java est différente de sa signification en C++ où il définit une visibilité uniquement pour les sous-classes. ■ Visibilité par défaut (quand aucun modificateur n’est spécifié) : visibilité par le package (paquetage) 157
  158. 158. L’héritage avec Java (1) – Java implémente le mécanisme d'héritage simple ■ L’héritage permet de quot;factoriserquot; de l'information dans le cas où deux classes sont reliées par une relation de généralisation / spécialisation. ■ L'héritage multiple n'existe pas en Java. □ Une classe ne peut hériter que d’une seule autre classe □ L’implémentation d’interface permet de compenser cette limitation – Pour le programmeur, il s'agit d'indiquer, dans la sous- classe, le nom de la superclasse dont elle hérite. ■ Par défaut toute classe Java hérite de la classe Object – Mot réservé : extends 158
  159. 159. L’héritage avec Java (2) class Personne Personne { nom : String date_naissance : Date private String nom; private Date date_naissance; // ... } class Employe extends Personne { Employe private float salaire; salaire : Double // ... } class Etudiant extends Personne { private int numero_carte_etudiant; // ... Etudiant } numero_carte_etudiant : Integer 159
  160. 160. L’héritage en Java (3) – Constructeurs et héritage ■ par défaut le constructeur d’une sous-classe appelle le constructeur quot;par défautquot; (celui qui ne reçoit pas de paramètres) de la superclasse. Attention donc dans ce cas que le constructeur sans paramètre existe toujours dans la superclasse... ■ Pour forcer l'appel d'un constructeur précis, on utilisera le mot réservé super. Cet appel devra être la première instruction du constructeur. 160

×