• Aucun résultat trouvé

2.1.2 Premier en Java . . . 186 2.2 Types Primitifs . . . 188 2.2.1 Conversions de type . . . 188 2.2.2 Exemple de conversions . . . 189 2.2.3 Tableaux . . . 189 2.2.4 Exemple avec un tableau . . . 190 2.3 Tableaux . . . 190 2.4 Méthodes . . . 191 2.5 Exemple de passage d’arguments . . . 192 Questions sur la syntaxe de base de Java . . . 192

3 Classes et objets en Java 194

3.1 Classe . . . 194 3.1.1 Classe Personne en Java . . . 194 3.1.2 Instance de classe en UML . . . 196 3.1.3 Instance de classe en Java . . . 196 3.2 Objet . . . 197 3.2.1 Constructeurs en Java . . . 197 3.2.2 Exemples de constructeurs . . . 198 3.2.3 this . . . 198 3.2.4 Exemples d’utilisation de this . . . 198 3.2.5 Destruction des objets . . . 199 3.2.6 Abstraction et encapsulation . . . 200 3.2.7 Visibilité des méthodes . . . 200 3.3 Attributs et méthodes de classe . . . 201 3.3.1 Attributs et méthodes de classe Java . . . 201 3.3.2 Attributs et méthodes de classe . . . 202 3.4 Association entre classes . . . 203 3.4.1 Exemple d’association . . . 203 3.4.2 Association entre classes en Java . . . 204

Introduction au langage de programmation Java

Questions sur les classes et objet . . . 205

4 Généralisation spécialisation en Java 206

4.1 Généralisation spécialisation . . . 206 4.1.1 Héritage : comment en Java . . . 207 4.1.2 Héritage et constructeur . . . 207 4.1.3 Exemple de classe parente et classe dérivée . . . 208 4.1.4 Utilisation de classe parente et dérivée . . . 209 4.2 Polymorphisme . . . 210 4.2.1 Exemple de Upcast et Downcast . . . 211 4.3 Redéfinition de méthodes dans les classes dérivées . . . 212 4.3.1 Polymorphisme et liaison dynamique avec toString . . . 212 4.4 Héritage, membres et visibilité . . . 213 Questions généralisation/spécialisation en Java . . . 213 4.5 Classes abstraites . . . 214 4.5.1 Classes abstraites : principes . . . 214 4.5.2 Classes abstraites en Java . . . 215 4.6 Exemple de classe Abstraites . . . 215 4.6.1 Exemple : classes abstraites . . . 216 4.7 Interfaces . . . 218 4.7.1 Interfaces en Java . . . 218

5 Organisation des sources Java 220

5.1 Programme en C (rappel) . . . 220 5.2 Exécution d’un programme (rappel) . . . 220 5.3 Exécution d’un programme sur une machine virtuelle . . . 221 5.4 Dans le cas de Java . . . 222 5.5 Unités de compilation . . . 222 5.6 Paquetages . . . 223 5.6.1 Chemin de recherche . . . 224 5.6.2 Exemple . . . 224 5.7 Visibilité en Java . . . 224 5.7.1 Table de visibilité . . . 225 Questions organisation des sources en Java . . . 226

6 API Java 227

6.1 Premières classes de l’API . . . 227 6.2 Classe java.lang.Object . . . 227 6.2.1 Égalité . . . 229 6.2.2 Exemple d’égalité . . . 229 6.2.3 Exemple de méthode equals . . . 230 6.3 Interface de programmation . . . 231 6.3.1 Quelques paquetages Java . . . 231 6.4 java.lang.* . . . 232 6.4.1 Exemple avec la classe Integer . . . 233 6.4.2 Classe String . . . 233 6.4.3 Exemple pour String . . . 233 Questions API java.lang . . . 234 6.5 java.util.* . . . 234 6.5.1 Classe paramétrée . . . 235 6.5.2 Classes Abstraites des collections . . . 236 6.5.3 Classes instanciables des collections . . . 237 6.5.4 Collections . . . 237 6.5.5 Interface Iterable . . . 238 6.5.6 Interface Collection<E> . . . 238 6.5.7 Interface List<E> . . . 239 6.5.8 Classe Vector<E> . . . 239

