Vous êtes sur la page 1sur 42

La programmation en

Rajae El Ouazzani

2014-2015
Présentation
 La programmation orientée objet existe depuis l’arrivée du langage
Simula'67 en 1967. Cependant, elle n’est vraiment devenue un des
paradigmes de la programmation qu’au milieu des années 1980.
 La principale différence entre la programmation structurée
traditionnelle et la programmation orientée objet est que cette
dernière met dans une même structure les données et les opérations
qui leurs sont associées.
 Java est un pur langage orienté objets, ce qui signifie que le niveau le
plus externe de la structure des données est l’objet. En Java, il n’y a
pas de constantes, variables ou fonctions autonomes, l’accès se fait
toujours par des classes et des objets.

2014-2015 2
Plan:
 Section 1: Les classes en Java
 Déclaration et instanciation des classes.
 Constructeurs.
 Accès aux données et méthodes membres de classe.
 Surcharge d’une méthode.
 Le mot clé: this.
 Comparaison des objets.
 Section 2: Variables et méthodes de classe
 Les variables et méthodes statiques
 Les constantes : final
 Section 3: La classe Scanner
 Méthodes de la classe Scanner
3
Section 1: Les classes en Java

2014-2015 4
Présentation
 Tout d’abord, il faut faire la distinction entre les classes et les
objets.
 Une classe est la définition d’un type complexe (une classe
regroupe plusieurs variables de types: primitif, composite et
types d’objets),
 Un objet est une déclaration d’une variable de type classe.
 Exemple:
classe Personne: String nom, prénom; int âge.
objet P1 de la classe Personne : "Lazrak"; "Mohammed"; 20.

2014-2015 5
Déclaration et instanciation des classes [1]
 Création d’une classe vide :
class MaClasse { // class est un mot clé pour une classe.
} // MaClasse est le nom de la classe.
 Cette classe n’est pas encore utile, mais elle est correcte en Java.
 Après avoir créé une classe, on peut créer autant d’objets, qu’on veut, basés
sur cette classe.
MaClasse monObjet1, monObjet2; Nom_objet2
Nom_classe
Nom_objet1

 Le processus de création d’un objet à partir d’une classe est appelé


instanciation d’un objet ou création d’une occurrence d’une classe.
 Mais cette instruction n’affecte ni mémoire ni autres ressources aux objets.
Alors, il faut utiliser l’opérateur new avec la nom de la classe.
monObjet1=new MaClasse(); // allocation de la mémoire pour monObjet1.
Remarques
Nom_objet monObjet = new MaClasse(); Nom_classe

 Le nom de la classe est utilisé comme s’il s’agissait d’une


méthode. Il s’agit du constructeur de la classe (A voir plutard).
 Une fois l’objet créé, vous n’avez pas à vous préoccuper de sa
destruction. En Java, les objets sont automatiquement éliminés par
le Garbage collector (gc). Dès que la référence à un objet (c’est-à-
dire la variable) sort de la portée, la machine virtuelle libère
automatiquement toutes les ressources affectées par l’opérateur new.

 L’instruction suivante est réalisée automatiquement par la JVM:


System.gc(); // gc() est une méthode de la classe System.
2014-2015 7
Exemple: Déclaration d’une classe
 Nous allons créer une classe Personne à laquelle nous ajoutons des données membres
et des méthodes.
class Personne { //Le nom de la classe commence par une majuscule
String nom, prénom; // La déclarations de variables peut être dans n'importe quel ordre
int âge;
void grandir() {
âge ++;
}
String présentation(){ //Retourne la description de la personne
return nom+ " " +prénom+" est une personne âgée de : "+âge;
}
}
 nom, prénom et âge: sont des données membres de n’importe quels types.
 grandir() et présentation() sont des méthodes membres de la classe Personne.
Exemple: Instance d'une classe
 Création des variables (instances) de la classe Personne:
Personne p1, p2;
p1 = new Personne();
p2 = new Personne();

9
Accès aux données et méthodes membres de classe [1]
 Pour utiliser une donnée membre sur un objet, on utilise la syntaxe
suivante : nom_objet.nom_donnée;
Exemple: p1.nom; p1.prénom; p1.âge.
 Pour utiliser une méthode sur un objet, on utilise la syntaxe suivante :
