SlideShare une entreprise Scribd logo
1  sur  452
Télécharger pour lire hors ligne
Les bases de la programmation en Java



                 Christophe Vaudry
        mél : thegeekintheshell@gmail.com
       blog : thegeekintheshell.blogspot.com
        site Web : cvaudry.developpez.com
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
Présentation générale
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
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
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
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
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
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
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
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
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
Caractéristiques du langage Java
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
       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
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
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
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
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
Syntaxe du langage Java : les bases
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
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
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
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
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
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
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-à-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
Compilation et exécution (5)

                               Compilation


                               Exécution




                                           47
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
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
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
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
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
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
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
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
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 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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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 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
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
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
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
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
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
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
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
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
Les structures de contrôle (I)
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
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
if / else (2)



                                    fausse
                                    (sinon)
                    condition                 Série 2 d’actions



        vraie (alors)


                Série 1 d’actions




                                                                  90
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
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
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
while (3)




                                   fausse
 while () { ...}      condition




                   vraie


                    Instructions




                                            94
while (4)




                             Instructions
do { ...}while ();


                     vraie
                             condition




                                    fausse




                                             95
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
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
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
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
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
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
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
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
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 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
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
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
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 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
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
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
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
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
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
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
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
La classe String (7)

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




                       117
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
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 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
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
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
Les tableaux
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
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
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
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
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
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
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
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
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
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
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
Les bases de la programmation objet en
                  Java
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava
Introduction àJava

Contenu connexe

Tendances

Java entreprise edition et industrialisation du génie logiciel par m.youssfi
Java entreprise edition et industrialisation du génie logiciel par m.youssfiJava entreprise edition et industrialisation du génie logiciel par m.youssfi
Java entreprise edition et industrialisation du génie logiciel par m.youssfiENSET, Université Hassan II Casablanca
 
Architecture jee principe de inversion de controle et injection des dependances
Architecture jee principe de inversion de controle et injection des dependancesArchitecture jee principe de inversion de controle et injection des dependances
Architecture jee principe de inversion de controle et injection des dependancesENSET, Université Hassan II Casablanca
 
Android-Tp5 : web services
Android-Tp5 : web servicesAndroid-Tp5 : web services
Android-Tp5 : web servicesLilia Sfaxi
 
TD2 - UML - Correction
TD2 - UML - CorrectionTD2 - UML - Correction
TD2 - UML - CorrectionLilia Sfaxi
 
BI : Analyse des Données avec Mondrian
BI : Analyse des Données avec Mondrian BI : Analyse des Données avec Mondrian
BI : Analyse des Données avec Mondrian Lilia Sfaxi
 
Conférence: Catalyseurs de l'Intelligence Artificielle et Écosystème des Fram...
Conférence: Catalyseurs de l'Intelligence Artificielle et Écosystème des Fram...Conférence: Catalyseurs de l'Intelligence Artificielle et Écosystème des Fram...
Conférence: Catalyseurs de l'Intelligence Artificielle et Écosystème des Fram...ENSET, Université Hassan II Casablanca
 
Fascicule de tp atelier développement web
Fascicule de tp atelier développement webFascicule de tp atelier développement web
Fascicule de tp atelier développement webHouda TOUKABRI
 
Cours design pattern m youssfi partie 1 introduction et pattern strategy
Cours design pattern m youssfi partie 1 introduction et pattern strategyCours design pattern m youssfi partie 1 introduction et pattern strategy
Cours design pattern m youssfi partie 1 introduction et pattern strategyENSET, Université Hassan II Casablanca
 
Alphorm.com Formation Big Data & Hadoop : Le Guide Complet
Alphorm.com Formation Big Data & Hadoop : Le Guide CompletAlphorm.com Formation Big Data & Hadoop : Le Guide Complet
Alphorm.com Formation Big Data & Hadoop : Le Guide CompletAlphorm
 
Méthodologie 2 Track Unified Process
Méthodologie 2 Track Unified ProcessMéthodologie 2 Track Unified Process
Méthodologie 2 Track Unified ProcessZakaria Bouazza
 

Tendances (20)

Introduction a Flutter
Introduction a FlutterIntroduction a Flutter
Introduction a Flutter
 
