TD Java 1
TD Java 1
html
. A P
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.)
. S
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
1 of 17 4/22/2022, 1:35 PM
Travaux dirigés Java, séance n° 1 http://mescours.ma/Java/TD/tdJava1.html
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 :
2 of 17 4/22/2022, 1:35 PM
Travaux dirigés Java, séance n° 1 http://mescours.ma/Java/TD/tdJava1.html
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
3 of 17 4/22/2022, 1:35 PM
Travaux dirigés Java, séance n° 1 http://mescours.ma/Java/TD/tdJava1.html
• new Scanner(System.in);
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 (de la classe File ) pour cette instruction.
4 of 17 4/22/2022, 1:35 PM
Travaux dirigés Java, séance n° 1 http://mescours.ma/Java/TD/tdJava1.html
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);
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 ...
5 of 17 4/22/2022, 1:35 PM
Travaux dirigés Java, séance n° 1 http://mescours.ma/Java/TD/tdJava1.html
4 }
5 }
6
qui effectue cette conversion. Utiliser la formule:
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) ;
6 of 17 4/22/2022, 1:35 PM
Travaux dirigés Java, séance n° 1 http://mescours.ma/Java/TD/tdJava1.html
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) )
f = Celc.c2f (c) ;
par
f = obj.c2f (c) ;
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éthode d'instance
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éthode de classe 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.
. S D F
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 }
7 of 17 4/22/2022, 1:35 PM
Travaux dirigés Java, séance n° 1 http://mescours.ma/Java/TD/tdJava1.html
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.
char c='a';
f(c);
f(c, 1);
f(c, 2,3,4);
int[] monTableau = {5,6,7,8 };
f(c, monTableau);
8 of 17 4/22/2022, 1:35 PM
Travaux dirigés Java, séance n° 1 http://mescours.ma/Java/TD/tdJava1.html
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.
( 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
9 of 17 4/22/2022, 1:35 PM
Travaux dirigés Java, séance n° 1 http://mescours.ma/Java/TD/tdJava1.html
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.
(voir http://docs.oracle.com/javase/8/docs/api/java/util/Calendar.html
pour les détails de champs et méthodes)
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 à 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 MONTH=2, <-- Mois numérotée à partir de 0
11 WEEK_OF_YEAR=12,
12 WEEK_OF_MONTH=4,
13 DAY_OF_MONTH=23,
10 of 17 4/22/2022, 1:35 PM
Travaux dirigés Java, séance n° 1 http://mescours.ma/Java/TD/tdJava1.html
14 DAY_OF_YEAR=83,
15 DAY_OF_WEEK=6, <-- 6e jour de la semaine (Vendred
16 DAY_OF_WEEK_IN_MONTH=4,
17 AM_PM=0,
18 HOUR=10,
19 HOUR_OF_DAY=10,
20 MINUTE=34,
21 SECOND=7,
22 MILLISECOND=578,
23 ZONE_OFFSET=0, <-- Décalage horaire 0, GMT.
24 DST_OFFSET=0
25 ]
26
Exemple-2 : Les fonctions d'accès aux champs. Les fonctions get(...) sont nombreuses et
de la forme get(quelqueChose) où le paramètre est un champs Calendar (constante
symbolique de type entier). Voir la documentation officielle. API ci-dessus.
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 est le:19/4/2019
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 ".
11 of 17 4/22/2022, 1:35 PM
Travaux dirigés Java, séance n° 1 http://mescours.ma/Java/TD/tdJava1.html
Exemple-4 : Utilisation des set(...) pour changer les dates. Même remarque que pour les
get(...). Voir l'API ci-dessus.
La fonction set (champ , valeur ) permet de changer le champ (entier) d'une date
rightNow.set(Calendar.MONTH, Calendar.MAY);
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.
. L W.
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"); .
int i;
i = Integer.parseInt("456");
12 of 17 4/22/2022, 1:35 PM
Travaux dirigés Java, séance n° 1 http://mescours.ma/Java/TD/tdJava1.html
int i; Integer I;
i = I.intValue();
int i : 34;
s = String.valueOf(i); // s devient "34"
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
...
13 of 17 4/22/2022, 1:35 PM
Travaux dirigés Java, séance n° 1 http://mescours.ma/Java/TD/tdJava1.html
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;
21 System.out.println("Avant (u[0] = 100): u[0] = " + u[0] + " ,
22 u[0] = 100;
23 System.out.println("Après (u[0] = 100): u[0] = " + u[0] + " ET v[
24 // constater que v[0] a changé aussi
25 }
26 }
27
On obtiendra:
1 Avant (x = 100): x = 1 , y = 1
2 Après (x = 100): x = 100 mais y = 1 <-- y n'a pas changé
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
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:
14 of 17 4/22/2022, 1:35 PM
Travaux dirigés Java, séance n° 1 http://mescours.ma/Java/TD/tdJava1.html
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 cha
4 public void setX(int p){x = p;} // méthode pour modifier le champ
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 primitif) ou une référence à un objet.
1 //
2 // Passage des paramètres
3 //
4
5 class Test extends Object {
6 static public void main(String args[]){
15 of 17 4/22/2022, 1:35 PM
Travaux dirigés Java, séance n° 1 http://mescours.ma/Java/TD/tdJava1.html
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
:
16 of 17 4/22/2022, 1:35 PM
Travaux dirigés Java, séance n° 1 http://mescours.ma/Java/TD/tdJava1.html
. E
Certains exercices seront évalués à la demande et corrigés par l'encadrant du TP..
Prochain TD.
http://www.oracle.com/technetwork/java/javase/downloads/
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.
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.
17 of 17 4/22/2022, 1:35 PM