COURS Programmation O. Objets JAVA
COURS Programmation O. Objets JAVA
LP BD
Hassan Silkan
Cours 2017-2018
I-Introduction
Généralités
Java est un langage de programmation orienté objet développé par Sun
Microsystems (aujourd'hui racheté par Oracle).
On peut faire de nombreuses sortes de programmes avec Java
: ▪ des applications, sous forme de fenêtre ou de console ;
▪ des applets, qui sont des programmes Java incorporés à des pages web ; ▪
des applications pour appareils mobiles, avec JME ;
▪ et bien d'autres ! JEE, JME, J3D pour la 3D...
il y a des environnements permettant de créer des programmes pour
différentes plates-formes :
▪ Java SE (Java Standard Edition) : permet de développer des applications
dites «client lourd», par exemple Word, Excel, la suite OpenOffice.org…
Toutes ces applications sont des «clients lourds».
▪ Java EE (Java Enterprise Edition) : permet de développer des applications
web en Java. On parle aussi de clients légers.
▪ Java ME (Java Micro Edition) : permet de développer des applications pour
appareils portables, comme des téléphones portables, des PDA…
développementInterface
Fenêtre principale
d'EclipseVous trouverez
le dossier de
votre projet ainsi
que son contenu
10
Compilation et Interprétation
Langage compilé
Etapes qui ont lieu avant l'exécution pour un langage compilé comme C++
d'entête code objet
Librairies
Fichier
de code
Fichier
Compilation et Interprétation
Langage interprété
Cas de Java
Avant exécution Exécution
Compilation et Interprétation
Byte code
Un byte code est un code intermédiaire entre le code Java et le code
machine. Il se trouve dans les fichiers précompilés de vos programmes en
Java, un fichier source a pour extension .java et un fichier précompilé a
l'extension .class : c'est dans ce dernier que vous trouverez du byte code.
le byte code reste le même quel que soit l'environnement avec lequel a été
développé et précompilé votre programme Java. Donc, quel que soit le
Système d’exploitation sous lequel a été codé un programme Java, n'importe
quelle machine pourra l'exécuter si elle dispose d'une machine virtuelle Java
13
Compilation et Interprétation
Machine virtuelle
La machine virtuelle assure à tous les développeurs Java qu'un programme
sera utilisable avec tous les systèmes d'exploitation sur lesquels est installée
une machine virtuelle Java (JVM).
Les composants de la machine virtuelle sont:
Le Chargeur de classe
Le chargeur de classe charge les classes nécessaires à l'exécution, alloue
l'espace mémoire nécessaire et établit les liens entre elles (linkage). Le chargeur
de classe connait la structure d'un fichier .class.
Le Gestionnaire de mémoire
Le gestionnaire mémoire assure les services liés à la mémoire, en particulier :
▪ un ramasse-miette (garbage collector) ;
Compilation et Interprétation
Machine virtuelle
Les Avantages de l'utilisation de la machine virtuelle
▪ La portabilité. les machines virtuelles sont capables d'exécuter exactement le
même code intermédiaire (les mêmes fichiers Java en bytecode) sur de
très nombreux environnements : Windows, MacOS, Linux, android et
autres, avec une totale compatibilité.
▪ La machine virtuelle Java n'est pas uniquement développée sur des
ordinateurs classiques, une multitude d'appareils disposent d'une machine
virtuelle Java : téléphones portables, agenda électronique PDA « Personal
Digital Assistant » …
▪ La machine virtuelle Java possède un ensemble de bibliothèques
extrêmement complètes : des bibliothèques graphiques, des bibliothèques
systèmes, etc...
15
Compilation et Interprétation
Machine virtuelle
Le point faible du concept de machine virtuelle est que le code intermédiaire
(bytecode) est interprété par la machine virtuelle. Ceci entraîne une baisse
importante des performances des programmes.
Toutefois avec les machines virtuelles actuelles, cet argument n'a plus autant
de poids. La technique appelée « compilation juste à temps » (JIT : Just-In
Time) est employée par la machine virtuelle quand une méthode est appelée.
Cette technique consiste à compiler à la volée la méthode appelée (la première
fois) en code natif directement exécutable par le processeur.
16
Caractéristiques du langage
JavaOrienté objet
▪ Java ne permet d'utiliser que des objets (hors les types de base) ▪ Java est un
langage objet, les grandes idées reprises sont : encapsulation, classe/instance,
attribut, méthode, visibilité, interface/implémentation, héritage, redéfinition de
méthodes, polymorphisme
Portabilité
▪ Des machines virtuelles Java existent pour de nombreuses plates-formes.
Développement plus rapide
▪ courte étape de compilation pour obtenir le byte-code,
▪ pas d'édition de liens,
▪ déboguage plus facile
Multi-tâches
▪ Exécution de plusieurs processus effectuant chacun une tâche différente
17
Caractéristiques du langage
JavaFiable
18
19
20
22
La méthode principale
Pour pouvoir faire un programme exécutable il faut toujours une classe qui
contienne une méthode particulière, la méthode « main » .
c’est le point d’entrée dans le programme : le microprocesseur sait qu’il va
commencer à exécuter les instructions à partir de cet endroit public static
void main(String arg[ ])
{
…/…
}
Le mot-clé static précise que la méthode main n’est pas liée à une instance
(objet) particulière de la classe. C’est ce qui fait de cette méthode l’équivalent
d’une procédure ou d’une fonction usuelle des autres langages.
23
Si vous regardez dans votre console, dans la fenêtre du bas sous Eclipse, vous
devriez voir quelque chose ressemblant à la figure suivante.
25
Les commentaires
Les identificateurs
Une variable est un élément qui stocke des informations de toute sorte en
mémoire : des chiffres, des résultats de calcul, des tableaux, des
renseignements fournis par l'utilisateur…
▪ Une variable possède un nom, un type et une valeur.
▪ La déclaration d'une variable permet de réserver la mémoire pour en
stocker la valeur.
Exemple
int nombre; // déclaration
nombre = 100; //initialisation
Les différents types de variables
En Java, nous avons deux types de variables :
▪ des variables de type simple ou « primitif » ;
▪ des variables de type complexe ou des « objets ».
29
Les identificateurs
La liste des mots réservé JAVA
Un identificateur ne doit pas appartenir à la liste des mots réservé JAVA
30
Les identificateurs
Les variables de type primitive
En Java, tout est objet sauf les types de base.
Il y a huit types de base :
▪ un type booléen pour représenter les variables logiques avec les valeurs
associées true et false
▪ un type pour représenter les caractères : char
▪ quatre types pour représenter les entiers de divers taille : byte, short, int et
long
▪ deux types pour représenter les réelles : float et double
La taille nécessaire au stockage de ces types est indépendante de la
machine. ▪ Avantage : portabilité
▪ Inconvénient : "conversions" coûteuses
31
Les identificateurs
Les identificateurs
Les réels
▪ Le type float (4 octets) est utilisé pour les nombres avec une virgule
flottante.
Exemple : float nombre=5.0f
nous ne mettons pas une virgule, mais un point, et si le nombre en question
est rond, on écrit « .0 » derrière celui-ci, le tout suivi de « f ».
▪ Le type double (8 octets) est identique à float, si ce n'est qu'il contient plus
de chiffres derrière la virgule et qu'il n'a pas de suffixe.
Exemple: double x=9,999999999999999999998d
Booléens
Le type boolean, ne peut contenir que deux valeurs : true (vrai) ou false
(faux), sans guillemets (ces valeurs sont natives dans le langage, il les
comprend directement et sait les interpréter).
Exemple: boolean test= true ;
33
Les
identificateurs
Les caractères
▪ Le type char contient un caractère stocké entre apostrophes (« ' ' ») Exemple :
char c=‘A’
▪ Le type String permet de gérer les chaînes de caractères, c'est-à-dire le stockage
de texte. Il s'agit d'une variable de type plus complexe que l'on appelle objet. Elle a
plusieurs méthode de délation :
Exemple:
Première methode de declation
String phrase =“Langage Java”
Deuxieme methode de declation
String phrase =new String();
phrase=“Langage Java”
Troisieme methode de declation
String phrase =new String(“Langage Java”); 34
Initialisation
les champs des objets, contrairement aux variables locales, seront soumis à
une initialisation implicite par défaut; le risque de champ non défini n’existera
pas. D’autre part, nous verrons qu’il existe des variables ou des champs d’un
type autre que primitif, à savoir objet ou tableau.
Initialisation
Constantes et expressions constantes
Le mot-clé final
Java permet de déclarer une variable constante comme une valeur d’une
variable qui ne doit pas être modifiée pendant l’exécution du programme.
Par exemple, avec final int n = 20 ; toute tentative ultérieure de modification
de la valeur de n sera rejetée par le compilateur :
n = n + 5 ; // erreur : n a été déclarée final
D’une manière générale, le mot-clé final peut être utilisé quelle que soit
l’expression d’initialisation de la variable :
int p ;
p = Clavier.lireInt() ;
final int n = 2 * p ;// OK, bien que la valeur de n ne soit connue // qu’à
l’exécution
n++ ; // erreur de oompilation : n est déclarée final
Initialisation
final int n ;
if (...) n = 10 ; // OK
else n = 20
Les opérateurs
Les opérateurs arithmétiques
▪ + est l’addition de deux variables numériques (mais aussi de concaténer
des chaînes de caractères ;
▪ - est la soustraction deux variables numériques.
▪ * est la multiplication de deux variables numériques.
▪ / est la division de deux variables numériques.
▪ % sert a renvoyer le reste de la division entière de deux variables de type
numérique ; cet opérateur s'appelle le modulo.
il existe une syntaxe qui raccourcit l'écriture de ces opérations. Par exemple
pour l’operation +, on peut écrire:
nbr=nbr+1;
nbr+=1;
nbr++
++nbr
Pour la soustraction, la syntaxe est identique,
38
Les opérateurs
Les opérateurs arithmétiques
Les raccourcis pour la multiplication fonctionnent de la même
manière. nbr=nbr*2;
Nbr*=2;
On ne peut faire du traitement arithmétique que sur des variables de même
type sous peine de perdre de la précision lors du calcul. On ne s'amuse pas à
diviser un int par un float, ou pire, par un char.
Ceci est valable pour tous les opérateurs arithmétiques et pour tous les types
de variables numériques.
39
Les opérateurs
Les Conversions ou « Cast »
Si nous affectons le résultat d'une opération sur deux variables de type double
dans une variable de type int, le résultat sera de type int.
Convertir des variables d'un type int en type float :
Int i=123;
float j=(float)i
D'un type int en type double :
int i=123
double j=(double)i
Convertir des variables d'un type double en type int :
double i=1.23
double j=2.999;
int k=(int)i;
k=(int)j;
il est aussi possible de caster le résultat d'une opération mathématique en la
mettant entre « ( ) » et en la précédant du type de cast souhaité. Donc : double
nbr1=10, nbr2=3;
int resultat=(int)(nbr1/nbr2)40
Les opérateurs
Les Conversions ou « Cast »
Transformer l'argument d'un type donné, int par exemple, en
String. int i=12;
String j =new String();
j=j.valueOf(i);
j est donc une variable de type String contenant la chaîne de caractères
12. Maintenant, la variable k de type int contient le nombre 12.
int i=12;
String j=new String();
j=j.valueOf(i)
int k=Integer.ValueOf(j).intValue();
41
E/S Java
Lire les entrées clavier
Les variables de type String sont des objets de type String. Pour que Java
puisse lire ce que vous tapez au clavier, vous allez devoir utiliser un objet de
type Scanner. Cet objet peut prendre différents paramètres, mais ici nous
n'en utiliserons qu'un : celui qui correspond à l'entrée standard en Java.
nous devrons instancier un objet sc de la classe Scanner.
Scanner sc=new Scanner(System.in);
nous devons importer la classe Scanner grâce à l'instruction import. La classe
que nous voulons se trouve dans le package java.util.
La façon dont nous avons importé la classe java.util.Scanner dans Eclipse est
très commode. Vous pouvez aussi le faire manuellement :
import java.util.Scanner
import.java.util.*
42
E/S Java
Lire les entrées clavier
Exemple
Scanner sc=new Scanner(System.in)
System.out.println(« Veillez saisir un mot :»);
String str= sc.nextLine();
System.out.println(«vous avez saisi: »+str)
43
E/S Java
Lire les entrées clavier
Il y a un type de variables primitives qui n'est pas pris en compte par la classe
Scanner : il s'agit du type char. Voici comment on pourrait récupérer un
caractère :
System.out.println(« Saisissez une letttre: »)
Scanner sc= new Scanner(System.in);
String str =sc.nextLine();
Char carac = str.charAt(0);
System.out.println(« Vous avez saisi le caractere :»+carac)
charAt(0) est utilisé afin de récupérer le premier caractère saisi. Même si vous
tapez une longue chaîne de caractères, l'instruction charAt(0) ne renverra que
le premier caractère.
44
Tableaux
Les tableaux permettent de stocker plusieurs valeurs de même type. ▪
Les valeurs contenues dans le tableau sont repérées par un indice ▪
En langage java, les tableaux sont des objets
Déclaration
▪ int tab [ ];
▪ String chaines[ ];
Création d'un tableau
▪ tab = new int [20]; // tableau de 20 int
▪ chaines = new String [100]; // tableau de 100 chaine
Le nombre d'éléments du tableau est mémorisé. Java peut ainsi détecter à
l'exécution le dépassement d'indice et générer une exception. La taille de
tableau est récupérable par nomTableau.length
Comme en C/C++, les indices d’un tableau commencent à ‘ 0 ’. Donc un
tableau de taille 100 aura ses indices qui iront de 0 à 99.
50
Tableaux
Initialisation
tab[0]=1;
tab[1]=2; //etc.
noms[0] = new String( « Hassan");
noms[1] = new String( « Mohamed");
Création et initialisation simultanées
String noms [ ] = {« Hassan",« Mohamed"};
Point pts[ ] = { new Point (0, 0), new Point (10, -1)};
Exemple
public class Tab1
{ public static void main (String args[])
{ int tab[ ] ;
tab = new int[3];
tab[0]=5;
tab[1]=3;
tab[2]=tab[0]+tab[1];
}
} 51
String
String n’est pas un type de base. Il s'agit d'une classe défini dans l’API Java
(Dans le package java.lang)
String s="aaa"; // s contient la chaîne "aaa"
String s=new String("aaa"); // identique à la ligne précédente
La concaténation
String str1 = "Bonjour ! ";
String str2 = null;
str2 = "Comment vas-tu ?";
String str3 = str1 + str2; / * Concaténation de chaînes :
Comparaison
int x=3,y=3;
x == y est vrai
String s1="Abc",s2="Abc";
s1 == s2 est faux...
Quand on compare 2 variables d’un type de base on compare leur valeur. Et
Quand on compare 2 objet avec les opérateurs on compare leur référence (leur
adresse en mémoire). Introduction de la méthode equals() pour les objets :
s1.equals(s2) est vrai52
String
Longueur d’un objet String
▪ La méthode int length() : renvoie la longueur de la chaîne
String str1 = "bonjour";
int n = str1.length(); // n vaut 7
53
String
Sous-chaînes
▪ La méthode String substring(int debut, int fin) sert a extraire la sous-chaine
depuis la position debut jusqu’à la position fin non-comprise.
String str2 = str1.substring(0,3); // str2 contient la valeur "bon" le
premier caractère d’une chaîne occupe la position 0 et le deuxième paramètre
de substring indique la position du premier caractère que l ’on ne souhaite pas
copier
Les chaînes de caractères sont des objets
▪ pour tester si 2 chaînes sont égales il faut utiliser la méthode boolean
equals(String str) et non ==
▪ pour tester si 2 chaînes sont égales à la casse près il faut utiliser la méthode
boolean equalsIgnoreCase(String str)
String str1 = "BonJour";
String str2 = "bonjour"; String str3 = "bonjour";
boolean a, b, c, d;
a = str1.equals("BonJour"); //a contient la valeur true
b = (str2 = = str3); //b contient la valeur false
c = str1.equalsIgnoreCase(str2);//c contient la valeur true
d = "bonjour".equals(str2); //d contient la valeur true
54
Math
Les fonctions mathématiques les plus connues sont regroupées dans la classe
Math qui appartient au package java.lang
les fonctions trigonométriques
les fonctions d’arrondi, de valeur absolue, ...
la racine carrée, la puissance, l’exponentiel, le logarithme, etc.
Ce sont des méthodes de classe (static)
double calcul = Math.sqrt (Math.pow(5,2) + Math.pow(7,2));
double sqrt(double x) : racine carrée de x
double pow(double x, double y) : x puissance y
55
La naissance de la POO
▪ Code modulaire
Permet de développer facilement d’autres modules pour interagir
avec les interfaces déjà utilisées.
▪ Réutilisation
La conception par classe conduit à des composant
réutilisable Cache les détails d'implantation
▪ Maintenance et évolutivité
Modifier un de ces constituants n’affectera pas les autres et
n’entraînera donc pas d’erreurs ou autres comportements
erratique
59
Les objets qui collaborent dans une application sont souvent très nombreux,
Mais on peut le plus souvent dégager des types d'objets.
La notion de classe correspond à cette notion de types d'objets; un objet
correspond à une instanciation de classes
Type
Concept de la vie réelle
Classe
description abstraite d'un ensemble d'objets ayant une structure et un
comportement communs. C’est un type abstrait définit une structure de
données par un ensemble d’opérations applicables aux objets de ce type et
une description sémantique de ces opérations
Objet
Un objet est une instance de classe. Entité atomique constituée d'un état
(caractéristiques et relations), d'un comportement et d'une identité
61
62
63
Classe && Objet
66
Classe && Objet
Utilisation de la classe Point
L’emplacement pour l’objet sera alloué sur une demande explicite du
programme, en faisant appel à un opérateur unaire nommé new.
L’instruction a=new Point(), crée un emplacement pour un objet a de type
Point et fournit sa référence contenue dans a .
Une fois qu’une référence à un objet a été convenablement initialisée, on
peut appliquer n’importe quelle méthode à l’objet correspondant.
Pa exemple l’instruction a.initialise (10,20) ; appelle la méthode initialise du
type Point en l’appliquant à l’objet de référence a, et en lui transmettant les
arguments 10 et 20
67
Classe && Objet
Remarque
▪ a est une variable de type classe. Nous ferons souvent l’abus de langage
consistant à appeler objet a l’objet dont la référence est contenue dans a. ▪
En C++, la déclaration d’un objet entraîne toujours la réservation d’un
emplacement approprié (comme pour un type de base). contrairement à
Java qui réserve un emplacement pour un type primitif, mais seulement une
référence pour un objet.
▪ En C++, on peut instancier un objet de deux manières différentes :
par sa déclaration (objet automatique)
par l’opérateur new (objet dynamique). on obtient en résultat une
adresse qu’on manipule par le biais d’un pointeur,
Le pointeur en C++ jouant un peu le rôle de la référence de Java.
▪ Le fait que Java ne dispose que d’un seul mode d’instanciation
(correspondant aux objets dynamiques de C++) contribue largement à la
clarté des programmes
68
Classe && Objet
Nous pouvons employer notre classe Point depuis toute méthode d’une
autre classe, ou depuis une méthode main (mode statique ).
Nous pourrions faire: main une méthode de notre classe Point. Mais la
démarche serait alors trop particulière .
Nous préférons donc qu’elle appartienne à une autre classe. La classe
nommée TestPoint contenant une fonction main utilisant notre classe Point
public class TestPoint
{ public static void main (String args[])
{ Point a = new Point() ;
a.initialise(10, 20) ; a.affiche() ;
a.deplace(2, 4) ; a.affiche() ;
Point b = new Point() ;
b.initialise (-5, -10) ; b.affiche() ;
}
}
69
Classe && Objet
Résultat après l’execution:
Je suis un point de coordonnées 10 20
Je suis un point de coordonnees 12 24
Je suis un point de coordonnees 7 14
Remarque
▪ Le dernier exemple fournit un exemple d’exécution, bien que pour l’instant nous
ne vous ayons pas encore précisé comment exécuter un programme formé de
plusieurs classes (ici TestPoint et Point);
▪ Dans notre classe Point, les champs x et y ont été déclarés privés. Une tentative
d’utilisation directe, en dehors des méthodes de Point, conduirait à une erreur de
compilation.
Ce serait notamment le cas, dans notre méthode main:
a.x = 5 ; // erreur : x est privé
System.out.println ("ordonnee de a " + a.y);// erreur : y est privé 70
Nous avons déclaré chaque classe avec l’attribut public (ne confondez pas ce
droit d’accès à une classe avec le droit d’accès à ses champs ou méthodes,
même si certains mots-clés sont communs) ;
Java n’est pas tout à fait aussi strict. pour placer plusieurs classes dans un
même fichier, Il vous impose seulement de respecter les contraintes
suivantes :
▪ un fichier source peut contenir plusieurs classes mais une seule doit être
publique;
▪ la classe contenant la méthode main doit obligatoirement être publique,
afin que la machine virtuelle y ait accès ;
▪ une classe n’ayant aucun attribut d’accès reste accessible à toutes les
classes du même paquetage donc, a fortiori, du même fichier source.
72
Classe && Objet
Remarque
▪ La méthode main peut être une méthode de la classe Point. Cela permet
d’écrire un programme réduit à une seule classe et contenant à la fois sa
définition et son utilisation. Mais dans ce cas, la méthode main aurait
accès aux champs privés de la classe, ce qui ne correspond pas aux
conditions usuelles d’utilisation :
class Point
{ public static void main (String args[])
{ Point a = new Point() ;
a.x = ...// autorisé ici puisque main est une méthode de Point }
private int x, y ;
}
Déconseiller d’utiliser cette possibilité pour faire de la méthode main
une sorte de test de la classe, même si cette démarche est parfois
utilisée dans la littérature sur Java.
▪ Lorsque plusieurs classes figurent dans un même fichier source, la compilation
73
crée un « fichier .class » par classe.
Les constructeurs
74
Les constructeurs
76
Les constructeurs
77
Les constructeurs
78
Construction et initialisation d’un objet
Les champs d’un objet sont toujours initialisés par défaut. la création d’un
objet entraîne toujours, par ordre chronologique, les opérations suivantes : ▪
une initialisation par défaut de tous les champs de l’objet, ▪ une initialisation
explicite lors de la déclaration du champ, ▪ l’exécution des instructions du
corps du constructeur.
1. Initialisation par défaut des champs d’un objet
Dès qu’un objet est créé, et avant l’appel du constructeur, ses champs sont
initialisés à une valeur par défaut "nulle" ainsi définie :
Type du champ Valeur par défaut
Boolean False
Char Caractère de code nul
Entier(byte,short,int,long) 0
Flottant(float,double) 0.f ou 0
Objet null
79
Construction et initialisation d’un objet
2. Initialisation explicite des champs d’un objet
Une variable locale peut être initialisée lors de sa déclaration. Il en va de
même pour un champ. Considérons :
class A
{ public A (...) { ..... } // constructeur de A
.....
private int n = 10 ;
private int p ;
}
L’instruction suivante : A a = new A (...) ; entraîne successivement :
▪ l’initialisation (implicite) des champs n et p de a à 0
▪ l’initialisation (explicite) du champ n à la valeur 10
▪ l’exécution des instructions du constructeur.
80