Java entreprise edition et industrialisation du génie logiciel par m.youssfi
Java entreprise edition et industrialisation du génie logiciel par m.youssfiJava entreprise edition et industrialisation du génie logiciel par m.youssfi
Java entreprise edition et industrialisation du génie logiciel par m.youssfi
 
Support Java Avancé Troisième Partie
Support Java Avancé Troisième PartieSupport Java Avancé Troisième Partie
Support Java Avancé Troisième Partie
 
Architecture jee principe de inversion de controle et injection des dependances
Architecture jee principe de inversion de controle et injection des dependancesArchitecture jee principe de inversion de controle et injection des dependances
Architecture jee principe de inversion de controle et injection des dependances
 
Support JEE Servlet Jsp MVC M.Youssfi
Support JEE Servlet Jsp MVC M.YoussfiSupport JEE Servlet Jsp MVC M.Youssfi
Support JEE Servlet Jsp MVC M.Youssfi
 
Android-Tp5 : web services
Android-Tp5 : web servicesAndroid-Tp5 : web services
Android-Tp5 : web services
 
Complete Java Course
Complete Java CourseComplete Java Course
Complete Java Course
 
TD2 - UML - Correction
TD2 - UML - CorrectionTD2 - UML - Correction
TD2 - UML - Correction
 
Support developpement applications mobiles avec ionic v3 et v4
Support developpement applications mobiles avec ionic v3 et v4Support developpement applications mobiles avec ionic v3 et v4
Support developpement applications mobiles avec ionic v3 et v4
 
BI : Analyse des Données avec Mondrian
BI : Analyse des Données avec Mondrian BI : Analyse des Données avec Mondrian
BI : Analyse des Données avec Mondrian
 
Conférence: Catalyseurs de l'Intelligence Artificielle et Écosystème des Fram...
Conférence: Catalyseurs de l'Intelligence Artificielle et Écosystème des Fram...Conférence: Catalyseurs de l'Intelligence Artificielle et Écosystème des Fram...
Conférence: Catalyseurs de l'Intelligence Artificielle et Écosystème des Fram...
 
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
 
Tp java ee.pptx
Tp java ee.pptxTp java ee.pptx
Tp java ee.pptx
 
Fascicule de tp atelier développement web
Fascicule de tp atelier développement webFascicule de tp atelier développement web
Fascicule de tp atelier développement web
 
Cours design pattern m youssfi partie 1 introduction et pattern strategy
Cours design pattern m youssfi partie 1 introduction et pattern strategyCours design pattern m youssfi partie 1 introduction et pattern strategy
Cours design pattern m youssfi partie 1 introduction et pattern strategy
 
Alphorm.com Formation Big Data & Hadoop : Le Guide Complet
Alphorm.com Formation Big Data & Hadoop : Le Guide CompletAlphorm.com Formation Big Data & Hadoop : Le Guide Complet
Alphorm.com Formation Big Data & Hadoop : Le Guide Complet
 
Presentation Spring
Presentation SpringPresentation Spring
Presentation Spring
 
Support de cours angular
Support de cours angularSupport de cours angular
Support de cours angular
 
Traitement distribue en BIg Data - KAFKA Broker and Kafka Streams
Traitement distribue en BIg Data - KAFKA Broker and Kafka StreamsTraitement distribue en BIg Data - KAFKA Broker and Kafka Streams
Traitement distribue en BIg Data - KAFKA Broker and Kafka Streams
 
Méthodologie 2 Track Unified Process
Méthodologie 2 Track Unified ProcessMéthodologie 2 Track Unified Process
Méthodologie 2 Track Unified Process
 

En vedette

Java 7 - Fork/Join
Java 7 - Fork/JoinJava 7 - Fork/Join
Java 7 - Fork/JoinZenika
 
Introduction java
Introduction javaIntroduction java
Introduction javaFouad Root
 
Cours java smi 2007 2008
Cours java smi 2007 2008Cours java smi 2007 2008
Cours java smi 2007 2008Khalil Lechheb
 
Seven Versions of One Web Application
Seven Versions of One Web ApplicationSeven Versions of One Web Application
Seven Versions of One Web ApplicationYakov Fain
 
Dart for Java Developers
Dart for Java DevelopersDart for Java Developers
Dart for Java DevelopersYakov Fain
 
Integrating consumers IoT devices into Business Workflow
Integrating consumers IoT devices into Business WorkflowIntegrating consumers IoT devices into Business Workflow
Integrating consumers IoT devices into Business WorkflowYakov Fain
 
