Java1 NotionsDeBase
Java1 NotionsDeBase
SOMMAIRE
LANGAGE JAVA
Le langage Java développé par Sun Microsystems dans les années 90 a été lancé
en 1995. C’est un langage qui s’apparente beaucoup au langage C++.
1 Notions de base
Considérons un rectangle comme exemple. Un tel rectangle est caractérisé par une
longueur (L) et une largeur (l), il est initialisé avec une longueur et une largeur
donnée, il peut calculer son périmètre et sa surface. On le décrira par une
association d’états et de procédures. C’est une telle association de données et de
procédures que l’on nomme habituellement un objet. Ici L, l sont des variables et
perimetre, surface et initialiser sont des procédures.
Le mot clé extends permet de dériver une classe d’une autre classe (voir héritage).
Le mot clé implements (sous-entend un héritage particulier) permet
d’implémenter une interface (voir interface). Le mot clé abstract signifie que la
classe n’est pas encore terminée. En d’autres termes, certaines méthodes peuvent
être redéfinies.
Le mot clé public précise que la classe peut être invoquée par d’autres classes.
Par exemple :
class Rectangle{
private float L ;
private float l ;
public Rectangle(float longueur, float largeur) //initialisation
{ L=longueur ; l=largeur ;}
public Rectangle() //autre initialisation possible
{L=0 ; l=0 ;}
private float perimetre()
{return(2*(L+l)) ;}
public float surface()
{return (L*l); }
}
Une classe est composée de données et de méthodes. Les données constantes sont
définies à l’aide du mot clé final.
Les composants d’une classe (données et méthodes) peuvent être qualifiés private,
protected et public :
• private : inaccessible par toutes les classes (accessible uniquement par les
membres de la classe).
• protected : accessible par les classes héritières, par les classes du même
paquetage et inaccessible par les autres.
• public : accessible par toutes les classes.
• Si le composant n’est pas qualifié, il est accessible par les classes du même
paquetage et inaccessible par les autres.
Il est parfois nécessaire, dans la définition d’une méthode de classe, de faire appel
à l’instance courante de la classe, dans ce cas on utilise le mot clé this
(littéralement « lui ») qui représente l’instance courante.
Le nom donné à ce type de membres est membre de classe, dans le cas contraire
on parle de membres d’instances ou d’objets.
Une méthode static n’ayant pas d’objet courant, this n’y est pas défini. Pour les
propriétés toute dernière affectation modifie la valeur pour tous les objets
instanciés de la classe.
Une définition de classe constitue un modèle d’objets dont on peut ensuite créer
autant d’exemplaires que l’on veut (on dit également instances). En Java, la
déclaration et la création des objets sont deux choses séparées. La déclaration
consiste à définir un identificateur et lui associer un type afin que cet identificateur
puisse désigner un objet de ce type. Par exemple, la déclaration des identificateurs
rect1 et rect2 pour désigner des objets de type Rectangle s’écrit : Rectangle rect1
; Rectangle rect2 ;
En Java, comme dans de nombreux langages à objets tels que Eiffel, PascalDelphi
ou Smalltalk, un identificateur de variable de type classe est associé à une
référence qui désigne un objet. Une référence est l’adresse d’un objet, mais
contrairement à un pointeur (tel qu’on en trouve en C, C++ ou Pascal) la valeur
d’une référence n’est ni accessible, ni manipulable : elle ne peut que permettre
l’accès à l’objet qu’elle désigne.
La déclaration seule ne crée pas d’objet. Elle associe l’identificateur à une
référence null qui ne fait référence à rien.
…
rect1 = new Rectangle(5.2,3.0) ; //appel du constructeur à 2 paramètres
…
rect2 = new Rectangle() ; //appel du constructeur par défaut
Il n’est pas possible de faire rect3.L=12.0 car le membre L qui a le statut private
n’est pas accessible.
Java permet de définir une classe à l’intérieur d’une autre classe. Une telle classe
est dite interne (inner class en anglais). L’intérêt d’avoir une telle classe interne
réside dans la modularité que cela apporte : le nom de la classe interne est
purement local et cette classe peut même être rendue invisible depuis l’extérieur
de la classe englobante si on la déclare avec l’attribut private.
A l’extérieur de la classe englobante, on peut citer une classe interne (non privée)
sous la forme : classe englobante.classe interne
Dans le cas général, une classe interne utilise les composants de l’objet courant de
la classe englobante ; il y a alors pratiquement une nouvelle classe interne par
objet de la classe englobante, chacune étant liée à un objet. La création d’un objet
de la classe interne doit dans ce cas citer un objet de la classe englobante.
Classe_englobante.classe_interne objet_classe_interne =
objet_classe_englobante.new constructeur_classe_interne
Notons que la création d’un objet instance d’une classe interne diffère légèrement
de la création d’un objet d’une classe normale, la syntaxe est :
objet.new constructeur
Par exemple, pour programmer une pile qui sera dotée d’un moyen de parcours de
ses éléments, de sorte que plusieurs parcours puissent se dérouler en même temps
sur une pile, on définira une classe Parcours associée à la pile et on créera un
objet de cette classe chaque fois que l’on veut réaliser un parcours. Le constructeur
Parcours() initialise le parcours à partir du sommet, suivant() passe au suivant
dans la pile, element() rend l’élément du parcours et estEnFin() teste si le
parcours est fini.
class PileEnt {
private int s ; private int P[] = new int[100] ;
public PileEnt() {s=-1;}
public void empiler(int e) {s=s+1; P(s)=e;} public void
depiler() {s=s-1;}
public int sommet() {return P[s];}
Exemple d’utilisation :
Les méthodes et classes qui se rapportent aux entiers se trouvent dans le paquetage
java.lang.Integer.
• Type flottant
Type Plage de valeurs Longueur
float +/- 3 403.1038 avec 6 ou 7 décimales 4 octets
significatives
double +/- 1 798.10308 avec 15 8 octets
décimales significatives
• Type char
char est un type de caractères Unicode, codé sur 2 octets, soit au total 65 000
caractères qui figurent toujours entre apostrophes ‘ ‘.
La définition d’un caractère Unicode se fait soit directement en tant que caractère
‘A’, soit en tant que nombre hexadécimal ‘\u0000’ jusqu’à ‘\uFFFF’. Il existe des
séquences d’échappement, comme ‘\u’ qui signifie « caractère Unicode »
• Type booléen
boolean valeur_test = true;
• Type String
String n’est pas un type de données simple. C’est pourquoi il n’est pas prédéfini,
contrairement à int ou float.
String introduit du texte c’est une chaîne de caractères, écrit entre guillemets. Ils
est une instance de la classe java.lang.String ou String.
• Tableaux et vecteurs
- Tableau : la déclaration d’un tableau s’effectue à l’aide du symbole [] qui peut
se placer après le type ou le nom de la variable.
Par exemple : int [] tab_entier; ou int tab_entier [];
La déclaration d’un tableau comme pour les objets de type classe, ne fait
qu’associer l’identificateur à une variable de nature référence initialisée à null.
Pour que cet identificateur désigne un objet, il faut lui affecter soit le résultat d’une
création, grâce à la primitive new, soit un objet déjà existant : tab_entier = new
int[10] ;
On ne fixe la taille du tableau qu’une seule fois, pour que la taille soit variable, on
fait recours aux vecteurs. Une fois la taille du tableau fixée, on peut la récupérer
à la l’aide de la propriété length par exemple tab_entier.length donnera 10.
int [] matrice [] ; ou
int matrice [] [] ;
matrice = new int [4] [5] ;
1.2.2 Opérateurs
- arithmétiques
+, -, *, / et % (reste de divison)
+=, -=, *=, /= et %= affectation après calcul
++ et -- (incrémentation et décrémentation d’une unité)
- logiques
- binaires
- conversion
Casting
Le casting est la conversion d’un type de données en un autre à l’aide d’une
syntaxe. La syntaxe figure entre parenthèse devant la valeur à convertir.
Avant conversion on peut vérifier qu’un objet est l’instance d’une classe
donnée à l’aide de l’opérateur instanceof.
Exemple : monObjet obj ;
if (monObjet instanceof Classe) { … }
- Affectation
- Instructions conditionnelles/branchements
if (condition) {
…}
[else
{…}]
switch (valeur_de_requête)
{
case valeur1 : … [break] ;
case valeur2 : … [break];
…
default: … [break];
} valeur_de_requête est soit tout type entier sauf long, soit
char.
- Boucles
while (condition) { … }
do { … } while (condition) ;
for (valeur_de_démarrage;condition_d’exécution;compteur) { … }
- Commentaires
Throwable
Exception Error
IOException RuntimeException
Si une méthode est susceptible de déclencher une exception, cela doit être indiqué
dans son profil, au moyen de la directive throws : Int p( ) throws xxxException {
…}
Exceptions fréquentes
Exception Description
NumberFormatException Conversion d’un texte en valeur numérique
ArrayIndexOutOfBondsException Appel de champs de tableau qui n’existent
pas
NullPointerException Un programme essaye d’appliquer la valeur
null alors qu’un objet est attendu
MalformedURLException Indication d’une URL inexistante (également
pour les fautes de frappe)
2 Programmes Java
Un programme Java est un fichier dont le code source a pour extension .java.
Après compilation à l'aide de la commande javac l'on obtient un fichier .class qui
soit est interprétable par l'interpréteur java pour les applications ou insérable dans
une page HTML pour les applets.
Si une des fonctions et une seule est main( ) l'application est exécutable par
l'interpréteur java à l'aide de la commande java. Dans le cas contraire l'application
est considérée comme une classe et elle peut être utilisée par une application.
Le profil de la méthode main( ) est :
public static void main( String argv[])
Le paramètre argv est un tableau de chaînes de caractères. Ce tableau est initialisé
avec les chaînes accompagnant (éventuellement) la commande de lancement.
Fonction java
endsWith( ) Recherche si le mot se termine par le ou les caractères
passés en paramètres
startWith( ) Recherche si le mot commence par le ou les caractères
passés en paramètres
charAt( ) Recherche le caractère placé à la position spécifiée en
paramètre. Le premier caractère occupe la position et le
dernier la position
IndexOf( ) Localise un caractère ou une sous-chaine d'un mot à
partir du début du mot. Renvoie la valeur –1 si le
caractère ou la chaîne ne fait pas partie du mot.
castIndexof( ) Localise un caractère ou une sous-chaine d'un mot à
partir de la fin du mot. Renvoie la valeur –1 si le
caractère ou la chaîne ne fait pas partie du mot.
subString( ) Extrait une sous-chaine d'un mot
compareTo( ) .•Nulle si les deux mots sont égales
•Inférieur à 0 si le premier mot est plus grand
•Supérieur à 0 si le premier mot est plus petit
equals( ) True si les deux mots sont identiques False
dans le cas contraire
equalsIgnoreCase( Equals (sans différentiation de minuscules
) et majuscules)
toLowerCase( ) Transforme en minuscule la chaîne sur laquelle la
méthode est appliquée
toUpperCase( ) Transforme en majuscule la chaîne sur laquelle la
méthode est appliquée
concat( ) Concatène la chaîne spécifiée en java à la suite de la
chaîne sur laquelle la méthode est appliquée
replace( ) Remplace systématiquement dans la chaîne sur laquelle
la méthode est appliquée tous les caractères donnés en
premier argument par le caractère donné en 2nd
argument
length( ) Calcule le nbre de caractères de la chaîne sur laquelle la
méthode est appliquée
La librairie Math
Fonction java
Math.cos()
Math.sin()
Math.tan()
Math.log()
Math.exp()
Math.floor() Arrondir à l'entier inférieur
Math.ceil() Arrondir à l'entier supérieur
Math.sqrt()
Math.pow() ab
Math.abs()
Math.max()
Math.min()
Math.random() Nombre au hasard entre 0 et 1
-Notion de dictionnaire
Il est possible de désigner les classes par leur nom court, sans préciser le
paquetage, à condition d’utiliser la directive import.
import nom_de_package.* ; // désigner toutes les classes du paquetage import
nom_de_package.classe ;
A.java B.java
package p1 ; package p1 ;
La compilation des fichiers A.java et B.java crée le paquetage p1 qui contient les
classes A et B. Il faudrait en plus créer un répertoire p1 dans lequel on placera les
classes compilées A.class et B.class. Ce répertoire doit être désigné par la variable
d’environnement PATH ou CLASSPATH comme répertoire de recherches de
paquetages. Avec l’option –d <répertoire>, le compilateur javac place
automatiquement les classes créées dans les répertoires qu’il faut.
Par exemple : javac –d . A.java, placera la classe A.class dans le répertoire p1 du
répertoire courant désigne par le point (.).
2.4. Entrées/Sorties
System est une classe du paquetage java.lang. Cette classe définit l’objet out de
la classe PrintStream pour les impressions sur écran et l’objet in de la classe
InputStream pour les lectures au clavier.
Chaque classe dispose de la méthode toString(xxx val) qui convertit une valeur
val de type xxx (short, byte, int, float ou double) en type String. Il existe aussi le
méthode xxxValue() qui retourne la valeur en tant que type xxx et la méthode
valueOf(String s) qui retourne un objet de la classe. Ces deux méthodes
permettent de convertir une chaîne de caractère s en un type xxx.
Par exemple :
x=0.0f ; x=Float.valueOf(s).floatValue();
convertit la chaîne s en type float.
Ils utilisent les stream FileReader (pour la lecture dans un fichier) et FileWriter
(écriture dans un fichier). Ces deux classes possèdent 3 constructeurs. Les 2
principaux constructeurs s'utilisent avec:
un objet de type file une
chaîne de caractères
Ainsi, l'on peut écrire la
déclaration suivante
FileReader entrée = new FileReader(new File("fichier.text")).
Ou bien
FileReader entrée = new FileReader("fichier.text")
La classe BufferedReader contient une méthode readLine( ) qui lit une ligne de
texte jusqu'au caractère "fin de ligne" exclus et le résultat est affecté à une chaîne
de caractères. null est retourné en fin de fichier.
Permettent de lire une ligne dans le fichier dont le nom est contenu dans la variable
nom de fichier.
La classe BufferedWriter utilise pour sa construction des objets de type
OutPutStreamWriter et FileWriter, qui s'utilisent de la même que dans la classe
BufferedReader.
La classe BufferedWriter dispose de la méthode newLine( ) qui permet d'écrire
le caractère fin de ligne.
Pour sérialiser un objet dont le type est défini par le programmeur, il est nécessaire
de le rendre sérializable en réalisant une implémentation de l'interface
Serializable pour cet objet, par la syntaxe suivante:
Ainsi, tous les objets déclarés de Exemple peuvent être lus ou écrit dans des
fichiers d'objets. Toutes les informations relatives à l'objet seront placées dans un
flux à l'exception des variables de classe définie en static qui sont communes à
tous les objets.
Les streams objectOutPutStream et objectInPutStream sont respectivement
généralement enveloppé dans un FileOutPutStream et FileInPutStream. Il existe
également les classes BufferInPutStream et BufferedOutPutStream qui permet
la lecture et l'écriture de données Objet à l'aide d'un tampon.
2.5. Exercices
Fiche de TD exercices 1, 2, 3 et 4
3 Héritage et Interface
3.1. Héritage
Par exemple :
class Personne {
String nom ;
int age ;
Personne (String lenom, int lage) {nom=lenom ; age=lage ;}
}
class Salarie extends Personne {
int salaire ; int prime() {return
salaire*age/100 ;} Salarie (String n, int s)
{super(n); salaire=s;}
}
Class Eleve extends Personne{
String classe;
boolean bourse;
Eleve (String ch, int n, String cl, Boolean b) {super(ch, n);
classe=cl; bourse=b;}
Eleve (String ch, int n, String cl) {super(ch,n); classe=cl; bourse=false;}
}
Remarquons que les membres de la classe Personne sont définis sans aucun
attribut : de tels membres sont accessibles par les classes qui font partie du même
paquetage, et inaccessibles par les autres. Les attributs : public : définit des
membres accessibles par toutes les classes.
protected : définit des membres accessibles par toutes les classes dérivées
(héritières), et les classes du même paquetage, inaccessibles par les autres.
private : définit des membres inaccessibles par toutes les classes, accessibles que
par les membres de la classe.
Compatibilité entre types : le fait qu’un type B hérite d’une type A signifie que B
est un sous-type de A, c’est-à-dire qu’un objet de type B est également de type A.
par exemple, un Salarié est également une Personne. Donc toute opération
applicable au type A est également applicable au type B. le type B est dit plus
précis que A, et A plus vague que B.
La règle générale de compatibilité de types peut être informellement énoncée ainsi
: partout où une expression de type A est attendue, une expression de type plus
précis que A est acceptable. En revanche, l’inverse est interdit. Cette règle
s’applique essentiellement en deux circonstances : en partie droite d’une
affectation ou bien en que paramètre effectif de procédure. Par exemple, avec les
déclarations suivantes :
Quand une méthode est redéfinie dans une classe fille, l’héritage est supprimé.
Pour faire appel à la méthode de la classe mère il faudrait écrire :
super.Methode_classe_mere
Les méthodes virtuelles permettent de prévoir des opérations similaires sur des
objets d’espèces différentes. On les appelle également méthodes différées pour
insister sur le fait qu’elles sont destinées à être définies ou redéfinies pour chaque
sous-espèce d’objets que l’on inventera ultérieurement.
En Java, toute méthode est potentiellement virtuelle, sauf si on lui donne l’attribut
final, auquel cas elle ne pourra être redéfinie par les classes dérivées.
En Java, une classe peut annoncer une méthode sans la définir. Une telle classe
est dite abstraite et elle doit être introduite par le mot clé abstract. Les méthodes
qui ne sont pas définies sont également qualifiées abstract et seul leur profil est
indiqué. Syntaxe :
abstract class A { class B extends A {
… …
abstract void p( ) ; void p( ) { … }
… …
void q( ) { … } void q( ) { … }
} }
La classe A annonce mais ne définit pas la méthode p. C’est une classe abstraite.
La classe dérivée B définit p et redéfinit q.
Une classe abstraite n’ayant pas toutes ses méthodes définies, il est interdit de
créer des objets de ce type.
Java n’offre vraiment pas les types génériques, mais permet de les réaliser, au
moyen de la classe object et du typage forcé (coercition explicite ou cast). La
classe objet est la classe dont héritent implicitement toutes les classes
programmées en Java. Ainsi pour définir des données de type quelconque, il suffit
de structurer des objets de type object.
Exemple
Soit à définir une classe Personne avec les membres nom et age de statut privé et
nbre_enf (nombre d’enfants) de statut public. On définira un constructeur qui
permettra d’initialiser les membres nom et age, et une méthode publique plusage
renvoyant un booléen (vrai - si la personne courante est plus âgée qu’une personne
x passée en paramètre).
Définir une sous classe de Personne appelée Travailleur qui a les membres
supplémentaires lieu (lieu de travail) statut public, salaire statut privé, prime qui
retourne la prime calculée dont la valeur est le salaire proportionné à 10% du
nombre d’enfants. On redéfinit le membre plusage qui compare cette fois ci le
salaire du travailleur courant avec un autre ; on définit enfin une méthode
plusancien qui compare l’âge du travailleur courant avec un autre.
Définir une classe TestPersonne contenant la méthode main() dans laquelle on
initialisera des Personnes et des Travailleurs, ensuite on affichera qui est plus
ancien ou plus âgé que qui.
Certains langages comme C++, permettent l’héritage multiple : une classe peut
hériter de plusieurs classes. Ce n’est pas le cas de Java où une classe ne peut hériter
que d’une seule classe.
Cependant Java offre la notion d’interface, notion voisine, plus simple et
suffisante dans les cas usuels.
méthode, ni aucun composant variable. Il n’y figure que le profil des méthodes et
éventuellement des déclarations de constantes.
Une classe peut ″implémenter″ une ou plusieurs interfaces (mot clé implements),
en définissant les méthodes de ces interfaces. La syntaxe est :
[public] class Nom_de_classe implements Nom_interface { … }
Les interfaces sont abstraites, cela signifie que, à l’instar des classes, elles ne
peuvent être instanciées. Par contre, il faut redéfinir dans la classe toutes les
méthodes d’une interface implémentée.
3.3. Exercices
Fiche de TD exercices 4 et 5