nom_objet.nom_methode(arg1,arg2,…);
Exemple: p1.grandir(); String s=p1.présentation().
NB: La méthode présentation()
retourne une variable de type String.

Remarque: Lors de l'initialisation des variables, on ne peut pas utiliser


des références à des variables non encore déclarées.
Exemple: p1.adresse; //c’est faux, la donnée adresse n’est pas déclarée.
10
Constructeurs [1]
 Chaque classe a une méthode spéciale appelée constructeur, qui porte
toujours le même nom que la classe et qui n’a pas une valeur de retour.
 Le constructeur prend soin d’affecter toutes les ressources dont l’objet
a besoin et de renvoyer une occurrence de l’objet.
 Quand on utilise l’opérateur new (p1 = new Personne();), on appelle
en réalité le constructeur. Comme l’occurrence de l’objet est toujours
le type de retour, il n’est pas nécessaire de préciser de type de retour du
constructeur !
 Dans la plupart des langages orientés objet correspond une méthode
nommée destructeur, appelée pour libérer les ressources affectées par
le constructeur. Cependant, Java n’a pas de mécanisme destructeur,
puisque ce langage prend soin de libérer toutes les ressources pour
vous (garbage collector avec gc()).
2014-2015 11
Exemple
public Personne() {
nom = "Lazraq";
prenom= "Mohammed"; Appel au constructeur Personne()
âge = 20; Personne p1,p2;
} p1 = new Personne ();
p2 = new Personne("Lotfi", "Karim", 21);
public Personne(String vnom, String
vprenom, int vage) {
nom = vnom; Appel au constructeur Personne(String, String, int)
prenom= vprenom;
âge = vage; p1.grandir(); // l’âge de p1 devient 21
} p2.grandir(); // l’âge de p2 devient 22

2014-2015 12
Remarque: Finaliseurs [1]
 Cependant, certaines situations nécessitent un nettoyage spécial que
le Garbage collector ne peut pas effectuer quand la classe disparaît.
Par exemple, certains fichiers ont été ouverts pendant la durée de vie
de l’objet et vous voulez vérifier qu’ils sont correctement fermés
quand l’objet est détruit. Pour cela, une autre méthode spéciale,
appelée finaliseur, peut être définie. Cette méthode (si elle est
présente) est appelée par le Garbage collector immédiatement avant
la destruction de l’objet. Ainsi, si un nettoyage spécial quelconque
doit avoir lieu, le finaliseur peut le faire pour vous. Cependant, le
Garbage collector s’exécute dans la machine virtuelle sous forme de
thread de faible priorité, ce qui ne permet pas de savoir à quel
moment il détruira réellement votre objet. C’est pourquoi il vaut
mieux éviter de mettre dans le finaliseur du code dépendant du
temps, puisque vous ne pouvez pas savoir quand il sera appelé.
Surcharge d’une méthode [1]
 En Java, il est possible de créer dans une classe plusieurs
méthodes qui portent le même nom mais avec différents
paramètres et/ou valeurs de retour.
 Exemple: constructeurs de la classe Personne.
public Personne()
public Personne(String vnom, String vprenom, int vage)

 Cela est connu sous le nom de surcharge des méthodes. Java


décide de la méthode à appeler en regardant sa valeur de retour
et ses paramètres d’entrée.

2014-2015 14
Accéder aux données membres d’une classe
 Les données membres d’une classe sont accessibles uniquement à
l’intérieur des méthodes de la classe qui les contient.

class Personne{ class Voiture{ Remarque:


String nom, prénom; String marque, modèle; Il est impossible d’utiliser
int âge; int année_fabrication; les données membres nom,
prénom et âge de la classe
Personne dans la classe
} } Voiture

 Si on veut lire ou modifier leur valeurs hors des méthodes de la classe, il


faut ajouter des méthodes pour cet effet dans le code de la classe:
 Pour lire les valeurs des données membres, on utilise des méthodes
appelées accesseurs.
 Pour modifier les valeurs des données membres, on utilise les
modificateurs.
Exemple :
public class Personne{
String nom;
String prénom;
Accesseur ou getter
int âge;
public String getnom(){
return nom;
}
Modificateur ou setter
public void setnom(String unnom){
nom=unnom;
}
}
2014-2015 16
Exercice
 Ecrire le code complet de la classe Personne qui contient:
 les données membres: nom, prénom et âge;
 les constructeurs avec et sans paramètres;
 les codes des méthodes membres: grandir() et présentation();
 les modificateurs et les accesseurs aux différents attributs de