Java(ee) mongo db applications in the cloud
Java(ee) mongo db applications in the cloud Java(ee) mongo db applications in the cloud
Java(ee) mongo db applications in the cloud Shekhar Gulati
 
Bonnes pratiques des applications java prêtes pour la production
Bonnes pratiques des applications java prêtes pour la productionBonnes pratiques des applications java prêtes pour la production
Bonnes pratiques des applications java prêtes pour la productionCyrille Le Clerc
 
Intro to JavaScript
Intro to JavaScriptIntro to JavaScript
Intro to JavaScriptYakov Fain
 
Angular2 Development for Java developers
Angular2 Development for Java developersAngular2 Development for Java developers
Angular2 Development for Java developersYakov Fain
 
AngularJS for Java Developers
AngularJS for Java DevelopersAngularJS for Java Developers
AngularJS for Java DevelopersLoc Nguyen
 
RESTful services and OAUTH protocol in IoT
RESTful services and OAUTH protocol in IoTRESTful services and OAUTH protocol in IoT
RESTful services and OAUTH protocol in IoTYakov Fain
 
Reactive Thinking in Java
Reactive Thinking in JavaReactive Thinking in Java
Reactive Thinking in JavaYakov Fain
 
Overview of the AngularJS framework
Overview of the AngularJS framework Overview of the AngularJS framework
Overview of the AngularJS framework Yakov Fain
 
Angular 4 for Java Developers
Angular 4 for Java DevelopersAngular 4 for Java Developers
Angular 4 for Java DevelopersYakov Fain
 
Developing Modern Java Web Applications with Java EE 7 and AngularJS
Developing Modern Java Web Applications with Java EE 7 and AngularJSDeveloping Modern Java Web Applications with Java EE 7 and AngularJS
Developing Modern Java Web Applications with Java EE 7 and AngularJSShekhar Gulati
 
Angular 2 for Java Developers
Angular 2 for Java DevelopersAngular 2 for Java Developers
Angular 2 for Java DevelopersYakov Fain
 
Reactive programming in Angular 2
Reactive programming in Angular 2Reactive programming in Angular 2
Reactive programming in Angular 2Yakov Fain
 
Introduction to Angular 2
Introduction to Angular 2Introduction to Angular 2
Introduction to Angular 2Knoldus Inc.
 

En vedette (20)

Java 7 - Fork/Join
Java 7 - Fork/JoinJava 7 - Fork/Join
Java 7 - Fork/Join
 
Introduction java
Introduction javaIntroduction java
Introduction java
 
Cours java smi 2007 2008
Cours java smi 2007 2008Cours java smi 2007 2008
Cours java smi 2007 2008
 
Seven Versions of One Web Application
Seven Versions of One Web ApplicationSeven Versions of One Web Application
Seven Versions of One Web Application
 
Dart for Java Developers
Dart for Java DevelopersDart for Java Developers
Dart for Java Developers
 
Integrating consumers IoT devices into Business Workflow
Integrating consumers IoT devices into Business WorkflowIntegrating consumers IoT devices into Business Workflow
Integrating consumers IoT devices into Business Workflow
 
Java(ee) mongo db applications in the cloud
Java(ee) mongo db applications in the cloud Java(ee) mongo db applications in the cloud
Java(ee) mongo db applications in the cloud
 
Bonnes pratiques des applications java prêtes pour la production
Bonnes pratiques des applications java prêtes pour la productionBonnes pratiques des applications java prêtes pour la production
Bonnes pratiques des applications java prêtes pour la production
 
Intro to JavaScript
Intro to JavaScriptIntro to JavaScript
Intro to JavaScript
 
Angular2 Development for Java developers
Angular2 Development for Java developersAngular2 Development for Java developers
Angular2 Development for Java developers
 
AngularJS for Java Developers
AngularJS for Java DevelopersAngularJS for Java Developers
AngularJS for Java Developers
 
RESTful services and OAUTH protocol in IoT
RESTful services and OAUTH protocol in IoTRESTful services and OAUTH protocol in IoT
RESTful services and OAUTH protocol in IoT
 
Reactive Thinking in Java
Reactive Thinking in JavaReactive Thinking in Java
Reactive Thinking in Java
 
Overview of the AngularJS framework
Overview of the AngularJS framework Overview of the AngularJS framework
Overview of the AngularJS framework
 