Introduction au langage de programmation Java

6.5.9 Boucle pour les collections . . . 240 6.5.10 Exemple for-each sur un Vector . . . 241 6.5.11 Exemple de classe avec Vector . . . 241 6.5.12 Interface Iterator . . . 242 6.5.13 Exemple avec Iterator . . . 243 6.5.14 Dictionnaires Map<K,V> . . . 244 6.5.15 Exemple pour Map . . . 244 6.5.16 Dictionnaire Hashtable<K,V> . . . 245 6.5.17 Exemple pour Hashtable . . . 246 6.5.18 Représentation d’une Hashtable . . . 246 Questions collections en Java . . . 247

7 Exceptions en Java 248

7.1 Motivation : retours sur un bug . . . 248 7.2 Principes . . . 249 7.2.1 Mise en œuvre . . . 250 7.2.2 Exemple de traitement . . . 250 7.3 Réalisation . . . 251 7.3.1 java.lang.Exception . . . 251 7.4 Traitement des exceptions . . . 252 7.5 Exemple de traitement d’exceptions . . . 253 Questions sur les exceptions . . . 254

8 Concepts objets avancés en Java 256

8.1 Copie simple/légère . . . 256 8.1.1 Copie pour studs . . . 257 8.1.2 Représentation graphique d’une copie légère dans studs . . . 257 8.1.3 Exemple de copie légère . . . 257 8.1.4 Représentation graphique d’une copie plus profonde dans studs . . . 259 8.1.5 Copie plus profonde dans studs . . . 259 8.1.6 Représentation graphique d’une copie profonde . . . 261 8.1.7 Clone de Scrutin . . . 262 8.1.8 Clone en copie profonde de Personne . . . 263 8.1.9 Suite exemple de copie profonde . . . 264 8.2 Retour sur hashCode() . . . 265 8.2.1 Exemple hashCode . . . 266 8.3 Retour sur les exceptions . . . 266 8.3.1 Test des exceptions . . . 267 8.3.2 RuntimeException . . . 269

Bibliographie 271

Introduction au langage de programmation Java # 2 ' & $ %

Sommaire du cours

1 Introduction à Java . . . 5 2 Concepts de bases de Java . . . 23 3 Classes et objets en Java . . . 38 4 Généralisation spécialisation en Java . . . 59 5 Organisation des sources Java . . . 85 6 API Java . . . 97 7 Exceptions en Java . . . 131 8 Concepts objets avancés en Java. . . .143

La structure du cours est la suivante :

1. généralités sur le langage et présentation de la machine virtuelle Java, 2. syntaxe de base et types primitifs,

3. classes et objets, associations entre objets, 4. généralisation et spécialisation entre classes, 5. organisation des fichiers sources et compilés, 6. classes Java indispensables de la bibliothèque, 7. types paramétriques et collections,

8. gestion des exceptions,

9. concepts avancés de Java : interface, copie d’objet.

1 Introduction à Java 1.1 Vous avez dit Java ? # 3 ' & $ %

1 Introduction à Java

1.1 Vous avez dit Java ? . . . 5 1.2 Que recouvre le mot Java ? . . . 9 1.3 Caractéristiques . . . 12 1.4 Historique de l’API . . . 16 1.5 Environnements de développement . . . 18 1.6 En savoir plus . . . 19

Cette section présente les concepts généraux du langage Java. Ces concepts sont souvent partagés par les langages postérieurs aux années 1990. Cette introduction mélange la culture générale et les spécificités techniques. Les grandes lignes de cette section sont proches de la page wikipedia sur Java.

# 4

'

&

$

%

1.1 Vous avez dit Java ?

 À quoi cela sert-il ?  Pourquoi nous ?

1 Introduction à Java 1.1 Vous avez dit Java ? # 5 ' & $ %

1.1.1 Android

 Android : Java est le logiciel prépondérant des + 500 000 applications.

# 6 ' & $ %

1.1.2 CAS

Introduction au langage de programmation Java 1 Introduction à Java # 7 ' & $ %

1.1.3 Java partout !

# 8 ' & $ %

1.1.4 Pourquoi nous ?

1 Introduction à Java 1.2 Que recouvre le mot Java ? # 9 ' & $ %

