TD Java 1
TD Java 1
TD Java 1
L'objectif de ce TD est d'écrire quelques programmes simples pour se familiariser avec le langage Java.
Le travail de compilation / exécution se fera en mode commande, e.g. Terminal de Linux / MacOS, ou
cmd de Windows .
1. AVANT PROPOS
L'élève est censé(e) savoir comment créer un répertoire (commandes md ou mkdir , cd , etc.) et son
équivalent graphique (créer / ouvrir un nouveau dossier etc.), lister son contenu (commande dir ou
ls ), savoir utiliser un éditeur de texte pour créer un programme et sauvegarder un programme source
sous un répertoire donné. On doit aussi connaître les commandes de base Unix (Linux ou MacOS) et
Windows ( cat , type , more etc.)
2. SOMMAIRE
1. Avant propos
2. Sommaire
3. Installation de Java et préparation du travail.
4. Compilation exécution d'un programme Java
1. Programme hello world
5. E/S de données élémentaires (classe scanner)
1. Lecture d'un simple entier avec la classe Java scanner.
2. Lecture de plusieurs données.
3. Lecture d'un caractère.
6. Programme avec traitement et usage de fonctions
7. Surcharge de fonctions
1. Méthodes à nombre variable de paramètres
8. Quelques classes de bibliothèque
1. La Classe Math du package lang.
2. La Classe Calendar du package util.
9. Les Wrappers.
10. Objets vs Valeurs
11. Passage des paramètres en Java
12. Evaluation
13. Annexe: Préparation du TP sur PC.
Sous MacOS ou Linux, Java est généralement déjà fourni. (le vérifier en tapant javac -version . On
devrait voir javac 1.8.0_121 ou une version supérieure). Sous Windows, voir l'annexe: Préparation
du TP sur PC
https://www.emi.ma/ntounsi/COURS/Java/TD/tdJava1.html 1 of 14
Travaux dirigés Java, séance n° 1
NB. Créer un nouveau fichier d'extension .java pour chaque programme. Utiliser un éditeur de texte
courant. Aide à la présentation syntaxique. Par exemple, Sublime (https://www.sublimetext.com/3).
1 class HelloWorld {
2 static public void main(String args[]){
3 System.out.println("Hello, World");
4 }
5 };
6
Compiler par: javac HelloWorld.java
Exécuter par: java HelloWorld
Constater la création du ficher HelloWorld.class résultat de la compilation. Commandes ls ou
dir.
Noter surtout que le nom du fichier d'extension . class vient du nom de la classe (première ligne).
Remarque : Le fichier source .java ici a le même nom que la classe contenant la fonction main(), i.e.
l'identificateur qui suit le mot class dans le code source. Le nom du fichier .class généré pour cette
classe est cet identificateur justement.
Exercice: rajouter d'autres lignes pour imprimer "bonjour" en d'autres langues (e.g. "Bonjour, ça va?",
")"ﺳﻼم.
Petite remarque ici si vous êtes sous Windows en mode ligne commande :
1 class Hello2 {
2 static public void main(String args[]){
3 if (args.length !=0)
4 System.out.println("Hello " + args[0]);
5 }
6 }
7
Exécuter avec : java Hello2 Fatima
A noter: Le mot Fatima constitue le premier élément args[0] du tableau args[] , paramètre de la
fonction main.
Le champ length donne la taille d'un tableau en Java.
https://www.emi.ma/ntounsi/COURS/Java/TD/tdJava1.html 2 of 14
Travaux dirigés Java, séance n° 1
new Scanner(System.in);
La méthode nextInt() permet de lire un entier. Pour lire un réel, nextFloat() ou nextDouble() .
Pour les chaînes nextLine() pour lire une ligne ou next() pour une chaîne, etc. (exercice: vérifier ces
méthodes). Il n'y a pas nextChar() !
Note : Avec scanner on instancie normalement un objet à partir d'un fichier texte qui contient des données, e.g.
new Scanner(new File("monFichier.data")); Il faut alors utiliser l'exception FileNotFoundException pour la
classe File .
https://www.emi.ma/ntounsi/COURS/Java/TD/tdJava1.html 3 of 14
Travaux dirigés Java, séance n° 1
On lit une chaîne avec next() , et on prend son premier caractère avec charAt(0) .
1 import java.util.Scanner;
2 class monChar {
3 static public void main(String args[]) {
4 char monChar;
5 Scanner clavier = new Scanner(System.in);
6 String s = clavier.next();
7 monChar = s.charAt(0);
8 System.out.println(monChar);
9 }
10 }
11
On peut condenser et écrire :
monChar = clavier.next().charAt(0);
Conversion d'une température donnée en degré Celsius, vers une température en degré Fahrenait.
a . Sur le même modèle que le programme précédent, créer un programme Java (fichier Celsius.java )
1 class Celsius {
2 public static void main(String args[]){
3 ...
4 }
5 }
6
qui effectue cette conversion. Utiliser la formule:
https://www.emi.ma/ntounsi/COURS/Java/TD/tdJava1.html 4 of 14
Travaux dirigés Java, séance n° 1
f = 9./5 * c + 32
NB. Pour que la division 9/5 s'effectue en réel, utiliser 9. au lieu 9 dans le source Java.
Dans le source Celsius.java . ajouter maintenant la fonction (on dit aussi méthode):
f = 9./5 * c + 32;
par
f = c2f (c) ;
c . Version 3: Mettre maintenant la fonction c2f() ci-dessus dans une nouvelle classe que l'on
appellera Celc .
1 class Celc {
2 static double c2f(int c){
3 double f = 9./5 * c + 32;
4 return f;
5 }
6 };
7
(à ajouter après l' }; de fin de classe Celsius dans le même fichier source).
f = c2f (c) ;
par
f = Celc.c2f (c) ;
d . Version 4: (Ne pas imiter cet exemple.) Maintenant, enlever le mot static dans le profile de la
fonction c2f() de la classe Celc
( double c2f(int c) au lieu de static double c2f (int c) )
par
f = obj.c2f (c) ;
https://www.emi.ma/ntounsi/COURS/Java/TD/tdJava1.html 5 of 14
Travaux dirigés Java, séance n° 1
A Noter: Dans ce dernier cas, on doit d'abord instancier un objet obj de la classe Celc pour pouvoir
appeler (donc lui appliquer) la fonction c2f(), dite m é t h o d e d ' i n s t a n c e dans ce cas. Mais comme, il n'y
a pas de données propres à chaque objet de cette classe Celc, il n'y a pas besoin d'instancier un objet
pour utiliser la méthode c2f(). C'est pour cette raison qu'on peut la déclarer static. Comme cela on
l'appelle sans instancier d'objets. On dit m é t h o d e d e c l a s s e dans ce cas.
Remarque: Noter aussi qu'on pourrait, dans le premier cas, instancier plusieurs objets obj1, obj2, ... de
classe Celc. L'appel objn.c2f (c) serait indifférent de l'objet auquel il s'applique. Ce qui explique
pourquoi il y a des fonctions static et justifie la méthode de classe dans la Version-3 ci-dessus.
7. SURCHARGE DE FONCTIONS
En principe, une méthode a un nom unique dans une classe. Cependant Java permet à une méthode
d'avoir le même nom que d'autres grâce au mécanisme de surcharge (ang. overload). Java utilise leur
signature pour distinguer entre les différentes méthodes ayant le même nom dans une classe, c'est à
dire la liste des paramètres. Ce sont le nombre et le type des paramètres qui permet de distinguer.
1 class DataArtist {
2 static void draw(String s) {
3 System.out.println("Ceci est une chaîne: "+s);
4 }
5 static void draw(int i) {
6 System.out.println("Ceci est un entier: "+i);
7 }
8 static void draw(double f) {
9 System.out.println("Maintenant un double: "+f);
10 }
11 static void draw(int i, double f) {
12 System.out.format("Une entier %d et un double %f %n",i,f);
13 }
14 }
15
Les différents appels suivant correspondent aux bonnes fonctions:
Exercice: le vérifier.
A noter: Le paramètre retour d'une fonction ne permet pas de distinguer entre deux fonctions.
static int draw(int) est la même signature que static void draw(int) . Le vérifier.
La surcharge est surtout utile pour définir plusieurs constructeurs pour un objet.
https://www.emi.ma/ntounsi/COURS/Java/TD/tdJava1.html 6 of 14
Travaux dirigés Java, séance n° 1
char c='a';
f(c);
f(c, 1);
f(c, 2,3,4);
int[] monTableau = {5,6,7,8 };
f(c, monTableau);
NB. C'est comme l'opérateur relationnel de Projection. qui admet en paramètre un nom de relation et
ensuite une suite de noms d'attributs de projection.
import java.lang.Math;
Cette classe contient, en plus des constantes e et pi, les méthodes pour le calcul numériques (fonctions
mathématiques classiques). Ce sont des méthodes toutes static . Exemple
double Math.abs (double) , double Math.sqrt (double) etc.
https://www.emi.ma/ntounsi/COURS/Java/TD/tdJava1.html 7 of 14
Travaux dirigés Java, séance n° 1
(http://docs.oracle.com/javase/8/docs/api/java/lang/Math.html)
1 import java.lang.Math;
2 class TestMath {
3 static public void main(String args[]) {
4 System.out.println("e = " + Math.E);
5 System.out.println("pi = " + Math.PI);
6 int largeur = 3, longueur = 4;
7 double w = Math.pow(largeur,2) + Math.pow(longueur,2);
8 double hypotenuse = Math.sqrt(w);
9 System.out.println("Hypoténuse = " + hypotenuse);
10
11 //... il vaut mieux écrire largeur * largeur que pow (largeur,2)... O
12 }
13 }
14
NB. L'instruction import n'est pas nécessaire ici. Les classes du package java.lang sont importées
implicitement .
Exercice: Utiliser la fonction static double random() , qui retourne un nombre pseudo-aléatoire
supérieur ou égal à 0.0 et inférieur à 1.0, pour imprimer 6 nombres entiers aléatoires compris entre 1
et 49 inclus.
Modifier le programme pour avoir 6 nombres tous différents (c.f. jeu du Loto).
Cette classe abstraite contient les méthodes pour manipuler les dates dans toute ces composantes (à
travers les champs YEAR , MONTH , DAY_OF_MONTH , HOUR etc.), et faire des calculs sur les dates comme
déterminer le prochain jour ou semaine.
1 import java.util.*;
2 class TestCalendar {
3 static public void main(String args[]) {
4
5 Calendar rightNow = Calendar.getInstance();
6 // Création d'une instance date initialisée par défaut à la date l
7
8 System.out.println(rightNow);
9 // le contenu de rightNow pour les curieux!
10 }
11 }
12
Après exécution (le Fri Mar 23 10:34:04 WET 2012 ):
1 java.util.GregorianCalendar[
2
3 … informations techniques sur le fuseau horaire,
4 la zone, l'heure d'été etc. …
5
6 firstDayOfWeek=1,
7 minimalDaysInFirstWeek=1,
8 ERA=1,
9 YEAR=2012,
10
https://www.emi.ma/ntounsi/COURS/Java/TD/tdJava1.html 8 of 14
Travaux dirigés Java, séance n° 1
1 class TestCalendar {
2 static public void main(String args[]) {
3 Calendar rightNow = Calendar.getInstance();
4
5 // tester les get()
6 int j = rightNow.get (Calendar.DAY_OF_MONTH);
7 int m = rightNow.get (Calendar.MONTH);
8 int y = rightNow.get (Calendar.YEAR);
9
10 System.out.println("On est le:"+j+ "/" +(m+1)+"/"+y);
11 }
12 }
13
Affiche:
On a rajouté 1 pour le mois, car ils sont comptés à partir de 0. (Voir résultat exemple-1)
Dans le même programme, rajouter en les complétant les instructions suivantes pour déterminer le
nom du jour de la semaine de façon à imprimer: " On est le:Vendredi 19/4/2019 ".
La fonction set (champ , valeur ) permet de changer le champ (entier) d'une date
rightNow.set(Calendar.MONTH, Calendar.MAY);
https://www.emi.ma/ntounsi/COURS/Java/TD/tdJava1.html 9 of 14
Travaux dirigés Java, séance n° 1
rightNow.set(Calendar.DAY_OF_MONTH, 28);
Exercice : Vérifier que le lendemain du 28 Février est 29 Février 2016, année bissextile, et que le
lendemain du 28 Février est 1er Mars pour 2019.
9. LES WRAPPERS.
Classes Integer , Float , Boolean etc. du package java.lang . Ce sont des sous-classes de Number .
Ces classes détiennent principalement des méthodes pour convertir entre elles des données
numériques, surtout vers (ou à partir de) leur forme chaine de caractères.
Integer I;
I = Integer.valueOf("123");
Remarque: Par constructeur on peut faire la même conversion avec new Integer ( "123"); .
String v e r s int . Fonction parseInt(). Correspondance entre "456" et l'entier int de valeur 456.
int i;
i = Integer.parseInt("456");
Integer v e r s int . Fonction intValue(). Correspondance entre objet Integer et entier int .
int i; Integer I;
i = I.intValue();
Integer o u int v e r s c h a î n e String . Passage réciproque de Integer ou int vers chaîne String
.
Méthode générale valueOf() de la classe String s'appliquant (par surcharge) à tous les types
primitifs.
int i : 34;
s = String.valueOf(i); // s devient "34"
https://www.emi.ma/ntounsi/COURS/Java/TD/tdJava1.html 10 of 14
Travaux dirigés Java, séance n° 1
String s;
Integer I = 345;
s = I.toString(); // s devient "345"
Cette méthode est intéressante car elle est héritée de la classe Object et peut donc s'appliquer à
tout objet si elle est redéfinie. On peut l'utiliser à profit pour imprimer un objet
println(objet.toString); .
1 float f = 12.34f;
2 Float F = new Float (f); // de float vers Float
3 String s;
4 F = Float.valueOf("12.34"); // de String vers Float
5 f = Float.parseFloat ("12.34"); // de String vers float
6 f = F.floatValue(); // de Float vers float
7 s = F.toString(); // de Float vers String
8 s = String.valueOf(f); // de float vers String
9
...
L e s r é f é r e n c e s à o b j e t s : Une affectation x = y n'est pas toujours le même effet selon que ce soit un
objet primitif ou non. Selon que x et y contiennent des valeurs primitives ou sont des références vers
des objets.
On va le tester sur des entiers (objets primitifs) et sur un tableau (objet java).
1 //
2 // Objets vs Valeurs
3 //
4 class Test {
5 static public void main(String[] args) {
6
7 int x = 1, y;
8
9 //////// affectation de valeurs /////////
10 y = x; // deux valeurs égales mais objets differents.
11 System.out.println("Avant (x = 100): x = " + x + " , y = " + y);
12 x = 100;
13 System.out.println("Après (x = 100): x = " + x + " mais y = " + y);
14 // constater que y n'as pas changé
15
16 int[] u = {4, 5}; // tableau à 2 entiers.
17 int[] v;
18
19 ////// même chose avec objets (ici tableaux) ///////
20 v = u;
https://www.emi.ma/ntounsi/COURS/Java/TD/tdJava1.html 11 of 14
Travaux dirigés Java, séance n° 1
1 Avant (x = 100): x = 1 , y = 1
2 Après (x = 100): x = 100 mais y = 1 <-- y n'a pas changé avec x
3 Avant (u[0] = 100): u[0] = 4 , v[0] = 4
4 Après (u[0] = 100): u[0] = 100 ET v[0] = 100 <-- v a changé avec u
5
où on voit que u et v désignent le même objet: une modification de u est aussi une modification de v .
Exercice:
Selon la même idée, faire un programme qui teste l'affectation x = y où x et y sont des objet d'une
classe C.
1 class C {
2 int x; // un champ entier
3 public int getX(){return x;} // méthode pour consulter le champ x
4 public void setX(int p){x = p;} // méthode pour modifier le champ x
5 }
6
Créer deux instances x et y :
x.setX(5);
y.setX(6);
System.out.println(x.getX() + " et " + y.getX());
Faire maintenant :
x = y;
x.setX(4);
System.out.println(x.getX() + " et " + y.getX());
Les objets en Java sont passés en paramètre par valeur. Mais cette valeur peut-être une donnée (objet
https://www.emi.ma/ntounsi/COURS/Java/TD/tdJava1.html 12 of 14
Travaux dirigés Java, séance n° 1
1 //
2 // Passage des paramètres
3 //
4
5 class Test extends Object {
6 static public void main(String args[]){
7
8 int x = 2;
9 System.out.println("Avant modif, x = " + x);
10 modifVal(x);
11 System.out.println("Apres modif, x = " + x);
12
13 int [] t = {2, 3};
14 System.out.println("Avant modif, t[0] = " + t[0]);
15 modifObj(t);
16 System.out.println("Apres modif, t[0] = " + t[0]);
17 }
18
19
20 public static void modifObj(int p[]) {
21 p[0] = p[0] + 200; // Objet référencé p est modifié
22 }
23
24 public static void modifVal(int x) {
25 x = x + 200; // paramètre x modifié
26 }
27 }
28
On obtient:
1 Avant modif, x = 2
2 Apres modif, x = 2
3 Avant modif, t[0] = 2
4 Apres modif, t[0] = 202
5
NB: Quand on change le paramètre lui-même, c'est à dire la variable p ici, on change la référence mais
pas le tableau.
Exercice 8.1: Vérifier maintenant qu'en modifiant la méthode modifObj pour changer p :
Exercice 8.2 : Reprendre la classe C précédente (§7) et tester le passage de paramètre d'un objet de
classe C.
https://www.emi.ma/ntounsi/COURS/Java/TD/tdJava1.html 13 of 14
Travaux dirigés Java, séance n° 1
12. EVALUATION
On pourrait souhaiter de créer un répertoire pour y sauvegarder ses programmes java. Aller vers la
racine (ou sur le Bureau si ce n'est pas autorisé)
cd c:\
et taper
md votreNom
cd votreNom
Pour taper ses programmes utiliser blocNote simple ou Sublime pour une meilleure assistance
syntaxique . Ouvrez d'abord votre répertoire dans une fenêtre Windows.
Les commandes javac et java se trouvent normalement dans le répertoire c:\jdk...\bin . Pour
éviter de taper le chemin complet
c:\jdk...\bin\javac pgme.java
et taper simplement
javac pgme.java
Avant : Path=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem
Après : Path=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;c:\jdk...\bin
Aller dans panneau de configuration, dossier System ensuite l'onglet Avancé. Modifier alors la variable
d'environnement Path.
https://www.emi.ma/ntounsi/COURS/Java/TD/tdJava1.html 14 of 14