Tutoriel java
Tutoriel javaTutoriel java
Tutoriel java
 
Angular 4 for Java Developers
Angular 4 for Java DevelopersAngular 4 for Java Developers
Angular 4 for Java Developers
 
Developing Modern Java Web Applications with Java EE 7 and AngularJS
Developing Modern Java Web Applications with Java EE 7 and AngularJSDeveloping Modern Java Web Applications with Java EE 7 and AngularJS
Developing Modern Java Web Applications with Java EE 7 and AngularJS
 
Angular 2 for Java Developers
Angular 2 for Java DevelopersAngular 2 for Java Developers
Angular 2 for Java Developers
 
Reactive programming in Angular 2
Reactive programming in Angular 2Reactive programming in Angular 2
Reactive programming in Angular 2
 
Introduction to Angular 2
Introduction to Angular 2Introduction to Angular 2
Introduction to Angular 2
 

Similaire à Introduction àJava

0251-formation-java-programmation-objet.pdf
0251-formation-java-programmation-objet.pdf0251-formation-java-programmation-objet.pdf
0251-formation-java-programmation-objet.pdfOmbotimbe Salifou
 
Java uik-chap1-intro java
Java uik-chap1-intro javaJava uik-chap1-intro java
Java uik-chap1-intro javaAmel Morchdi
 
Gwt oxiane-novae-lr
Gwt oxiane-novae-lrGwt oxiane-novae-lr
Gwt oxiane-novae-lroxmed
 
.Net pour le développeur Java - une source d'inspiration?
.Net pour le développeur Java - une source d'inspiration?.Net pour le développeur Java - une source d'inspiration?
.Net pour le développeur Java - une source d'inspiration?Rui Carvalho
 
JavaLesBasespourles debutantset pour vous.pdf
JavaLesBasespourles debutantset pour vous.pdfJavaLesBasespourles debutantset pour vous.pdf
JavaLesBasespourles debutantset pour vous.pdfhindguendouz2000
 
Java 2015 2016_zied_elleuch
Java 2015 2016_zied_elleuchJava 2015 2016_zied_elleuch
Java 2015 2016_zied_elleuchTarek Halloul
 
Java & Etat de l'art
Java & Etat de l'artJava & Etat de l'art
Java & Etat de l'artInes Ouaz
 
présentation migration automatisee Pacbase -> UML + Java
présentation migration automatisee Pacbase -> UML + Javaprésentation migration automatisee Pacbase -> UML + Java
présentation migration automatisee Pacbase -> UML + JavaDidier Durand
 
Objet Direct Formation Java pour devenir autonome
Objet Direct Formation Java pour devenir autonomeObjet Direct Formation Java pour devenir autonome
Objet Direct Formation Java pour devenir autonomeformationobjetdirect
 
Responsible Design ou Le web moderne à destination de tous
Responsible Design ou Le web moderne à destination de tousResponsible Design ou Le web moderne à destination de tous
Responsible Design ou Le web moderne à destination de tousjwajsberg
 

Similaire à Introduction àJava (20)

Javaoop
JavaoopJavaoop
Javaoop
 
0251-formation-java-programmation-objet.pdf
0251-formation-java-programmation-objet.pdf0251-formation-java-programmation-objet.pdf
0251-formation-java-programmation-objet.pdf
 
JavaCours1.ppt
JavaCours1.pptJavaCours1.ppt
JavaCours1.ppt
 
Java uik-chap1-intro java
Java uik-chap1-intro javaJava uik-chap1-intro java
Java uik-chap1-intro java
 
Java vs .Net
Java vs .NetJava vs .Net
Java vs .Net
 
Java vs .Net
Java vs .NetJava vs .Net
Java vs .Net
 
Gwt oxiane-novae-lr
Gwt oxiane-novae-lrGwt oxiane-novae-lr
Gwt oxiane-novae-lr
 
Chap 02 poo en java
Chap 02 poo en javaChap 02 poo en java
Chap 02 poo en java
 
.Net pour le développeur Java - une source d'inspiration?
.Net pour le développeur Java - une source d'inspiration?.Net pour le développeur Java - une source d'inspiration?
.Net pour le développeur Java - une source d'inspiration?
 