1.2 Que recouvre le mot Java ?

 Un projet et des évolutions sur + de 20 ans  Un langage objet

 Une architecture basée sur une machine virtuelle  Des interfaces de programmation objet

 Des outils (Java Development Kit)

Nous détaillons chacun de ces points dans les diapositives suivantes.

# 10 ' & $ %

1.2.1 Héros

Introduction au langage de programmation Java 1 Introduction à Java # 11 ' & $ %

1.2.2 Projet et Historique

 1990 : équipe autour de James Gosling et sous l’impulsion de Bill Joy  1993 : projet de langage pour l’électronique grand public

 1995 : Java Development Kit (JDK) 1.0 b1 + support dans le navigateur Netscape  1998 : mise en place du Java Community Process

 1999 : Java 2 Standard Edition (J2SE) 1.2 (Java DataBase Connector amélioré, interface graphique Swing, collections)

 2005 : J2SE 1.5, alors renommé J2SE 5 (types paramétrés, annotations, collections revues)

 2006-2007 : J2SE6 et libération du code passage sous licence General Public License, alias GNU/GPL

 2009 : rachat de SUN microsystems par ORACLE  2011 : J2SE 7

L’historique de Java est décrit à la page http://www.oracle.com/technetwork/java/javase/overview/javahistory-index-198355.html. C’est un projet qui débute dans la première moitié de la décennie 1990. À l’époque, SUN travaille sur

l’informatique répartie et a réalisé un système d’exploitation appelé NEXT (Unix sur un ensemble de stations de travail). Le PC d’IBM et Microsoft est encore absent du paysage pour eux. Les objectifs de l’équipe sont principalement de pallier les difficultés à programmer en langage C++, tout en conservant une compatibilité avec la syntaxe de base connue des programmeurs C.

Les membres du projet ciblent le support de petites machines de type assistant personnel, ou consoles de jeux. Les événements suivants sont importants dans cet historique :

• le navigateur Web de la société Netscape supporte Java dès 1995.

• la constitution du Java Community Process (JCP) en 1998. Cette constitution répond à la nécessité de standardiser le langage par un processus ouvert comparable à celui des standards Internet. Ce processus est indispensable pour le langage apparaisse indépendant de la compagnie .

• les versions J2SE se succèdent à peu près tous les deux ans, par des ajouts de classes et de fonctionnalités décidées selon le JCP.

• Fin 2006 et courant 2007, SUN entreprend d’expurger son code de toute partie pouvant poser problème en matière de propriété intellectuelle et place le code obtenu sous licence GNU/GPL ;

• en 2009, Oracle rachète SUN, ce qui questionne les communautés libres sur l’avenir de Java mais aussi sur celui de MySQL dont SUN était propriétaire par le rachat de la compagnie MySQL AB en 2008.

1 Introduction à Java 1.3 Caractéristiques # 12 ' & $ %

1.3 Caractéristiques

 Objet

 Exécuté par une machine virtuelle

 Permettant d’écrire des programmes robustes  Simple : C comme syntaxe de base

 Sûr, multi-activité, réparti

Nous détaillons certains de ces points dans les diapositives suivantes. Nous ne traitons pas des parties sûreté, multi-activité et répartition. Ces sujets sont, en effet, trop avancés pour ce cours. Certains sont abordés en troisième année dans les VAP ASR (« Applications et Services informatiques Répartis ») ou SSR (« Sécurité des Systèmes et des Réseaux »).

# 13

'

&

$

%

1.3.1 Java un langage Objet

 Tout est classe sauf les types primitifs (int, float, double, etc.)  Tout objet est manipulé à travers une référence

 La spécialisation est simple entre les classes  Toutes les classes dérivent de java.lang.Object

 Les tableaux sont construits à partir d’une classe particulière

 L’API (en anglais, Application Programming Interface) est un ensemble de classes

Java est un langage orienté objet. La notion de classe est centrale dans ce langage et tout le code est contenu dans des classes.

Seules les variables de type primitif ne sont pas des objets. Les types primitifs correspondent aux types du langage C. Ces types primitifs servent à créer des variables locales dans les méthodes et des attributs pour les classes.

