Cours1 Java POO
Cours1 Java POO
Objet (JAVA)
Pr. IALA Imad
Imad.iala01@[Link]
Objectif du cours
Les objectifs du cours sont d’apprendre les bases de la programmation en utilisant le langage Java
comme support. Ces bases sont pratiquement communes avec la majorité des langages de
programmation.
Les notions étudiées seront les suivantes :
variable, type, expression
l’instruction conditionnelle (if)
les boucles (for, while,…)
les tableaux
les sous-programmes (méthode, fonction, procédure)
en conclusion du cours, une ouverture vers la programmation objet avec l’utilisation
d’objets de deux classes prédéfinies: String et ArrayList.
Le but du cours est de vous donner non seulement des connaissances, mais également une
compétence: celle de réaliser concrètement de petits programmes java utilisant les constructions
énumérées ci-dessus et de les exécuter sur un ordinateur.
Programme source et programme cible
Tout programme Java est composé au minimum d’une classe (mot-clé class) dite principale, qui
elle même, contient une méthode de nom main. Les notions de classe et de méthode seront
abordées plus tard.
public, class, static, void : sont des mots réservés c’est-à-dire qu’ils ont un sens particuliers pour
Java. On ne peut donc pas les utiliser comme nom pour des classes, des variables, etc...
La classe principale : celle qui contient la méthode main. Elle est déclarée par public class
Nom_classe. C’est vous qui choisissez le nom de la classe. Le code qui définit une classe est
délimité par les caractères { et }.
Structure générale d’un programme Java
Nom du programme : Le nom de la classe principale donne son nom au programme tout entier et
doit être également celui du fichier contenant le programme, complété de l’extension .java
La méthode main : obligatoire dans tout programme Java : c’est elle qui “commande” l’exécution.
Définie par une suite de déclarations et d’actions délimitées par { et }. Pour l’instant, et jusqu’à ce
que l’on sache définir des sous-programmes, c’est ici que vous écrirez vos programmes.
Par convention, le nom d’une classe commence par une majuscule. Ce n’est pas une obligation
absolue, mais il est fortement conseillé de s’y conformer.
Premier programme
• Voyons ligne par ligne le sens des instructions du programme.
Les types de variables primitifs & constantes
Types de base
Les types de base en Java, ou types primitifs, ou types simples, sont pratiquement les mêmes
qu’en langage C :
▪ char : 16 bits (un seul caractère : '…')
▪ short : 16 bits (entier signé)
▪ int : 32 bits (entier signé)
▪ long : 64 bits (entier signé)
▪ float : 32 bits (réel)
▪ double : 64 bits (réel)
▪ byte : 8 bits (entier signé)
▪ boolean : 1 bit (true / false)
Remarque
▪ En Java le type String (chaîne de caractères : "…") est un type référence et non un type simple.
▪ Par convention, les noms de tous les types référence doivent commencer par une lettre
majuscule.
Les types de variables primitifs & constantes
Noms de variables
Remarque
La déclaration et l’initialisation se font de la même manière qu’en langage C,
le cas où une valeur numérique est affectée à un type dont la taille est inférieure, dans ce cas il
s’agit d’une erreur de compilation
Les réels sont par défaut des « double », sauf s’ils sont suivis d’un ‘f’ ou ‘F’ pour indiquer qu’il
s’agit d’un « float »
L’utilisation de variables non initialisées est une erreur de compilation.
Les types de variables primitifs & constantes
Constante
▪ Les constantes sont déclarées avec le mot clef final,
▪ le reste de la syntaxe est le même que pour les autres variables,
▪ elles doivent être initialisées à la déclaration,
▪ leur contenu ne peut pas être modifié.
int a = 5;
int x = a - 15;
int n1, n2;
int n3 = 100, n4 = -2;
• short b = (short) a;
• ici un « cast » est nécessaire pour éviter une erreur de compilation. Le casting (ou trans-typage)
est l’action de changer le type d’une valeur vers le type de la variable d’affectation (b). le
langage java est un langage très typé, à l’inverse d’autres langages comme php ou javascript.
Les types de variables primitifs & constantes
Constante
float y = 5.06F;
double z = 0.23;
boolean test = (y >= z);
char s = 'A';
char p = '*';
final int k = 15;
k = 16;
Les types références
Pour les types simples, la zone mémoire allouée contient la valeur associée au nom de la variable,
tandis que pour les types références ou objets (voir prochain chapitre), cette zone mémoire
contient l’adresse mémoire (en hexadécimal) où sont stockés les champs de cet objet.
Les opérateurs arithmétiques & logiques
Opérateurs arithmétiques
Les opérateurs arithmétiques & logiques
Opérateurs arithmétiques
Les opérateurs arithmétiques & logiques
Expression logique
Une expression logique est une expression qui n’a comme valeur possible que l’une des valeurs
Vrai ou Faux.
Exemple :
byte x = 5;
byte y = 2;
bool z = (x == y);
Un opérateur logique est un opérateur qui agit sur des variables et des expressions logiques.
Les opérateurs arithmétiques & logiques
Opérateurs logique
Afficher / lire des données
Définition : Imprimer des données vers « le fichier de sortie standard » du programme
Comme on le remarque dans le premier exemple, l’instruction [Link](…) sert à
afficher toutes sortes de données (numériques, chaînes de caractères, …), tout en passant à la
ligne suivante.
▪ System : cette classe utilitaire permet, entre autres, d'utiliser l'entrée standard (le clavier) et la
sortie standard (l’écran).
▪ out : objet de type PrintStream (flux d’écriture), et attribut de la classe System, cet attribut gère
la sortie standard, qui est par défaut : le périphérique d’affichage (l’écran).
▪ println : méthode de l’objet out qui écrit dans la console les informations passées en paramètre
(chaînes de caractères, nombres, …)
▪ print : idem que println, sans retour à la ligne.
▪ Pour faire une concaténation entre des chaînes de caractères, ou entre chaînes et variables, on
utilise l’opérateur « + »
Les notions de programmation orientée objets (Classes, Objets, Méthodes, …) seront détaillées
dans le prochain chapitre.
Afficher / lire des données
Définition : Lire des données depuis « le fichier d’entrée standard » du programme
▪ Créer un objet de type Scanner, classe utilisée pour lire des informations depuis différentes
sources.
▪ Le constructeur de la classe Scanner doit prendre un objet de type InputStream (flux d’entrée),
qui doit être [Link], autre attribut de la classe System, qui représente l’entrée standard, qui
est par défaut : le clavier.
la classe Scanner se trouve dans le package : [Link], toutes les classes java sont organisées dans
des bibliothèques, logées dans des dossiers appelés en java « packages »
[Link] sc = new Scanner([Link]);
▪ Utiliser les méthodes nextInt( ), nextDouble( ), nextLine( ) de l’objet Scanner, … pour lire un
entier, un réel, du texte, …
Afficher / lire des données
Définition : Lire des données depuis « le fichier d’entrée standard » du programme
Les structures conditionnelles
Structure optionnelle
Une structure optionnelle est constituée d’un bloc d’instructions (une ou plusieurs instructions),
que l’ordinateur ne doit exécuter que si une condition est vérifiée, sans aucune autre alternative.
Si la condition n’est pas vraie, le bloc d’instructions est ignoré.
Syntaxe de base :
if(condition booléenne) {
instructions;
}
Remarques
▪ La condition booléenne peut être un booléen, ou un ensemble de booléens combinés avec des
opérateurs logiques.
▪ Pour une bonne lisibilité, l’indentation du code est nécessaire.
▪ Si un bloc IF ne contient qu’une seule instruction, alors les accolades ne sont pas obligatoires.
Les structures conditionnelles
Structure optionnelle
▪ Un bloc IF peut contenir un autre bloc IF :
if(condition booléenne) {
instructions
if(condition booléenne) {
instructions
}
instructions
}
Les structures conditionnelles
Structure alternative IF/ELSE
Une structure alternative IF / ELSE sert à exécuter un bloc d’instructions si une condition est vraie,
sinon on exécute un autre bloc d’instructions.
Syntaxe de base :
if(condition booléenne) {
bloc 1
} else {
bloc 2
}
▪ Si un bloc ELSE ne contient qu’une seule instruction, alors les accolades ne sont pas obligatoires :
if(condition booléenne)
Instruction1
else
instruction2
Un bloc ELSE peut lui aussi contenir un autre bloc IF, ou IF / ELSE
Les structures conditionnelles
Structure alternative SWITCH-CASE
Supposons qu’on soit obligé de faire un test comme celui-là :
if(x == 0) {
Instruction1;
} else {
if(x == 1) {
instruction2;
} else {
if(x == 2) {
instruction3;
} else {
if(x == 3) {
instruction4;
} else {
instruction5;
}
}
}
}
Les structures conditionnelles
Structure alternative SWITCH-CASE
La structure alternative SWITCH – CASE est un moyen élégant et efficace de réaliser le programme
précédent d’une manière plus simple.
Syntaxe de base :
switch(variable) {
case valeur_1 :
traintement_1;
break;
case valeur_2 :
traintement_2;
break;
case valeur_3 :
traintement_3;
break;
case ……
default :
traintement_par_défaut;
break;
}
Les structures conditionnelles
Structure alternative SWITCH-CASE
• Tout comme les blocs if et else, un bloc case ou default peut tout contenir (des instructions, des
structures if, if/else, switch-case, …)
• Dans un bloc case ou default les accolades ne sont pas obligatoires, même quand le bloc
contient plusieurs instructions.
• L’instruction break sert à sortir de la structure switch quand l’un des blocs case est vérifié. Mais
elle n’est pas obligatoire selon la syntaxe de java.
• Le bloc default n’est pas obligatoire.
• Quand plusieurs blocs case contiennent le même traitement, ils peuvent être « rassemblés ».
Syntaxe :
case valeur_1 :
case valeur_2 :
case valeur_3 :
traintement_3;
break;
• Le test switch, peut être appliqué aux variables de types entier, caractère, ou chaine de
caractère.
Les structures conditionnelles
Structure alternative ? :
Utilisée pour les affectations soumises à un test if/else.
Syntaxe de base :
if(condition booléenne)
variable = valeur_1
else
variable = valeur_2;
Les structures itératives
Une structure répétitive (ou itérative, appelée aussi boucle) oblige le programme à répéter un
bloc d’instructions tant que la condition de répétition est vraie.
Exemple : Somme des entiers de 1 à 10.
On se propose de calculer la somme des nombres entiers entre 1, 2, 3, …, 10.
Il nous faudra donc une variable qui sera nommée compteur pour faire le comptage de 1 à 10, et
une autre som pour faire la somme. Code sans structure itérative :
byte compteur = 1, som = 0;
som += compteur;
compteur++; // compteur vaut 2
som += compteur;
compteur++; // compteur vaut 3
…
…
som += compteur;
compteur++; // compteur vaut 10
[Link]("valeur de la somme : " + som);
La partie répétée sera exécutée tant que compteur <= 10
Bien sûr, il n’est pas pratique de répéter ces instructions, d’où l’utilité des boucles.
Les structures itératives
La boucle WHILE
Syntaxe de base :
while(condition booléenne) {
instructions
incrémentation / décrémentation
}
De même que les autres structures déjà étudiées (if, else, …), si un bloc while ne contient
qu’une seule instruction, alors les accolades ne sont pas obligatoires.
Un bloc peut lui aussi contenir des structures alternatives (if, if/else, switch, …), itératives, …
La boucle while continue de s’exécuter tant que la condition booléenne est vraie. Si la condition
booléenne est fausse, les instructions de la boucle ne seront pas exécutées.
Il est essentiel que la condition booléenne devienne fausse après un certain nombre
d’itérations, sinon on parle de « boucle infinie ». Une boucle infinie conduit à un plantage du
programme.
Les structures itératives
La boucle WHILE
L’utilisation de l’instruction break permet d’arrêter une boucle, même si la condition booléenne
est encore vraie. Syntaxe de base :
while(condition booléenne) {
instructions
if(autre condition booléenne) {
break;
}
incrémentation / décrémentation
}
Exemple : Somme des entiers de 1 à 10.
Les structures itératives
La boucle DO-WHILE
Syntaxe de base :
Do {
instructions
incrémentation / décrémentation
} while(condition booléenne);
La boucle do-while a le même effet que la boucle while, sauf que la boucle do-while vérifie la
condition d’itération à la fin et non au début. Donc même si la condition est fausse, les
instructions seront exécutées au moins une fois.
La boucle do-while est toujours suivie d’un point-virgule.
Exemple : Somme des entiers de 1 à 10.
Les structures itératives
La boucle FOR
Syntaxe de base :
for(initialisation; condition booléenne; incrémentation/décrémentation) {
instructions
}
La boucle for a le même effet que la boucle while.
La déclaration de la boucle for doit obligatoirement contenir ces 3 éléments :
o L’initialisation du compteur (ou bien déclaration et initialisation),
o Condition booléenne de répétition de la boucle,
o L’instruction d’incrémentation ou décrémentation du compteur.
Exemple : Somme des entiers de 1 à 10.
Les tableaux : Tableaux de dimension 1
Définition
• Un tableau est une structure regroupant plusieurs valeurs de même type, chacune étant
stockée dans un espace particulier appelé une case du tableau.
• On peut traiter un tableau comme un tout, ou case par case. Traité comme un tout, on pourra le
stocker dans une variable, le passer en paramètre ou le donner en résultat d’un calcul. Chaque
case est désignée individuellement via son indice, qui correspond à sa position dans le tableau,
et peut être traitée comme variable individuelle : on pourra consulter sa valeur, la modifier, etc.
Les tableaux : Tableaux de dimension 1
Spécificités des tableaux
Un tableau n’existe pas tant qu’on ne l’a pas créé. Les valeurs des types primitifs de Java (int,
double, boolean, char) existent sans qu’il soit nécessaire de les créer. Il n’est pas nécessaire de
créer la valeur 17 ou la valeur true.
Pour les tableaux, c’est différent : il faut les créer pour qu’ils existent et il y a un opérateur pour le
faire : l’opérateur new.
Un tableau est une valeur d’un type. Ce type dépend de ce que l’on met dans le tableau. Pour
chaque type qui existe en Java, on peut créer un tableau qui contient plusieurs valeurs de ce type,
chacune étant stockée dans une case du tableau.
Le type d’un tableau d’entier se note int[], celui d’un tableau de char se note char[]. Plus
généralement, si un type Java se note T, le type des tableaux contenant une valeur de ce type
dans chaque case se note T[].
Un type tableau, comme int[] par exemple, peut servir à déclarer une variable. int[] var;
Cette déclaration ne crée pas de tableau. Elle crée un nom que l’on pourra utiliser pour désigner
un tableau.
Les tableaux : Tableaux de dimension 1
Spécificités des tableaux
Un tableau a une taille fixée lors de sa création, c’est le nombre de cases qu’il contient. Une fois
créé, le tableau ne peut plus jamais changer de taille : on ne peut ni lui ajouter ni lui enlever de
cases.
Pour créer un tableau, on utilise new suivi du type des éléments et du nombre de cases entre
crochets.
• var = new int[10];
L’expression new int[10] crée un nouveau tableau de 10 cases, chaque case pouvant contenir un
nombre entier, et elle renvoie ce tableau. Le reste de la ligne est une affectation normale qui
permet de donner une valeur à la variable var.
A partir de ce moment, il est possible d’utiliser chaque case du tableau pour y stocker une valeur.
Chaque case se comporte comme une variable de type int.
• var[0]=10;
• var[1]=tab[0]+1;
Les tableaux : Tableaux de dimension 1
Déclaration et création
En Java, avant d’utiliser un tableau, il faut :
1. Déclarer une variable de type tableau (symbole []), en indiquant le type T de ses futures cases ;
T [] tab;
2. Créer explicitement la structure du tableau en mémoire (opérateur new), en donnant sa taille
et le type T de ses éléments. Cette taille ne pourra plus changer : en Java les tableaux sont de
taille fixe.
tab = new T[taille];
3. L’initialisation des cases avec des valeurs par défaut, est réalisée implicitement par l’opération
de création.
Les tableaux : Tableaux de dimension 1
Déclaration
L’instruction :
T [] tab;
Ici, on déclare une variable tab destinée à contenir un tableau, dont les cases seront de type T.
Après déclaration, la variable tab existe, mais n’est pas encore initialisée à un tableau.
Exemples :
int [] tabNum; // tabNum est un tableau avec cases de type int
double [] t; // t est un tableau avec cases de type double
String [] m; // m est un tableau avec cases de type String
tabNum[0] = 5; // provoque une erreur: le tableau n’existe pas
Après ces déclarations, les variables tabNum, t et m existent, mais pas encore la suite de cases
que chacune d’entre elles pourra désigner. Par exemple, il est impossible de modifier la première
case de tabNum (notée tabNum[0]) : elle n’existe pas encore. Le compilateur signale l’erreur :
[Link]: variable tabNum might not have been initialized tabNum[0] = 5;
Les tableaux : Tableaux de dimension 1
Création
L’opération de création : new T[n]; réalise la création et l’initialisation d’un tableau de n cases de
type T :
1. Allocation en mémoire d’un espace suffisant pour stocker n cases de type T.
2. Initialisation des cases du tableau avec des valeurs par défaut.
Les tableaux en Java sont de taille fixe. Une fois le tableau créé, l’espace qui lui est alloué en
mémoire ne peut pas changer. Par exemple, il est impossible d’ajouter ou d’enlever des cases
d’un tableau.
Exemple 1 : Déclaration, puis création du tableau tab avec trois entiers.
int [] tab; // Declaration
tab = new int[3]; // Creation
tab[0] = 7;
Les tableaux : Tableaux de dimension 1
Création
Après l’instruction de création new, la variable tab est initialisée à un tableau contenant trois
entiers. Après l’affectation tab[0] = 7, la structure du tableau en mémoire est :
Il est possible de réunir la déclaration et la création d’un tableau en une seule instruction. On
pourra ainsi déclarer et créer le tableau de l’exemple 1 par :
Exemple 2 : Déclaration et création en une seule instruction.
int [] tab = new int[3];
Les tableaux : Tableaux de dimension 1
Initialisation par une liste de valeurs
Lorsqu’un tableau est de petite taille, il est possible de l’initialiser en donnant la liste des valeurs
de chaque case. On utilise la notation {v_0, v_1, . . ., v_n}, où v_i est la valeur à donner à la case i
du tableau.
Nous reprendrons souvent cette notation pour regrouper en une seule instruction la déclaration,
la création et l’initialisation d’un tableau.
Exemple 3 : Déclaration, création et initialisation d’un tableau en une seule instruction.
int [] tab = {1,9,2,4};
Il est alors inutile de réaliser une création explicite via new : elle se fait automatiquement à la
taille nécessaire pour stocker le nombre des valeurs données.
Remarque:
int[] x;
x = {15, -24, 5}; // erreur de compilation
La déclaration et initialisation. doivent se faire en une seule instruction !!
Les tableaux : Tableaux de dimension 1
Valeurs par défaut à la création
Lors de la création, les cases d’un tableau sont initialisées avec des valeurs par défaut :
les cases boolean sont initialisées à false.
les cases numériques sont initialisées à 0.
les cases char sont initialisées au caractère nul ’\0’.
les cases référence sont initialisées à la valeur null (référence nulle).
Longueur d’un tableau
La taille ou longueur d’un tableau est le nombre n des cases qu’il contient. Supposons que tab
désigne un tableau de taille n. On peut obtenir sa longueur par la notation [Link]. Les indices
du tableau tab sont alors compris entre 0 et [Link]-1. Cette notation sera souvent employée
pour fixer la valeur maximale qui peut prendre l’indice d’un tableau.
Les tableaux : Tableaux de dimension 1
Accès aux cases
L’accès aux cases de tab n’a de sens que pour les indices dans l’intervalle [0,. . ., [Link]-1].
Si i est un indice compris dans cet intervalle : tab[i] : est un accès à la case de position i dans
tab. On peut consulter ou modifier cette valeur dans le tableau. Exemple : tab[i] = tab[i] + 1;
Accès en dehors des bornes du tableau tab : si j n’est pas compris entre 0 et [Link]-1,
l’accès tab[j] provoque une erreur à l’exécution : l’indice j et la case associée n’existent pas dans
le tableau. Java lève l’exception ArrayIndexOutOfBoundsException.
Parcourir un tableau
• Le numéro de case peut être cherché dans une variable. Il arrive souvent qu’on utilise une
boucle for pour effectuer une opération sur chacune des cases d’un tableau. On utilise alors la
variable de la boucle for pour désigner un numéro de case. A chaque tour de boucle, l’opération
est effectuée sur une des cases du tableau et la boucle est parcourue autant de fois qu’il y a de
cases dans le tableau.
for(i = 0 ; i <= [Link]-1 ; i += 1)
for(int elem : tab)
Les tableaux : Tableaux de dimension 1
Exercice 1
Demander à l'utilisateur de saisir le nombre d’élèves N d’une classe. Ensuite demander les notes
d’examen de ces N élèves, qui seront stockées dans le tableau notes. Le programme doit ensuite
afficher le nombre d'élèves qui ont eu la moyenne.
Exercice 2
Ecrire un programme qui demande à l'utilisateur de saisir 5 entiers qui seront stockés dans un
tableau T_ENTIER. Le programme doit ensuite afficher la valeur du plus grand élément de ce
tableau.
Indication : stocker le 1ier élément dans une variable plusGrand, comparer ensuite tous les
autres éléments un par un avec plusGrand, chaque fois qu’un élément est supérieur à plusGrand,
plusGrand devient cet élément-là.
Les tableaux : Tableaux de dimension 1
Exercice 3
Lire les éléments d’un tableau de chaînes de caractères de taille 5 depuis le clavier, et afficher
ensuite celle qui contient le plus de caractères.
Indication : s’inspirer de l’exercice précèdent et utiliser la méthode length() de la classe String.
Exercice 4
Ecrire un programme qui lit les valeurs de 2 tableaux de chiffres A et B de tailles N et M lues au
clavier, et qui regroupe les éléments de A et B dans un tableau C. Afficher ensuite les éléments de
C à la manière de l’exemple 18.
Exemple :
Les tableaux : Tableaux de dimension 1
Exercice 5
Ecrire un programme qui demande à l’utilisateur de taper 5 chiffres qui seront stockés dans un
tableau T, le programme doit remplir un autre tableau R avec les éléments de T mais à l’envers.
Afficher ensuite les éléments de R.
Exemple :
Les tableaux : Tableaux de dimension 1
Exercice 6
Ecrire un programme qui lit une chaîne de caractères S et qui teste si oui ou non cette chaine est
un palindrome.
Indications :
Un palindrome est une chaîne de caractères qui se lit de la même manière aussi bien de
droite à gauche que de gauche à droite. Ex. "kayak", "OTO", …
Transférer les caractères de S dans un tableau de caractères T en utilisant la méthode
toCharArray de la classe String
Créer un autre tableau R et s’inspirer de l’exercice précédent pour chercher si S est un
palindrome.
La taille d’un tableau est indiquée par l’attribut de tableaux length
Les tableaux : Tableaux de dimension 1
Exercice 7
Ecrire un programme qui demande à l’utilisateur de taper N entiers qui seront stockés dans un
tableau T. Le programme doit trier le tableau par ordre croissant et ensuite les afficher.
Indication (algorithme de tri « bulle »): On parcourt le tableau en comparant T[0] et T[1] et en
échangeant ces éléments s'ils ne sont pas dans le bon ordre. On recommence le processus en
comparant T[1] et T[2],... et ainsi de suite jusqu'à T[N-1] et T[N-2]. Lors de chaque itération, on
compte le nombre d'échanges effectués. On fait autant d’itérations que nécessaire jusqu'à ce
que le nombre d'échanges soit 0 : le tableau est alors trié.
Les tableaux : Tableaux de dimension 2
Définition
Un tableau à 2 dimensions, ou matrice, est une grille de cellules, caractérisée par un nombre de
lignes et un nombre de colonnes. Et comme pour les tableaux à dimension 1, l’indexation des
lignes et des colonnes commence par 0.
Exemple, une matrice de réels, de 4 lignes et 6 colonnes peut être représentée comme ceci :
La syntaxe de déclaration d’un tableau à dimensions 2 se fait comme pour celle d’un tableau à
dimension 1, mais avec deux paires de crochets, la 1ière pour les lignes, et la 2ième pour les
colonnes.
Les tableaux : Tableaux de dimension 2
Définition
La syntaxe de déclaration d’un tableau à dimensions 2 se fait comme pour celle d’un tableau à
dimension 1, mais avec deux paires de crochets, la 1ière pour les lignes, et la 2ième pour les
colonnes.
Syntaxe de base :
• 1iere syntaxe :
int[][] x = new int[nbr_lignes][nbr_colonnes]; // déclaration
x[ligne][colonne] = valeur;
• 2ieme syntaxe :
int y[][] = {{10, 10},{5, 5},{1, 1}}; // déclaration et initialisation
Attention!!
int y[][];
y = {{10, 10},{5, 5}}; // erreur de compilation
Les tableaux : Tableaux de dimension 2
Exemple : Lire les éléments d’un tableau d’entiers de taille [3][3].
// lecture des éléments de la ligne 0
[Link]("tapez un entier\t");
t_int[0][0] = [Link]();
[Link]("tapez un entier\t");
t_int[0][1] = [Link]();
[Link]("tapez un entier\t");
t_int[0][2] = [Link]();
La concaténation
• La concaténation entre chaine de caractères et autres données se fait par l’opérateur +
Les chaines de caractères
Les méthodes de la classe String:
Méthodes Effets
String ch1 = "123";
extraire un nombre entier d’une chaine
int nbr1 = [Link](ch1);
String ch2 = "1.2345"; extraire un nombre réel d’une chaine
double nbr2 = [Link](ch2);
Retournent true si une chaine commence par une autre
boolean b1 = “BONJOUR".startsWith(“BON");
chaine
boolean b1 = "BONJOUR".endsWith(“JOUR"); Retournent true si une chaine se termine une autre chaine
boolean b1 = "BONJOUR".contains(“NJO"); Retournent true si une chaine contient une autre chaine
Retourne dans une autre chaine ch2, la partie de ch1 qui
String ch2 = [Link](debut) commence depuis la position debut. L’indexation
commence par 0
Retourne dans une autre chaine ch2, la partie de ch1 qui
String ch2 = [Link](debut,fin) commence depuis la position debut et qui se termine à la
position fin-1. L’indexation commence par 0.
Les chaines de caractères
Les méthodes de la classe String:
Méthodes Effets
String ch1 = "BONJOUR à TOUS"; Remplace toutes les occurrences de la 1ère chaine par la
String ch2 = [Link]("OU" , "ou"); 2ème chaine.
String ch1 = "BONJOUR à TOUS"; Remplace la première occurrence de la 1ère chaine par la
String ch2 = [Link]("OU" , "ou"); 2ème chaine.
retourner une chaine qui correspond à la même chaine
String ch2 = [Link]();
en minuscules.
retourner une chaine qui correspond à la même chaine
String ch2 = [Link]();
en majuscule.
• Ceci explique pourquoi il ne faut pas utiliser == et != pour comparer deux chaînes de caractères si
l’on veut comparer leurs contenus et non pas l’adresse de leurs mémoires privées.
Exécution de programmes et mémoire (1)
Résumé du chapitre
La mémoire est divisée en deux parties : la pile et le tas
La pile contient les mémoires privées des variables
Le tas contient les mémoires privées des tableaux et des chaînes de caractères.
Les mémoires privées des variables de type tableau ou de type String contiennent
une adresse désignant un espace dans le tas où est enregistrée le contenu du
tableau ou de la chaîne.
Pour les tableaux et les chaînes, == et != comparent les adresses et non le
contenu des tableaux et des chaînes.
Méthodes
Une méthode que l’on peut appeler également un sous-programme, une fonction ou une procédure, est un
petit programme qui réalise une tâche déterminée. Elle prend en entrée des paramètres et peut renvoyer un
résultat ou ne pas renvoyer de résultat.
Signature d’une méthode
• Pour appeler une de ces méthodes, il faut écrire son nom suivi d’une liste de paramètres entre
parenthèses. Pour utiliser une méthode, il faut connaitre le nombre et le type de ses paramètres. Il faut
également savoir si elle renvoie un résultat et le cas échéant, le type de son résultat. On appelle signature
d’une méthode la liste des types de paramètres et du résultat éventuel de la méthode.
• Les quatre méthodes mentionnées ci-dessus ont les signatures suivantes, notées graphiquement.
• On peut également décrire les signatures textuellement. On utilise alors le petit mot-clé void pour dire
qu’une méthode ne renvoie pas de résultat.
• [Link] : String void
• [Link] : int
• [Link] : int, int int
• [Link] : double
Méthodes
Étude de la méthode main
Pour savoir comment écrire une méthode, on peut commencer par regarder la méthode que nous savons déjà écrire, à
savoir la méthode main. Prenons un exemple de programme.
La méthode commence par un entête qui figure sur la ligne numéro 2, suivi d’une liste d’instructions entre accolades
(accolade ouvrante en fin de ligne 2, fermante en ligne 10, instructions des lignes 3 à 9).
Voyons les différentes composantes de l’entête :
• public static : deux mot-clés de Java que nous n’expliquerons
pas pour le moment et qui seront toujours écrits en début
d’entête pour toutes les méthodes.
• void : spécifie que la méthode ne renvoie pas de résultat. Si
au contraire, la méthode renvoyait un résultat, ce serait le
type de ce résultat qui apparaîtrait à cette position de
l’entête.
• main : le nom de la méthode. Dans le cas de la méthode
main, ce nom est imposé. C’est cette méthode qui est
toujours exécutée lorsqu’on demande à exécuter un
programme. Pour les autres méthodes, leur nom sera au
libre choix du programmeur, comme le nom des variables du
programme.
• (String[] args) : c’est la liste des paramètres de la méthode.
Ici, il n’y a qu’un paramètre. Ce paramètre a pour nom args
et pour type String[]. Ce paramètre est comme une sorte de
variable, utilisable dans le programme.
Méthodes
Étude de la méthode main
• On peut se demander à quoi sert le paramètre de la méthode main. Il sert à transmettre des données entrées lors de la
demande d’exécution du programme. Par exemple, si l’on demande l’exécution d’un programme depuis une ligne de
commande dans un terminal, on commence cette ligne par la commande java, ensuite on met le nom de la classe
contenant la méthode main et ensuite on peut ajouter des données séparées par des espaces. Ces données sont
transmises au programme dans le tableau args.
• Voyons quelques exemples d’appels d’un programme qui utilise ce paramètre.
Exercice
— Le nom du titulaire.
— Le numéro de compte.
— Le solde du compte.
Ces trois attributs seront trois variables de type respectif String, int et double.
Notions de Classes et Objets
3. Constructeur
• Le rôle du constructeur est d’initialiser les attributs de la classe. Ici, il y a trois attributs : le titulaire et le
numéro de compte ne peuvent pas être devinés dans le constructeur en utilisant du code Java. Il faut que
cette information soit donnée lors de la création de l’objet. Cela sera fait au moyen de paramètres du
constructeur. Le solde pour sa part peut être fixé à 0.0 à la création de l’objet. Cela revient à supposer que
les comptes sont vides à leur création.
• Le constructeur est une sorte de méthode appelée par l’instruction new lors de l’instanciation d’une classe.
Cette méthode renvoie l’objet créé par new correctement initialisé. Dans la classe, il se distingue des
méthodes par le fait qu’il porte le même nom que la classe et que le type des objets renvoyés n’est pas
précisé. Dans son code, il n’y a pas de return pour renvoyer l’objet créé. C’est fait automatiquement de
façon sous-entendue. Voici le code du constructeur à ajouter dans la classe :
Notions de Classes et Objets
3. Constructeur
• Si vous ne créez pas un constructeur dans votre classe, le compilateur va
automatiquement vous créer un constructeur par défaut implicite.
• Si le constructeur surchargé est créé, le constructeur par défaut implicite ne sera plus
créer par le compilateur.
• La plateforme java différencie entre les différents constructeurs déclarés au sein d’une
même classe en se basant sur le nombre des paramètres et leurs types.
On ne peut pas créer deux constructeurs ayant le même nombre et types des
paramètres.
Compte(int id){
[Link]=id
}
Compte(int id) {
[Link]=id*2
}
Notions de Classes et Objets
4. Méthodes
• Il s’agit de déterminer quelles
opérations sont nécessaires pour
utiliser un compte bancaire. Parmi
les opérations usuelles que tout un
chacun fait sur son compte, il y a la
consultation du solde, le dépôt
d’argent et le retrait d’argent. Ces
trois opérations doivent
nécessairement figurer dans la
classe sous forme de trois
méthodes.
• Faut-il d’autres méthodes? Pas
nécessairement, mais on peut
ajouter des méthodes qui
permettront de faciliter la mise au
point des programmes et/ou
d’homogénéiser les pratiques.
Notions de Classes et Objets
4. La méthode toString
• La méthode toString définie dans la classe Object renvoie le nom de la classe de l'objet concerné suivi de
l'adresse de cet objet.
• Quand on redéfinit la méthode to String, on fait en sorte qu'elle renvoie une chaîne de caractères servant à
décrire l‘objet concerné.
• Cette méthode est appelée par [Link] et par la concaténation de chaînes +. Si on n’écrit pas
cette méthode dans la classe, c’est un toString par défaut qui est utilisé et qui affiche plus ou moins la
référence de l’objet.
Notions de Classes et Objets
4. La méthode toString
Voyons un exemple de création puis d’affichage d’un compte.
Méthodes et variables statiques.
Les composantes statiques des classes
Nous avons vu qu’une classe peut contenir un constructeur, des variables et méthodes d’instance. Mais une
classe peut aussi contenir de variables et méthodes qui ne sont pas d’instance, mais statiques ou de classe.
Les déclarations de ces variables et méthodes contiennent le mot-clé static.
Nous utilisons régulièrement une méthode statique : le main qui constitue le programme.
Une méthode statique existe dans la classe indépendamment des objets instances de la classe. Alors que les
méthodes d’instance n’existent que dans les objets créés en instanciant la classe avec un new. Si l’on reprend
l’exemple des comptes bancaires, la méthode get_solde qui est une méthode d’instance ne peut être utilisée
que s’il existe déjà un objet de type Compte. Elle peut alors être appelée et elle renvoie le solde de ce
compte-là.
Une méthode statique comme main existe dans la classe et peut être utilisée sans qu’aucun objet instance de
la classe ne soit créé. On peut l’utiliser en l’appelant non pas sur un objet mais sur la classe.
un attribut dit « statique » présente les différences suivantes :
o Il n’appartient pas à l’objet, mais à toute la classe,
o Sa valeur est la même pour tous les objets,
o Ne nécessite pas l’instanciation d’objets pour être utilisé.