JavaLesBasespourles debutantset pour vous.pdf
JavaLesBasespourles debutantset pour vous.pdfJavaLesBasespourles debutantset pour vous.pdf
JavaLesBasespourles debutantset pour vous.pdf
 
Java 2015 2016_zied_elleuch
Java 2015 2016_zied_elleuchJava 2015 2016_zied_elleuch
Java 2015 2016_zied_elleuch
 
Java & Etat de l'art
Java & Etat de l'artJava & Etat de l'art
Java & Etat de l'art
 
Base11
Base11Base11
Base11
 
présentation migration automatisee Pacbase -> UML + Java
présentation migration automatisee Pacbase -> UML + Javaprésentation migration automatisee Pacbase -> UML + Java
présentation migration automatisee Pacbase -> UML + Java
 
Tutoriel java
Tutoriel javaTutoriel java
Tutoriel java
 
Java Fx Rapport
Java Fx RapportJava Fx Rapport
Java Fx Rapport
 
Programmation sous Android
Programmation sous AndroidProgrammation sous Android
Programmation sous Android
 
Objet Direct Formation Java pour devenir autonome
Objet Direct Formation Java pour devenir autonomeObjet Direct Formation Java pour devenir autonome
Objet Direct Formation Java pour devenir autonome
 
Introduction à Java
Introduction à JavaIntroduction à Java
Introduction à Java
 
Responsible Design ou Le web moderne à destination de tous
Responsible Design ou Le web moderne à destination de tousResponsible Design ou Le web moderne à destination de tous
Responsible Design ou Le web moderne à destination de tous
 

Dernier

LA MONTÉE DE L'ÉDUCATION DANS LE MONDE DE LA PRÉHISTOIRE À L'ÈRE CONTEMPORAIN...
LA MONTÉE DE L'ÉDUCATION DANS LE MONDE DE LA PRÉHISTOIRE À L'ÈRE CONTEMPORAIN...LA MONTÉE DE L'ÉDUCATION DANS LE MONDE DE LA PRÉHISTOIRE À L'ÈRE CONTEMPORAIN...
LA MONTÉE DE L'ÉDUCATION DANS LE MONDE DE LA PRÉHISTOIRE À L'ÈRE CONTEMPORAIN...Faga1939
 
presentation sur la maladie de la dengue .pptx
presentation sur la maladie de la dengue .pptxpresentation sur la maladie de la dengue .pptx
presentation sur la maladie de la dengue .pptxNYTombaye
 
SciencesPo_Aix_InnovationPédagogique_Atelier_EtudiantActeur.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_EtudiantActeur.pdfSciencesPo_Aix_InnovationPédagogique_Atelier_EtudiantActeur.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_EtudiantActeur.pdfSKennel
 
SciencesPo_Aix_InnovationPédagogique_Atelier_FormationRecherche.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_FormationRecherche.pdfSciencesPo_Aix_InnovationPédagogique_Atelier_FormationRecherche.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_FormationRecherche.pdfSKennel
 
Cours SE Le système Linux : La ligne de commande bash - IG IPSET
Cours SE Le système Linux : La ligne de commande bash - IG IPSETCours SE Le système Linux : La ligne de commande bash - IG IPSET
Cours SE Le système Linux : La ligne de commande bash - IG IPSETMedBechir
 
Annie Ernaux Extérieurs. pptx. Exposition basée sur un livre .
Annie   Ernaux  Extérieurs. pptx. Exposition basée sur un livre .Annie   Ernaux  Extérieurs. pptx. Exposition basée sur un livre .
Annie Ernaux Extérieurs. pptx. Exposition basée sur un livre .Txaruka
 
Fondation Louis Vuitton. pptx
Fondation      Louis      Vuitton.   pptxFondation      Louis      Vuitton.   pptx
Fondation Louis Vuitton. pptxTxaruka
 
Présentation_ Didactique 1_SVT (S4) complet.pptx
Présentation_ Didactique 1_SVT (S4) complet.pptxPrésentation_ Didactique 1_SVT (S4) complet.pptx
Présentation_ Didactique 1_SVT (S4) complet.pptxrababouerdighi
 
Formation M2i - Comprendre les neurosciences pour développer son leadership
Formation M2i - Comprendre les neurosciences pour développer son leadershipFormation M2i - Comprendre les neurosciences pour développer son leadership
Formation M2i - Comprendre les neurosciences pour développer son leadershipM2i Formation
 