Les objets ne sont pas manipulés directement mais à travers des pointeurs dé-référencés de manière automatique et appelés références. Nous présentons l’implication de cette propriété relativement aux égalités

1 Introduction à Java 1.3 Caractéristiques et aux copies d’objets dans la section 6.2.1.

Comme tous les langages orientés objet, Java supporte la généralisation spécialisation. Pour simplifier la réalisation, Java ne permet que la généralisation spécialisation simple, c’est-à-dire qu’une classe dérive d’une classe et d’une seule.

Toutes les classes dérivent d’une classe racine appelée java.lang.Object. Cette classe définit des com- portements stéréotypés dont nous reparlons de manière approfondie dans le section 6.2.

Les tableaux sont des objets traités de manière particulière. Ils sont construits à partir d’une classe qui est manipulée par l’environnement de programmation.

L’ensemble des bibliothèques de fonctions est réalisé à base de classes.

# 14

'

&

$

%

1.3.2 Machine Virtuelle Java

 Les compilateurs génèrent du code intermédiaire (en anglais, bytecode)  Ce code intermédiaire est interprété par les « Java Virtual Machines » (JVM)  Modèle « compile once execute everywhere »

 Java Virtual Machine (JVM) :

 s’exécutent sur les systèmes d’exploitation (par exemple avec la commande java)  ou sont intégrées dans les navigateurs Web

 Sémantique du langage plus stricte que celle du langage C

 Taille et domaine de valeur des types primitifs identiques sur toutes les plate-formes  Code source Unicode (accents et autres glyphes)

 Bibliothèques standards riches

La portabilité du code Java a toujours été un objectif pour ses concepteurs. Cette portabilité n’a pas toujours été parfaite mais elle est bien plus grande que celle des langages des générations précédentes.

Contrairement à une chaîne de compilation de langage C qui génère du code directement exécutable sur un processeur, un compilateur Java génère du code intermédiaire appelé en anglais bytecode. Ce code est contenu dans un fichier dont le suffixe est .class. Un fichier .class peut être chargé par une machine virtuelle Java et interprété par celle-ci. Le code intermédiaire est totalement indépendant de la machine sur laquelle il a été généré. Il est aussi indépendant du compilateur qui l’a produit. Ce code permet de recréer le fichier source facilement. Le modèle de compilation est appelé en anglais « compile once, execute everywhere ».

Les tailles et les domaines de valeur des types primitifs sont identiques sur toutes les plates-formes. Ainsi, quelle que soit l’architecture matérielle sur laquelle le programme s’exécute, un entier utilisé par un programme Java possède une taille identique. Le principe du bytecode date des années 1980 avec son introduction dans certains compilateurs du langage Pascal. Il se retrouve aussi aujourd’hui dans l’ensemble de la chaîne de compilation de Microsoft associée aux langages C et C#.

Les JVM s’exécutent directement sur les systèmes d’exploitation. C’est par exemple la commande java sous Linux. Elles peuvent être embarquées dans les navigateurs Web.

La sémantique du langage Java est plus contraignante que celle du langage C. Par exemple, il est obligatoire d’avoir une expression booléenne dans un test.

Le code source des classes peut être écrit en caractères Unicode. La collaboration entre développeurs préconise l’utilisation de variables dont le nom est compréhensible par le plus grand nombre.

Comme nous le verrons dans la section 6, les bibliothèques standards sont très nombreuses.

Introduction au langage de programmation Java 1 Introduction à Java # 15 ' & $ %

1.3.3 Robustesse

 Conçu pour du logiciel embarqué

 Gestion de la mémoire avec ramasse miettes (en anglais, garbage collector )  Pas d’accès à la mémoire physique

 Gestion des erreurs par exception (voir section 7)  Contrôle des types à l’exécution

 Compilateurs stricts et prévenants par exemple :

 Avertissement lorsqu’une variable est affectée et non utilisée  Erreur à l’utilisation de variables non initialisées

 Erreur lorsque les exceptions ne sont pas gérées