la classe.

2014-2015 17
Solution
class Personne {
String nom, prénom;
int âge;

public Personne() {
nom = "Lazraq";
prénom= "Mohammed";
âge = 20;
}

public Personne(String vnom, String vprénom, int vâge){


nom = vnom;
prénom= vprénom;
âge = vâge;
}
2014-2015 18
public String getnom(){
return nom;
}
public void setnom(String unnom){
nom=unnom;
}
public String getprénom(){
return prénom;
}
public void setprenom(String unprénom){
prénom=unprénom;
}
public int getâge(){
return âge;
}
public void setâge(int unâge){
âge=unâge;
} 2014-2015 19
void grandir() {
âge ++;
}

public String présentation(){


return getnom()+" "+getprénom()+ " est une personne agée
de : "+getâge();
}

2014-2015 20
public static void main(String[] args) {
Personne p1, p2;
p1 = new Personne();
p2 = new Personne("Lotfi", "Karim", 21);
System.out.println("\t Présentation de la première personne:
"+ p1.toString());
p1.grandir();
System.out.println("\t le nouveau âge de p1 est:"+
p1.getâge());
System.out.println("\t Présentation de la deuxième personne:
"+ p2.toString());
}
}

2014-2015 21
Le mot clé this
 Dans le code des méthodes, on peut désigner l’objet courant en utilisant
le mot clé this.
 On doit utiliser this quand il y a un conflit entre le nom d’un attribut et le
nom d’un argument ou d’une variable.
 Exemple du modificateur du nom d’une personne:
public class Personne{
String nom, prénom;
int âge;
public void setnom(String unnom){
nom=unnom;
} public void setnom(String nom){
} this.nom=nom;
}

2014-2015 22
Comparaison des objets
 2 notions d’égalité existent : l’égalité d’identité et l’égalité de valeur.
 On dit que 2 variables objets ont la même identité s’ils contiennent le même objet :

Personne p1,p2; Les variables p1 et p2


p1 = new Personne ("Lotfi", "Karim", 21); contiennent le même
p2=p1; objet !

 On dit que 2 objets sont égaux en valeur si tous leurs attributs ont les mêmes
valeurs :
Personne p1,p2; Les objets p1 et p2
p1 = new Personne ("Lotfi", "Karim", 21); ont les mêmes valeurs
p2 = new Personne ("Lotfi", "Karim", 21); mais ils ne sont pas le
même objet !

2014-2015 23
Remarque
 Les opérateurs d’égalité == , et de différence !=, ne testent que
l’égalité d’identité.
 Pour tester une égalité par valeur, il faut écrire les instructions qui
vont comparer chacun des attributs des 2 objets. Généralement, on
ajoute une méthode dédiée à ce traitement dans la classe : equals
public class Personne{

public boolean equals(Personne p){
return(nom==p.nom && prénom==p.prénom && âge==p.âge);
}
}

2014-2015 24
Section 2: Variables et méthodes
de classe

2014-2015 25
Les variables statiques [2]
 Un attribut statique est un attribut qui peut être utilisé par l’ensemble
des instances (objets) d’une classe. C’est le même attribut, avec la
même valeur et il est partagé par tous les objets de la classe.
 Les attributs statiques existent même si aucun objet n’est créé. Ils
sont généralement initialisés lors de leur déclaration.

public class Personne { //exemple d’utilisation dans le constructeur


String nom; public Personne(String nom, String prénom, int âge){
String prénom; this.nom = nom;
int âge; this.prénom= prénom;
static int nbPersonnes=0; this. âge = âge;
… nbPersonnes++;
}
}
2014-2015 26
Les méthodes statiques
 Une méthode statique est une méthode qui existe de façon indépendante
des instances d’une classe.
 dans le code d’une méthode statique le mot clé this (la référence à
l’objet courant) n’existe pas !
 une méthode statique ne peut manipuler directement que les attributs
statiques.
On invoque une méthode statique Dans l’appel, on précède le nom d’une
directement sur le nom de la classe: méthode statique par le nom de la classe:
public class Personne { …
… System.out.println(Personne.getNbPersonnes());
public static int getNbPersonnes(){ …
return(nbPersonnes);
}
}
2014-2015 27
Les constantes : final [1]
 Le mot clé final indique que la variable correspondante est une
constante.
 Lorsqu’on utilise final, la valeur correspondante est une constante
pour chaque instante de la classe. Ainsi, elle peut avoir 2 valeurs
différentes dans 2 instances différentes. Dans ce cas, la constante est
initialisée dans le constructeur.

 Lorsqu’on ajoute le mot clé static à final cela signifie que c’est une
variable de classe (càd, connue dans tout le programme) et elle est
constante.
 Exemple:
static final double PI=3.14;
2014-2015 28
Qu’est-ce qu’un programme Java ?
 Un programme Java est une classe qui possède une méthode
statique de signature main(String[]).

 Quand on lance l’exécution d’un programme, la machine


virtuelle invoque la méthode main(String[]) de la classe qui a
pour nom le nom du programme.

2014-2015 29
Syntaxe globale d’un programme Java
public class NomProgramme{
// declaration_données
// declaration_méthodes
public static void main(String[] arg){
// code_de_début_du_programme
}
}
 Ce code doit être enregistré dans un fichier nommé:
NomProgramme.java

2014-2015 30
Section 3: La classe Scanner pour
la lecture de la console

2014-2015 31
Présentation [2]
 La classe Scanner se trouve dans le package util et elle possède des méthodes
simples de lecture des variables de types primitifs de l'entrés standard
(System.in).
 Il faut importer la classe Scanner comme suit: import java.util.Scanner;
 Les méthodes de la classe partagent l'information par l'unités (tokens). Voila
quelques méthodes de la classe Scanner:

Méthodes Descriptions
BigDecimal
Lit l’unité suivante de l’entrée comme un BigDecimal.
nextBigDecimal()
BigInteger nextBigInteger() Lit l’unité suivante de l’entrée comme un BigInteger.
BigInteger
Lit l’unité suivante de l’entrée comme un BigInteger.
nextBigInteger(int radix)
radix -- the radix used to interpret the token as an int value. 32
Méthodes Descriptions
boolean nextBoolean() Lit l’unité suivante de l’entrée dans une valeur booléenne
et returne cette valeur.
byte nextByte() Lit l’unité suivante de l’entrée comme un byte.
byte nextByte(int radix) Lit l’unité suivante de l’entrée comme un byte.
double nextDouble() Lit l’unité suivante de l’entrée comme un double.
float nextFloat() Lit l’unité suivante de l’entrée comme un float.
int nextInt() Lit l’unité suivante de l’entrée comme un int.
int nextInt(int radix) Lit l’unité suivante de l’entrée comme un int.
String nextLine() Récupère le contenu de toute la ligne saisie et replace la «
tête de lecture » au début d'une autre ligne.
long nextLong() Lit l’unité suivante de l’entrée comme un long.
long nextLong(int radix) Lit l’unité suivante de l’entrée comme un long.
short nextShort() Lit l’unité suivante de l’entrée comme un short.
short nextShort(int radix) Lit l’unité suivante de l’entrée comme un short.
2014-2015 33
Exemples
 On peut lire une valeur entière sur System.in de la façon suivante :
Scanner sc = new Scanner(System.in);
int i = sc.nextInt();
 Ou décomposer une chaîne de caractères :
String s = "1 un 2 deux 3 trois";
Scanner sc = new Scanner(s);
System.out.println(sc.nextInt()+" "+sc.next()); // 1 un
System.out.println(sc.nextInt()+" "+sc.nextLine()); // 2 deux 3 trois
sc.close();
 Ou lire un fichier contenant des entiers longs :
Scanner sc= new Scanner(new FileInputStream("xxx")); // "xxx" est le nom du fichier
while (sc.hasNextLong(){
long l = sc.nextlong();
}
2014-2015 34
Exemple
public static void main(String[] args) {
Résultat:
String s = "Salam à tous ! 30 + 3.0 = 6.0 true ";
N'est pas trouvé :Salam
Scanner sc = new Scanner(s);
N'est pas trouvé :à
// utiliser une boucle pour lire toutes les unités N'est pas trouvé :tous
while (sc.hasNext()) { N'est pas trouvé :!
// si l’unité suivante est un entier, on affiche "trouvé" ainsi que sa Trouvé :48
conversion de la base 16 à décimale N'est pas trouvé :+
if (sc.hasNextInt()) { N'est pas trouvé :3.0
//30 est en base 16, on le convert en base 10: cela donne 48 N'est pas trouvé :=
System.out.println("Trouvé :" + sc.nextInt(16)); N'est pas trouvé :6.0
} N'est pas trouvé :true
// si l’unité suivante n’est pas un entier, on affiche: "n’est pas
trouvé" ainsi que le String lu
System.out.println("N'est pas trouvé :" + sc.next());
}
sc.close(); // fermer le scanner
} 35
Exemple
import java.util.Scanner;
// ou import java.util.*; qui permet d’importer toutes les classes du package util.
public class TestEntrées {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.print("Quel est votre nom? "); // demander et lire le nom
String nom = in.nextLine();
System.out.print("Quel âge avez vous? "); // demander et lire l’âge
int âge = in.nextInt();
// afficher sur la console les informations lues
System.out.println("Salam " + nom + ". Vous avez " + (âge) + " ans.");
}
} Quel est votre nom? Lazrak Mohammed
Quel âge avez vous? 20
Salam Lazrak Mohammed. Vous avez: 20 ans.
36
Utilisation d’une pop up dialog box

2014-2015 37
Code
import javax.swing.JOptionPane;
public class test6 {
public static void main( String[] args ){
String nom = "", s_age="";
int age;
nom=JOptionPane.showInputDialog("Quel est votre nom?");
s_age=JOptionPane.showInputDialog("Quel âge avez vous?");
age=Integer.parseInt(s_age);
String msg = "Salam "+nom+". Vous avez: " + (age)+ " ans.";
JOptionPane.showMessageDialog(null, msg);
}
}
Remarque:
 JOptionPane.showInputDialog() return une chaine comme résultat.
2014-2015 38
Délimiteur [3]
 Les différentes données du Scanner sont délimitées par des délimiteurs : le
délimiteur par défaut est le Pattern:
delimiters=\p{javaWhitespace}+
c'est à dire un ou plusieurs javaWhiteSpace (espace, tabulation, retour à la
ligne, ...)
 Ce délimiteur peut être modifié par la méthode useDelimiter(String s) ou
useDelimiter(Pattern p).

2014-2015 39
Exemple
import java.util.Scanner;
import java.util.regex.Pattern; // pour utiliser le paramètre Pattern
public class TestDelimiteur {
public static void main(String[] args) {
String s = "1/aun//a2////adeux/a3/atrois";
Scanner sc = new Scanner(s);
sc.useDelimiter(Pattern.compile("/+a")); //un ou plusieurs / suivis de a
/* on peut utiliser un autre délimiteur:
sc.useDelimiter(Pattern.compile("/a")); pour un seul / suivit de a */
System.out.println(sc.nextInt()+" "+sc.next()); //1 un
System.out.println(sc.nextInt()+" "+sc.next()); // 2 deux
System.out.println(sc.nextInt()+" "+sc.next()); // 3 trois
sc.close();
}
}

40
A savoir: Localisation [4]

 La classe Scanner est capable de scanner les nombres dans la forme locale :
String s = "1,2 2,3";
Scanner sc = new Scanner(s); Résultat:
System.out.println(sc.nextDouble()); 1.2
2.3
System.out.println(sc.nextDouble());
sc.close();
 On peut changer la localisation pour un Scanner par la méthode
useLocale(locale l) :
String s = "1.2 2.3";
Scanner sc = new Scanner(s); Résultat:
sc.useLocale(Locale.ENGLISH); 1.2
System.out.println(sc.nextDouble()); 2.3
System.out.println(sc.nextDouble());
sc.close();
2014-2015 41
Références
[1] : http://www.i3s.unice.fr/~riveill/cours/langage/99-java-intro.pdf
[2] : http://refg.tu-sofia.bg/JavaCours/StdIn-Scanner/StdinScanner.html
[3] : http://imss-www.upmf-
grenoble.fr/prevert/Prog/Java/Flux/Scanner.html
[4]: http://docs.oracle.com/javase/7/docs/api/java/util/Locale.html

42