Le Lean sur une ligne de production : Formation et mise en application directe
Le Lean sur une ligne de production : Formation et mise en application directeLe Lean sur une ligne de production : Formation et mise en application directe
Le Lean sur une ligne de production : Formation et mise en application directeXL Groupe
 
Presentation de la plateforme Moodle - avril 2024
Presentation de la plateforme Moodle - avril 2024Presentation de la plateforme Moodle - avril 2024
Presentation de la plateforme Moodle - avril 2024Gilles Le Page
 
Evaluation du systeme d'Education. Marocpptx
Evaluation du systeme d'Education. MarocpptxEvaluation du systeme d'Education. Marocpptx
Evaluation du systeme d'Education. MarocpptxAsmaa105193
 
SciencesPo_Aix_InnovationPédagogique_Atelier_IA.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_IA.pdfSciencesPo_Aix_InnovationPédagogique_Atelier_IA.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_IA.pdfSKennel
 
le present des verbes reguliers -er.pptx
le present des verbes reguliers -er.pptxle present des verbes reguliers -er.pptx
le present des verbes reguliers -er.pptxmmatar2
 
SciencesPo_Aix_InnovationPédagogique_Bilan.pdf
SciencesPo_Aix_InnovationPédagogique_Bilan.pdfSciencesPo_Aix_InnovationPédagogique_Bilan.pdf
SciencesPo_Aix_InnovationPédagogique_Bilan.pdfSKennel
 
Saint Georges, martyr, et la lègend du dragon.pptx
Saint Georges, martyr, et la lègend du dragon.pptxSaint Georges, martyr, et la lègend du dragon.pptx
Saint Georges, martyr, et la lègend du dragon.pptxMartin M Flynn
 
Zotero avancé - support de formation doctorants SHS 2024
Zotero avancé - support de formation doctorants SHS 2024Zotero avancé - support de formation doctorants SHS 2024
Zotero avancé - support de formation doctorants SHS 2024Alain Marois
 
Principe de fonctionnement d'un moteur 4 temps
Principe de fonctionnement d'un moteur 4 tempsPrincipe de fonctionnement d'un moteur 4 temps
Principe de fonctionnement d'un moteur 4 tempsRajiAbdelghani
 

Dernier (20)

LA MONTÉE DE L'ÉDUCATION DANS LE MONDE DE LA PRÉHISTOIRE À L'ÈRE CONTEMPORAIN...
LA MONTÉE DE L'ÉDUCATION DANS LE MONDE DE LA PRÉHISTOIRE À L'ÈRE CONTEMPORAIN...LA MONTÉE DE L'ÉDUCATION DANS LE MONDE DE LA PRÉHISTOIRE À L'ÈRE CONTEMPORAIN...
LA MONTÉE DE L'ÉDUCATION DANS LE MONDE DE LA PRÉHISTOIRE À L'ÈRE CONTEMPORAIN...
 
presentation sur la maladie de la dengue .pptx
presentation sur la maladie de la dengue .pptxpresentation sur la maladie de la dengue .pptx
presentation sur la maladie de la dengue .pptx
 
SciencesPo_Aix_InnovationPédagogique_Atelier_EtudiantActeur.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_EtudiantActeur.pdfSciencesPo_Aix_InnovationPédagogique_Atelier_EtudiantActeur.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_EtudiantActeur.pdf
 
SciencesPo_Aix_InnovationPédagogique_Atelier_FormationRecherche.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_FormationRecherche.pdfSciencesPo_Aix_InnovationPédagogique_Atelier_FormationRecherche.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_FormationRecherche.pdf
 
Cours SE Le système Linux : La ligne de commande bash - IG IPSET
Cours SE Le système Linux : La ligne de commande bash - IG IPSETCours SE Le système Linux : La ligne de commande bash - IG IPSET
Cours SE Le système Linux : La ligne de commande bash - IG IPSET
 
Annie Ernaux Extérieurs. pptx. Exposition basée sur un livre .
Annie   Ernaux  Extérieurs. pptx. Exposition basée sur un livre .Annie   Ernaux  Extérieurs. pptx. Exposition basée sur un livre .
Annie Ernaux Extérieurs. pptx. Exposition basée sur un livre .
 