Le langage Java permet de réaliser des programmes robustes. Il a été conçu pour réaliser des logiciels embarqués. Il tend à pallier les difficultés dues à la gestion de la mémoire en C ou C++. Pour cela, le langage est doté d’un ramasse miettes. Les allocations d’objets sont dynamiques et la récupération de l’espace mémoire inutilisé est réalisée par ce ramasse miettes (Garbage Collector ou GC). Les langages modernes sont dotés de ramasse miettes. Le GC est déclenché lorsque la mémoire disponible de la JVM est faible ou périodiquement. Le GC est un processus qui consomme du temps et il doit être contrôlable pour permettre des applications de type temps réel. Contrairement au langage C, il n’est pas possible d’adresser directement une zone mémoire physique à partir d’un programme Java.

Comme nous le verrons dans la section 7, la gestion des erreurs est réalisée en utilisant un mécanisme qui permet de signaler l’erreur en un point du programme et de traiter cette erreur en un autre point. Le flot de contrôle des erreurs est matérialisé par des instructions de contrôle particulières que nous présentons dans la section 7.

Il n’existe pas d’équivalent à l’édition de liens pour produire un binaire exécutable. En Java, un programme est composé d’un ensemble de fichiers de bytecode interprétables par la JVM. La JVM charge ces fichiers, que l’on appelle aussi classes, à partir de leurs noms comme nous le décrirons dans la section 5.6. La JVM réalise des contrôles de type au même titre que le compilateur lorsqu’elle charge une classe. Les classes peuvent aussi être télé-chargées. Dans ce cas, elles sont vérifiées à partir d’une chaîne de certification. Les classes télé-chargées sont exécutées dans un environnement limité. Par exemple, elles ne peuvent pas accéder au système de fichiers.

Le compilateur Java est plus strict qu’un compilateur C. Par exemple, il n’autorise pas l’utilisation d’une variable si elle n’a pas été explicitement initialisée. Il émet des avertissements si une variable est affectée mais non utilisée. Il interdit aussi que les exceptions ne soient pas traitées.

1 Introduction à Java 1.5 Environnements de développement # 16 ' & $ %

1.4 Historique de l’API

 Années de réalisation, et nombre de classes et d’interfaces des versions de Java  Java SE 7 2011 : 3 977  Java SE 6 2007 : 3 777  J2SE 5.0 2004 : 3 270  J2SE 1.4 2002 : 2 723  J2SE 1.3 2000 : 1 840  J2SE 1.2 1998 : 1 524  JDK 1.1 1997 : 477  JDK 1.0 1996 : 211

Outre les évolutions du langage, les bibliothèques de programmation associées à Java ont crû de manière impressionnante, passant de 211 classes et interfaces dans la première version stable à presque 4000 dans la version actuelle.

Nous verrons de ces bibliothèques quelques classes indispensables et dont les caractéristiques stéréotypées vous permettront d’aborder d’autres bibliothèques si le besoin se présente.

# 17 ' & $ %

1.5 Environnements de développement

 Java Development Kit : compilateur, JVM, Appletviewer...  Eclipse, NetBeans, Jbuilder, Visual J++...

Les environnements de programmation permettant de programmer en Java sont nombreux. Nous utilise- rons pendant les travaux pratiques le JDK et l’environnement eclipse. L’utilisation du JDK nous permet de matérialiser l’étape de compilation du bytecode puis l’exécution dans l’environnement de la machine virtuelle.

Introduction au langage de programmation Java 1 Introduction à Java # 18 ' & $ %

1.5.1 Java Standard Development Kit

 javac : compilateur

 java : JVM interpréteur de bytecode  javadoc : générateur de documentation  appletviewer : environnement pour applet

 javah : générateur d’entêtes pour mélange avec code natif en C (JNI)  javap : désassembleur de code intermédiaire

 jdb : dévermineur

 javakey : générateur de clés pour signer le code

Le JDK permet de matérialiser les différentes parties de la chaîne de production utilisée dans le dévelop- pement d’un programme Java.

Ainsi, il est nécessaire de traduire les fichiers contenant du langage Java en des fichiers contenant du bytecode. C’est le rôle du compilateur (javac).

La commande java est la machine virtuelle dans laquelle le bytecode peut s’exécuter.

La commande javadoc permet d’extraire la documentation du code pour réaliser des pages semblables à celles de la documentation des bibliothèques.

La commande appletviewer permet d’exécuter du code destiné à être interprété dans un navigateur Web. Ce type de code est appelé applet.

# 19 ' & $ %

1.6 En savoir plus

 Java Series : http://docs.oracle.com/javase//

 The Java Tutorial, Campione, Walrath, 5th edition, 2013,

 The Java Programming Language, Arnold, Gosling, Holmes, 5th edition, 2013,  The Java Language Specification, J. Gosling, B. Joy, G. Steele, G. Bracha, A.

Bukley, 4th edition, 2013,

 The Java Virtual Machine Specification, T. Lindholm, F. Yellin, G. Bracha, A. Bukley, 3rd edition, 2013

 Livres

 D. Flanagan, « Java in a Nutshell : A Desktop Quick Reference, 5th Edition », O’Reilly, 2005

 D. Flanagan, « Java Examples in a nutshell : A Tutorial Companion to Java in a Nutshell », 3rd Edition, 2004

 P. Niemeyer and J. Knudsen, « Learning Java », O’Reilly, 2005  J. Bloch, « Effective Java, 2nd Edition », Addison Wesley, 2008

Les documents du site d’Oracle sont les références écrites par les auteurs du langage ou des personnes de leur équipe. Ils sont accessibles et nous vous recommandons de les consulter pour répondre à vos questions

Introduction au langage de programmation Java 1 Introduction à Java plutôt que de naviguer dans un océan de questions-réponses plus ou moins appropriées via les moteurs de recherche.

Nous pensons aussi que le tutoriel en ligne est bien fait et qu’il mérite que vous y passiez du temps en complément de ce cours. À cette fin nous avons mis ce tutoriel en accès local sur l’URL suivant : http://www-inf.int-evry.fr/cours/java/javatutorial/

Les livres sont les préférés des différents membres de l’équipe pédagogique.

# 20 ' & $ %

1.6.1 Sites Web

 http://moodle.tem-tsp.eu/moodle/view.php?id=26  http://www-inf.it-sudparis.eu/COURS/CSC4002/  http://http://www.oracle.com/technetwork/java/index.html: Oracle Java(tm) Technology Home Page

 http://www.javaworld.com: Infos

 http://www.developer.com/java: Infos Liens

Voici les sites Webs qui vous permettront de gagner du temps dans votre apprentissage.

Les deux premiers représentent les liens vers les ressources pédagogiques propres à ce cours. Les autres sont des points d’entrée vers des sites riches en informations et en exemples de programmes en Java.

# 21

'

&

$

%

Questions sur les concepts Java

 En Java tout est-il objet ?  La machine virtuelle Java :

 garantit-elle l’uniformité des variables de type primitif ?

 met-elle en œuvre la gestion mémoire et en particulier le ramasse miettes ?

Introduction au langage de programmation Java 2 Concepts de bases de Java # 22 ' & $ %

2 Concepts de bases de Java

2.1 Syntaxe de base . . . 23

2.2 Types Primitifs . . . 28

2.3 Tableaux . . . 32

2.4 Méthodes . . . 33

2.5 Exemple de passage d’arguments . . . 35

Cette partie se concentre sur les bases du langage Java. Nous supposons que vous connais- sez le langage C. Dans cette partie, nous focalisons notre attention sur les concepts nou- veaux et les différences relativement à ce langage connu. Cette partie permet de traduire les algorithmes. La partie 1 « Bien commencer en Java » du site du zéro sur Java (http:http://fr.openclassrooms.com/informatique/cours/apprenez-a-programmer-en-java) corres- pond aux notions que nous présentons ici. Son parcours est recommandé à ceux qui n’ont pas programmé depuis longtemps. # 23 ' & $ %

2.1 Syntaxe de base

 Syntaxe de base C

 Instructions de contrôle : if, switch, for, while, do while  Opérateurs : tous les opérateurs du C par exemple, + - / * %,  Blocs, instructions simples : {}, « ; »

 Quelques différences  final remplace const

 espaces de nommage plus nombreux : classe, fichier, groupe de classes  private remplace static

 static prend un sens associé au concept de classe

La syntaxe de base du langage est inspirée de celle du langage C. L’ensemble des instructions de contrôle

Documents relatifs