Pâques de Sainte Marie-Euphrasie Pelletier
Pâques de Sainte Marie-Euphrasie PelletierPâques de Sainte Marie-Euphrasie Pelletier
Pâques de Sainte Marie-Euphrasie Pelletier
 
Fondation Louis Vuitton. pptx
Fondation      Louis      Vuitton.   pptxFondation      Louis      Vuitton.   pptx
Fondation Louis Vuitton. pptx
 
Présentation_ Didactique 1_SVT (S4) complet.pptx
Présentation_ Didactique 1_SVT (S4) complet.pptxPrésentation_ Didactique 1_SVT (S4) complet.pptx
Présentation_ Didactique 1_SVT (S4) complet.pptx
 
Formation M2i - Comprendre les neurosciences pour développer son leadership
Formation M2i - Comprendre les neurosciences pour développer son leadershipFormation M2i - Comprendre les neurosciences pour développer son leadership
Formation M2i - Comprendre les neurosciences pour développer son leadership
 
Le Lean sur une ligne de production : Formation et mise en application directe
Le Lean sur une ligne de production : Formation et mise en application directeLe Lean sur une ligne de production : Formation et mise en application directe
Le Lean sur une ligne de production : Formation et mise en application directe
 
DO PALÁCIO À ASSEMBLEIA .
DO PALÁCIO À ASSEMBLEIA                 .DO PALÁCIO À ASSEMBLEIA                 .
DO PALÁCIO À ASSEMBLEIA .
 
Presentation de la plateforme Moodle - avril 2024
Presentation de la plateforme Moodle - avril 2024Presentation de la plateforme Moodle - avril 2024
Presentation de la plateforme Moodle - avril 2024
 
Evaluation du systeme d'Education. Marocpptx
Evaluation du systeme d'Education. MarocpptxEvaluation du systeme d'Education. Marocpptx
Evaluation du systeme d'Education. Marocpptx
 
SciencesPo_Aix_InnovationPédagogique_Atelier_IA.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_IA.pdfSciencesPo_Aix_InnovationPédagogique_Atelier_IA.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_IA.pdf
 
le present des verbes reguliers -er.pptx
le present des verbes reguliers -er.pptxle present des verbes reguliers -er.pptx
le present des verbes reguliers -er.pptx
 
SciencesPo_Aix_InnovationPédagogique_Bilan.pdf
SciencesPo_Aix_InnovationPédagogique_Bilan.pdfSciencesPo_Aix_InnovationPédagogique_Bilan.pdf
SciencesPo_Aix_InnovationPédagogique_Bilan.pdf
 
Saint Georges, martyr, et la lègend du dragon.pptx
Saint Georges, martyr, et la lègend du dragon.pptxSaint Georges, martyr, et la lègend du dragon.pptx
Saint Georges, martyr, et la lègend du dragon.pptx
 
Zotero avancé - support de formation doctorants SHS 2024
Zotero avancé - support de formation doctorants SHS 2024Zotero avancé - support de formation doctorants SHS 2024
Zotero avancé - support de formation doctorants SHS 2024
 
Principe de fonctionnement d'un moteur 4 temps
Principe de fonctionnement d'un moteur 4 tempsPrincipe de fonctionnement d'un moteur 4 temps
Principe de fonctionnement d'un moteur 4 temps
 

Introduction àJava

  • 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. 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
  • 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. 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. 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. 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. 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. 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. 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. 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. 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
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. L’API de Java (6) 31
  • 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. 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. 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. 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. 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. Syntaxe du langage Java : les bases
  • 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. 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. 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. 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. 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. 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
  • 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. Compilation et exécution (5) Compilation Exécution 47
  • 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. 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. 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. 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. 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. 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. 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. 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. Les types de base et les opérateurs
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. Les structures de contrôle (I)
  • 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. 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. if / else (2) fausse (sinon) condition Série 2 d’actions vraie (alors) Série 1 d’actions 90
  • 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. 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. 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. while (3) fausse while () { ...} condition vraie Instructions 94
  • 95. while (4) Instructions do { ...}while (); vraie condition fausse 95
  • 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. 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. 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. 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. 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. 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. 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. 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
  • 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. 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. 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. Les chaînes de caractères
  • 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. 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. 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. 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. 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. 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. 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. 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. La classe String (7) Plus d’informations dans les documentations de l’API dans le package java.lang 117
  • 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
  • 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. 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. 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
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. Les bases de la programmation objet en Java
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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