Algorithmique et initiation à la programmation Java
Transcription
Algorithmique et initiation à la programmation Java
DEUST 2 Rattrapage java O. Auzende 2010 - 2011 1. INTRODUCTION .................................................................................................... 3 2. ELEMENTS DE PROGRAMMATION JAVA .......................................................... 3 Notion de variable ................................................................................................................................................. 3 Affectation ............................................................................................................................................................. 3 Types de données primitifs en Java ..................................................................................................................... 4 Exercices ................................................................................................................................................................ 5 Test if … else.......................................................................................................................................................... 5 Exercices ................................................................................................................................................................ 5 Tableaux................................................................................................................................................................. 6 Boucles ................................................................................................................................................................... 6 Sauts ....................................................................................................................................................................... 8 Exercices ................................................................................................................................................................ 8 3. JAVA, LANGAGE A OBJETS ............................................................................... 9 Classes et instances................................................................................................................................................ 9 Attributs et méthodes d’instances...................................................................................................................... 11 Attributs et méthodes de classes ........................................................................................................................ 11 4. LES PAQUETAGES JAVA .................................................................................. 12 Qu’est-ce qu’un paquetage ? .............................................................................................................................. 12 java.lang ............................................................................................................................................................... 12 Exercices .............................................................................................................................................................. 13 java.util ................................................................................................................................................................ 13 Exercices .............................................................................................................................................................. 13 La notion d’héritage............................................................................................................................................ 15 Les interfaces ....................................................................................................................................................... 15 Les classes d’exceptions ...................................................................................................................................... 15 Exercices .............................................................................................................................................................. 15 2 Langage à Objets : Java 1. Introduction Java est un langage de programmation, développé par la société SUN depuis 1995 pour assurer la por tabilité des programmes sur une large gamme de machines. La plupart des langages de programmation ne permettent pas d’écrire des applications (non destinées au Web) por tables : en effet, les applications ne peuvent être exécutées que sur un seul système d’exploitation, celui de la machine sur laquelle les codes sources ont été compilés (exemples : les applications C, C++, Fortran, Pascal). Pour assurer la portabilité des applications java, le code source d’une application est transformé par un compilateur appelé javac en un « pseudo-code » non exécutable, qui est le même quel que soit le système d’exploitation de l’ordinateur sur lequel on travaille. Transféré sur un autre système d’exploitation, le pseudo-code est lu par un inter pr éteur appelé java, qui ne vérifie plus la syntaxe des instructions mais exécute directement le pseudo-code. Les applications java sont alors por tables. Schéma : SUN fournit un ensemble compilateur + inter pr éteur + libr air ies d’utilitair es pour chaque système d’exploitation. 2. Eléments de programmation Java Notion de variable La notion de var iable en informatique est assez proche de la notion mathématique. En mathématiques, x = 5 veut dire que la variable x vaut 5. En informatique, x est le contenu d’un emplacement-mémoire dont la taille (nombre de bits qui composent cet emplacement) dépend de ce qu’on veut y stocker (un caractère prend moins de place qu’un entier, un entier prend moins de place qu’un réel…). Le contenu de cet emplacement-mémoire peut constamment être changé. On précise donc (syntaxe java) : int x ; x = 5 ; x = 7 ; float y ; y = 3.5 ; (réservation de place-mémoire pour un entier) (on y met la valeur 5) (on remplace 5 par 7 dans le même emplacement mémoire) (réservation de place-mémoire pour un réel) (on y met la valeur 3.5) Ces lignes peuvent être résumées en : int x = 5 ; x = 7 ; (réservation de place-mémoire pour un entier. On y met la valeur 5 puis 7) float y = 3.5 ; (réservation de place-mémoire pour un réel et on y met la valeur 3.5) Affectation Les instructions x = 5 ; x = 7 ; y = 3.5 ; donnent des valeurs aux emplacements-mémoire x et y. Ces instructions sont appelées des affectations. L’écriture a = b correspond à a b et doit se lire a “r eçoit” la valeur de b. 3 On peut affecter à une variable x : o une valeur : x = 5 ; o la valeur d’une autre variable : y = 3 ; x = y ; o le résultat du calcul d’une expression : y = 3 ; z = 4 ; x = y + z ; Types de données primitifs en Java En Java, il y a 8 types de données primitifs. Ce sont les types : o o o o o o o o boolean char byte short int long float double : true et false : caractère : petit entier stocké sur 8 bits : entier court stocké sur 16 bits : entier “normal” stocké sur 32 bits : entier long stocké sur 64 bits : réel simple stocké sur 32 bits : réel double précision stocké sur 64 bits L’instruction boolean fini = false ; définit une variable fini de type booléen et de valeur false. L’instruction int i = 254256 ; définit une variable i de type entier, stockée sur 32 bits et de valeur 254256. L’instruction long l = 25425645987 ; définit une variable l de type entier long, stockée sur 64 bits et de valeur 25425645987. L’instruction float f = 156.256 ; définit une variable f de type flottant, stockée sur 32 bits et de valeur 156.256. L’instruction double t = 1/3 ; définit une variable t de type réel, stockée sur 64 bits et de valeur 0.333333333… Opérateurs de cast L’opérateur de “cast” force la conver sion d’un type de données en un autre. Selon le cas, on peut perdre de la précision. Exemples : float f = 156.256 ; int j = (int) f ; j est alors un entier valant 156 double t = 1/3; float d = (float) t; t est stocké sur 64 bits, d est stocké sur 32 bits Première application Java Ouvrez avec WordPad ou le bloc-notes le fichier Programme.java (attention, première lettre en majuscule) qui se trouve dans le dossier programme. Comme tous les fichiers source java, c’est un fichier sauvegardé en format texte uniquement. Son contenu est : public class Programme { public static void main(String args[]) { int a=25; int b=76; System.out.println("a vaut : " + a); System.out.println("b vaut : " + b); } } Tout programme java est nécessairement contenu dans une classe. Lorsque le programme ne comporte qu’une seule classe, celle-ci doit être déclarée public afin d’être accessible à tout utilisateur. Le programme proprement dit figure dans une méthode appelée main nécessairement déclarée sous la forme : public static void main(String[] args) . Tout programme contenant une méthode main est une application. Remarques o static indique que main est une méthode de classe (il y a d’autres types de méthodes) o String[] args permet de passer des informations à la méthode main, sous forme d’un tableau de chaînes de caractères de type String[]. On utilise cette possibilité quand on veut passer des paramètres à la méthode main. o System.out.println(chaîne) fait afficher à l’écran la chaîne de caractères. Pour construire une chaîne à partir de plusieurs morceaux, on concatène les morceaux en utilisant le signe + 4 Langage à Objets : Java Compilation : commande javac Programme.java (création du pseudo-code) Exécution : commande java Programme (interpréation du pseudo-code) Exercices o o o Ajoutez au main de la classe Programme les lignes permettant de déclarer deux entiers c et d, de calculer c=a+b et d=a*b, puis de faire afficher les valeurs de c et de d. Compilez et faites exécuter le fichier ainsi modifié. On voudrait à présent que a, b, c et d puissent être des réels de type primitif double et non plus des entiers. Modifiez la classe Programme en conséquence, en prenant cette fois a=4.56 et b=-8.65. Compilez le fichier Programme.java ainsi modifié et faites-le exécuter. On veut faire afficher en fin de programme « valeur entiere de d : » puis la partie entière de d. Utilisez un opérateur de cast pour obtenir ce résultat. Compilez le fichier Programme.java ainsi modifié et faites-le exécuter. Test if … else Il permet de faire des traitements différenciés. Il s’écrit : if (test) { instructions; } else { instructions; } La clause else est facultative. On peut avoir simplement : if (test) { instructions ; } Exemple : fichier Programme1.java du dossier programme1. Deux nombres a et b sont tirés au sort entre 1 et 100, et on veut connaître le plus petit des deux. import java.util.Random ; public class Programme1 { public static void main(String[] args) { int a = new Random().nextInt(100) ; int b = new Random().nextInt(100) ; System.out.println("a = " + a); System.out.println("b = " + b); int min ; if (a < b) { min = a; } else { min = b; } System.out.println("le minimum de a et b est " + min); } } Egalité, inégalité Le symbole = étant réservé à l’affectation, on teste l’égalité de deux variables a et b en écrivant : if (a == b) … qui se lit : si (a = b) ... On teste l’inégalité de deux variables a et b en écrivant : if (a != b) … qui se lit : si (a ≠ b) ... Conjonction, disjonction La conjonction ET s’écrit && Ainsi, tester si (a=b) et (c=d) s’écrit : if ((a==b) && (c==d)) La disjonction OU s’écrit | | Ainsi, tester si (a=b) ou (c=d) s’écrit : if ((a == b) | | (c == d)) Exercices 1) Transformez le fichier Programme1.java de la manière suivante et complétez-le afin qu’il affiche le minimum de TROIS nombres a, b et c : import java.util.Random ; public class Programme1 { public static void int a = new int b = new int c = new main(String[] args) { Random().nextInt(100) ; Random().nextInt(100) ; Random().nextInt(100) ; 5 System.out.println("a = " + a); System.out.println("b = " + b); System.out.println("c = " + c); int min ; if ... // détermination du minimum de a,b et c System.out.println("le minimum de a, b et c est " + min); } } 2) Ecrivez un programme qui génère aléatoirement trois nombres a, b et c entre 1 et 50 et qui dit si l’un de ces trois nombres est supérieur à 45. Tableaux Les tableaux sont des collections de variables de même type, en nombr e fixé. On doit d’abord les déclar er , puis faire l’allocation de mémoir e nécessair e avant de les utiliser. Exemples : int [] t ; t = new int[20] ; char [] tab ; tab = new char[40] ; String [] t1 ; t1 = new String[10] ; // // // // // // déclaration création de déclaration création de déclaration création de d’un tableau d’entiers t t en mémoire d’un tableau tab de caractères tab en mémoire d’un tableau t1 de chaînes t1 en mémoire On accède à l’élément d’indice i de t par t[i], les indices commençant à 0. Une fois qu’un tableau est créé, sa taille ne peut plus êtr e changée. Exemple : Tableau.java, du dossier tableau, crée un tableau des mois de l’année et le fait afficher. public class Tableau { public static void main(String[] args) { String[] t = new String[12] ; t[0]="janvier"; t[1]="fevrier"; t[2]="mars"; t[3]="avril"; t[4]="mai"; t[5]="juin";t[6]="juillet"; t[7]="aout"; t[8]="septembre"; t[9]="octobre"; t[10]="novembre"; t[11]="decembre"; System.out.println("Les mois de l'annee sont : "); System.out.println(t[0]); System.out.println(t[1]); System.out.println(t[2]); System.out.println(t[3]); System.out.println(t[4]); System.out.println(t[5]); System.out.println(t[6]); System.out.println(t[7]); System.out.println(t[8]); System.out.println(t[9]); System.out.println(t[10]);System.out.println(t[11]); } } Boucles Boucle for La boucle for permet de répéter un certain nombre de fois des instructions. Elle s’écrit : for (initialisation; test_continuation; incrémentation) {instructions;} o L’initialisation permet de préciser la variable qui contrôle la boucle et de l’initialiser. Exemple : int i=0 o Le test de continuation dit quel est le test qui doit être vérifié pour que la boucle continue. Exemple : i < 20 o L’incrémentation précise comment évolue la variable de contrôle. Généralement on écrit i++ qui veut dire i=i+1 (on passe de i à i+1, donc d’une valeur de la variable à la suivante). Exemple : Tableau1.java, du dossier tableau1, permet de réduire les instructions à une seule boucle : public class Tableau1 { public static void main(String[] args) { String[] t = new String[12] ; t[0]="janvier"; t[1]="fevrier"; t[2]="mars"; t[3]="avril";t[4]="mai"; t[5]="juin"; t[6]="juillet"; t[7]="aout"; t[8]="septembre"; t[9]="octobre"; t[10]="novembre";t[11]="decembre"; System.out.println("Les mois de l'annee sont : "); for (int i = 0 ; i < 12; i++) { System.out.println(t[i]); } } } 6 Langage à Objets : Java Dans le programme Tableau2.java, du dossier tableau2, on utilise deux boucles for : une pour initialiser le tableau, l’autre pour le faire afficher : public class Tableau2 { public static void main(String[] args) { double[] t = new double[20] ; for (int i = 0 ; i < 20 ; i++) { t[i] = i ; } for (int i = 0; i < 20 ; i++) { System.out.print(t[i] + " * "); } } } La variable i est déclarée dans chaque boucle. o Entre les deux boucles, i n’existe pas o On dit que sa portée se limite à la boucle en cours Dans le programme Tableau2b.java du même dossier tableau2, la variable i est déclarée dans le main. o La portée de i est alors la méthode main toute entière (i est connu dans tout le main). public class Tableau2b { public static void main(String[] args) { double[] t = new double[20] ; int i ; for (i = 0 ; i < 20 ; i++) { t[i] = i ; } for (i = 0; i < 20 ; i++) { System.out.print(t[i] + " * "); } System.out.println("\n ---> i vaut maintenant " + i) ; } } Boucle while La boucle while permet de répéter des instructions tant qu’un test est vérifié. Elle s’écrit : while (test) { instructions ; } Les instructions doivent modifier au moins une variable intervenant dans le test, pour que le while ne boucle pas indéfiniment. Exemple : afficher les éléments d’un tableau de nombres t tant que ces éléments sont inférieurs à 20. int i = 0 ; while (t[i] < 20) { System.out.print(t[i] + " ") ; i++ ; } i est modifié dans les instructions, donc t[i] correspond à chaque passage à un élément différent du tableau t. Attention cependant à ne pas dépasser la taille du tableau ! Si le tableau est de taille n, il faut écrire : int i = 0 ; while ((i < n) && (t[i] < 20)) { // && est la notation pour ET System.out.print(t[i] + " ") ; i++ ; } Boucle do … while Elle permet de faire exécuter une première fois des instructions puis de recommencer tant qu’un test est vérifié. Elle s’écrit : do { instructions ; } while (test); Ces instructions doivent modifier au moins une variable du test, pour que le do … while ne boucle pas indéfiniment. 7 Exemple : afficher le 1er élément du tableau t, puis les suivants tant qu’ils sont inférieurs au premier : int i = 0 ; do { System.out.print(t[i]+ " "); i++ ; } while ((i<n)&&(t[i]<t[0])); Sauts break L’instruction break permet de sauter tous les cas suivants, en reprenant l’exécution directement après le test ou la boucle (on saute donc tous les cas suivants). Exemple : afficher les éléments du tableau t tant qu’ils sont inférieurs à 20. On arrête donc dès qu’on rencontre un élément supérieur ou égal à 20. C’est équivalent à la boucle while ci-dessous : for (int i = 0 ; i < n ; i++) { if (t[i]<20) { System.out.print(t[i]+" * "); } else { break ; } } int i = 0 ; while ((i<n) && (t[i] < 20)) { System.out.print(t[i]+" * ") ; i++ ; } continue L’instruction continue permet de sortir d’un pas d’itération en reprenant l’exécution à l’itération suivante. On arrête donc les instructions de l’itération en cours pour passer directement à la suivante. Exemple : afficher tous les éléments du tableau t qui sont différents de 20. Deux versions, selon que l’on teste si t[i] est égal à 20 ou est différent de 20 : for (int i = 0 ; i < n ; i++) { if (t[i] == 20) { continue ; } else { System.out.print(t[i]+" * "); } } for (int i = 0 ; i < n ; i++) { if (t[i] != 20) { System.out.print(t[i]+ " * "); } else { continue ; } } return L’instruction return permet de sortir d’une méthode sans nécessairement attendre la fin de celle-ci. Cette instruction ne peut donc pas figurer directement dans le main, mais sera très largement utilisée par la suite. Exercices 1) Ouvrez le fichier Tableau3.java du dossier tableau3 avec WordPad. public class Tableau3 { public static void main(String[] args) { double[] t ; int n = 20 ; t = new double[n] ; for (int i = 0 ; i < n ; i++) { t[i] = i ; } for (int i = 0; i < n ; i++) { System.out.print(t[i] + " * "); } } } (1) Ajoutez après la ligne (1) une boucle while pour faire afficher les éléments du tableau t tant que ceux-ci sont inférieurs à 12. Compilez et exécutez. 8 Langage à Objets : Java 2) Faites exécuter plusieurs fois de suite le programme Tableau4 du dossier tableau4. Ouvrez ensuite le fichier avec WordPad : public class Tableau4 { public static void main(String[] args) { int n=20 ; double[] t = new double[n] ; java.util.Random r = new java.util.Random(); for (int i = 0 ; i < n ; i++) { t[i] = r.nextInt(50) ; } for (int i = 0; i < n ; i++) { System.out.print(t[i] + " * "); } } } (1) (2) (3) Ce programme fait appel à un générateur de nombres aléatoires appelé r, qui est créé par la ligne (1) : java.util.Random r = new java.util.Random(); r génère successivement 20 nombres entiers tous compris entre 0 et 50 car à la ligne (2) r.nextInt(50) fournit à chaque fois un entier aléatoire compris entre 0 et 50 3) Ajoutez après la ligne (3) une boucle do … while pour faire afficher le premier élément du tableau tab, puis les éléments suivants tant que ceux-ci sont inférieurs ou égaux au premier élément. Compilez et exécutez. 3. java, langage à objets Classes et instances Un programme java peut ne contenir qu’une seule classe, comme on l’a vu jusqu’à présent. Cette classe, qui contient alors la méthode main, constitue à elle toute seule toute l’application. Mais java est avant tout un “langage à objets”, ce qui veut dire qu’une classe peut aussi être un moule à partir duquel on peut fabr iquer des objets qu’on appelle des instances. On souhaite créer des « objets » comportant : o un entier n qui représente la taille d’un tableau o un tableau t de n entiers comportant les entiers 1, 2, 3, … n Exemple de deux tels objets : La classe (encore embryonnaire) correspondant à ces objets est la suivante : class ObjetTableau { // début de la classe int n ; // deux attributs : n entier int[] t ; // et t tableau d’entiers } // fin de la classe Cette description signifie que tout objet de la classe ObjetTableau, dès qu’il ser a cr éé, comportera automatiquement deux var iables (qu’on appellera des attr ibuts) n et t. 9 Une classe correspond donc à la description d’un ensemble d’objets ayant une structure de données commune. Les objets créés selon ce modèle sont appelés des instances de la classe. Pour donner des valeurs aux attributs, donc remplir n et t, on doit ajouter dans la classe ObjetTableau une méthode spécifique appelée constructeur : class ObjetTableau { int n ; int[] t ; // début de la classe // deux attributs : n et t ObjetTableau(int a) { // le constructeur n = a ; // n prend la valeur a t = new int[n] ; // on réserve la place pour t for (int i=0 ; i < n ; i++) { t[i] = i+1 ; // remplissage de t } } // fin du main } // fin de la classe Créer des objets de la classe ObjetTableau se fait ailleurs, dans une autr e classe qui sert de programme principal : public class ProgObjet { public static void main (String args[ ]) { ObjetTableau obj1 = new ObjetTableau(6); ObjetTableau obj2 = new ObjetTableau(3); } } // début de classe // le main // fin du main // fin de classe Ce programme crée bien les deux objets en mémoire, mais n’affiche RIEN. o On ajoute donc à la première classe une méthode void affiche() affichant les éléments du tableau t et une méthode int inferieurs(int p) calculant le nombre d’éléments du tableau t inférieurs à p class ObjetTableau { int n ; int[] t ; // début de la classe // deux attributs : n et t ObjetTableau(int a) { n = a; t = new int[n] ; for (int i=0;i<n;i++) { t[i] = i+1 ; } } // // // // le constructeur n prend la valeur a on réserve la place pour le tableau t remplissage du tableau // fin du constructeur void affiche() { System.out.println("affichage des elements"); for (int i = 0; i < n; i++){ System.out.print(t[i]+" * "); } System.out.println(""); } int inferieurs(int p) { int compteur = 0 ; for (int i = 0; i < n; i++){ if (t[i]<p) compteur++ ; } return compteur ; } } o // fin de la classe On ajoute à la seconde classe, les instructions demandant aux deux objets créés d’effectuer leurs deux méthodes : public class ProgObjet { // classe principale public static void main (String args[ ]) { ObjetTableau obj1 = new ObjetTableau(6); obj1.affiche(); 10 // main // affichage de obj1 Langage à Objets : Java } // on recherche le nb d’elements < 3 System.out.print("Nb elements inferieurs a 3 : "); System.out.println(obj1.inferieurs(3)) ; // nb d’elements < 3 ObjetTableau obj2 = new ObjetTableau(3); obj2.affiche(); // affichage de obj2 // on recherche le nb d’elements < 4 System.out.print("Nb elements inferieurs a 4 : "); System.out.println(obj2.inferieurs(4)) ; // nb d’elements < 4 } // fin du main // fin de classe Les méthodes affiche et inferieurs ne peuvent être exécutées que par des objets : ce sont des méthodes d’instances. void affiche() affiche les éléments, mais ne calcule rien, d’où son type de valeur de retour : void int inferieurs(int p) calcule le nombre d’éléments de t strictement inférieurs à p o int (valeur de retour) indique que le résultat est un entier (valeur du compteur) o int p est l’argument de la méthode o return permet de renvoyer la valeur du compteur Le fichier comporte deux classes : ObjetTableau et ProgObjet. Il y aura donc deux fichiers compilés. Il s’agit d’une application, car il y a dans une des classes une méthode appelée main. La classe principale est celle qui comporte la méthode main ; elle doit impérativement être déclarée public. On l’appelle souvent aussi classe maître de l’application. Le fichier doit porter le nom de cette classe maître, suivi de l’extension .java. Ce sera donc ici ProgObjet.java Attributs et méthodes d’instances Une classe peut être un moule permettant de construire des objets (ce n’est pas obligatoire). Mais un objet est nécessairement créé à partir d’une classe, à l’aide d’un constructeur de cette classe ; on dit alors que l’objet est une instance de la classe et qu’il est du type de la classe. Un objet comporte des attr ibuts d’instance et dispose de méthodes d’instance, définis dans la classe. Ainsi, dans la classe ObjetTableau, o n et t sont des attributs d’instance o les méthodes void affiche() et int inferieurs(int p) sont des méthodes d’instance Attributs et méthodes de classes Une classe peut aussi comporter des attr ibuts de classe et des méthodes de classe. Ils sont signalés par le mot-clé static et existent dès le début de l’application, même si aucun objet de la classe n’a encore été créé. Seule exception : le constr ucteur est une méthode de classe, même s’il n’est pas précédé de static. Exemple d’utilisation d’un attribut de classe et d’une méthode de classe pour compter les objets créés : Attribut de classe : static int nbobjets o initialisé au lancement de l’application o modifié dans le constructeur Méthode de classe : static void nombreObjets() o appelée dans le programme principal sur le nom de la classe : ObjetTableau.nombreObjets(); 11 class ObjetTableau { static int nbobjets = 0; // initialisation du compteur int n ; int[] t ; ObjetTableau(int a) { n = a; t = new int[n] ; for (int i=0;i<n;i++) { t[i] = i+1 ; } nbobjets++ ; // incrémentation du compteur } void affiche() { System.out.print("affichage d'un objet : "); for (int i = 0; i < n; i++){ System.out.print(t[i]+" * "); } System.out.println(""); } static void nombreObjets() { // méthode de classe System.out.println("Nombre d'objets : " + nbobjets) ; } } public class ProgObjet1 { // début de classe public static void main (String args[ ]) { // le main ObjetTableau.nombreObjets() ; // appel à la méthode de classe ObjetTableau obj1 = new ObjetTableau(6); obj1.affiche(); // affichage de obj1 ObjetTableau.nombreObjets() ; // appel à la méthode de classe ObjetTableau obj2 = new ObjetTableau(10); obj2.affiche(); // affichage de obj2 ObjetTableau.nombreObjets() ; // appel à la méthode de classe } // fin du main } // fin de classe 4. Les paquetages Java Qu’est-ce qu’un paquetage ? Les paquetages (packages) sont des librairies de classes, de classes d’exceptions et d’inter faces regroupées selon leur fonction. La documentation concernant chaque paquetage est stockée sous forme de pages HTML dans le dossier docs du JDK. java.lang Le paquetage java.lang est le seul paquetage dont l’emploi ne doit jamais être déclaré. Il comprend notamment la classe Object, la classe System, les classes enveloppantes, la classe Math et la classe Str ing. La classe Object est à l’origine de toutes les classes. Si on ne précise pas de clause d’héritage en définissant une nouvelle classe, celle-ci hérite de Object. La classe System contient des variables et des méthodes du système. Les classes enveloppantes : les variables des types de données primitifs (int, char, double, etc) sont les seuls éléments qui ne sont pas des objets dans Java. Mais on peut, en cas de besoin, les transformer en objets à l’aide de classes enveloppantes suivantes : type nature classe enveloppante boolean true ou false Boolean char caractère 16 bits Character byte entier 8 bits signé (petit entier) Byte short entier 16 bits signé (entier court) Short int entier 32 bits signé (entier) Integer long entier 64 bits signé (entier long) Long float virgule flottante 32 bits (réel simple) Float double virgule flottante 64 bits (réel double) Double 12 Langage à Objets : Java Exemples d’utilisation : int n = 5 ; Integer obj1 = new Integer(n) ; double f = 1/3 ; Double obj2 = new Double(f) ; // // // // n n’est pas obj1 est un f n’est pas obj2 est un un objet objet un objet objet La classe Math contient les méthodes nécessaires (méthodes de classe) pour les calculs mathématiques. Exemple : double j = -3.145 ; double k = Math.abs(j) ; La classe Str ing contient de très nombreuses méthodes d’instance pour le traitement des chaînes de caractères. Exercices 1) Compilez le fichier Test1.java du dossier test1, dont le texte est donné ci-dessous, et faites-le exécuter. Regardez ce que renvoie chaque méthode. public class Test1 { public static void main(String args[]) { String s1 = "Bonjour" ; System.out.println("s1 vaut "+s1+" et est de longueur "+s1.length()); char c = s1.charAt(3) ; System.out.println("La caractere au 3eme indice est : " +c) ; String s2 = s1.toUpperCase(); if (s1.equalsIgnoreCase(s2)) { System.out.println("s1 et s2 sont equivalents"); } String s3=" et bonne journee" ; String s4 = s2.concat(s3) ; System.out.println("s4 vaut : " + s4); String s5 = "bon" ; int pos = s4.indexOf(s5) ; if (pos == -1) System.out.println("s4 ne contient pas s5"); else System.out.println("s4 contient s5 a l’indice "+pos); String s6 = s4.substring(3, 8); System.out.println("entre les indices 3 et 8 de s4 on trouve "+s6); } } 2) Ecrivez un programme qui initialise une chaîne de caractères s avec « Le sanglot long des violons de l’automne berce mon coeur d’une langueur monotone », qui la découpe en mots et fait afficher un mot par ligne. java.util Le paquetage java.util contient des classes utilitaires : Calendar , Gr egor ianCalendar , Random… Pour utiliser une partie d’un paquetage autre que java.lang, on utilise le mot-clé impor t : o import java.util.GregorianCalendar ; on se donne le droit d’utiliser la classe GregorianCalendar (qui permet de créer des objets de type date (jourmois-année-heure-minute-seconde…) o import java.util.Random ; on se donne le droit d’utiliser la classe Random o import java.util.* ; on se donne le droit d’utiliser toutes les classes du paquetage Exercices Le fichier UtilAleatoire.java du dossier utilaleatoire est le suivant : import java.util.Random ; class TableauAleatoire { static int max = 100 ; int nb ; int t[] ; // déclare que l’on veut utiliser la classe Random // // // // entier qui donne la valeur maximale des nombres aléatoires qui seront générés (variable de classe) variable d’instance : nombre d'éléments du tableau variable d’instance : un tableau d'entiers 13 TableauAleatoire(int m) { // le constructeur nb = m ; t = new int[nb] ; Random r = new Random() ; // crée le générateur de nombres aléatoires for (int i = 0 ; i < nb ; i++) { t[i] = r.nextInt(max) ; // entier aléatoire entre 0 et max } } void affiche() { // méthode d'instance réalisant l'affichage du tableau // affiche les réels du tableau t séparés par des espaces for (int i = 0; i < nb ; i++) { System.out.print(t[i]+ " ") ; } System.out.println(""); // un saut de ligne pour terminer } } public class UtilAleatoire { // le programme principal public static void main (String args[ ]) { TableauAleatoire obj1 = new TableauAleatoire(50) ; // un objet obj1.affiche() ; // appel de affiche() sur l’objet } } 1) Ajoutez à la classe TableauAleatoire deux méthodes d’instance int maximum() et int minimum() renvoyant respectivement le plus grand et le plus petit élément du tableau t. Pour tester les méthodes, modifiez la classe UtilAleatoire de la manière suivante : public class UtilAleatoire { public static void main (String args[ ]) { TableauAleatoire obj1 = new TableauAleatoire(50) ; obj1.affiche() ; System.out.println("Maximum : " + obj1.maximum()) ; System.out.println("Minimum : " + obj1.minimum()) ; } } 2) Ajoutez à la classe TableauAleatoire une méthode d’instance int somme()renvoyant la somme des éléments du tableau t. Complétez le main en conséquence : public class UtilAleatoire { public static void main (String args[ ]) { TableauAleatoire obj1 = new TableauAleatoire(50) ; obj1.affiche() ; System.out.println("Maximum : " + obj1.maximum()) ; System.out.println("Minimum : " + obj1.minimum()) ; System.out.println("Somme : " + obj1.somme()) ; } } 3) Ajoutez à la classe TableauAleatoire une méthode d’instance int compteegaux(int p) renvoyant le nombre d’éléments du tableau t égaux à p. Complétez le main en conséquence pour faire afficher le nombre d’éléments égaux à 50, puis à 60 : public class UtilAleatoire { public static void main (String args[ ]) { TableauAleatoire obj1 = new TableauAleatoire(50) ; obj1.affiche() ; System.out.println("Maximum : " + obj1.maximum()) ; System.out.println("Minimum : " + obj1.minimum()) ; System.out.println("Somme : " + obj1.somme()) ; System.out.println("Nb elem egaux a 50 : " + obj1.compteegaux(50)) ; System.out.println("Nb elem egaux a 60 : " + obj1.compteegaux(60)) ; } } 14 Langage à Objets : Java La notion d’héritage On déclare qu’une classe dérive d’une autre classe par : class classe-fille extends classe-mère { ... } Si une classe B dérive d’une classe A, elle hérite des champs et des méthodes de A. Un objet de la classe fille est donc un objet de la classe mère (éventuellement complété par des champs et des méthodes supplémentaires), mais la réciproque est fausse. Toutes les classes héritent de la classe Object. Si on précise pas de clause d’héritage dans la définition d’une classe, par défaut, elle hérite de Object. Les méthodes héritées d’une classe mère A peuvent être redéfinies dans la classe fille B. Cette possibilité de redéfinir les méthodes est appelée le polymor phisme : un objet de type A et un objet de type B sont capables de répondre au même message, mais en faisant appel à des méthodes de contenus différents. Les interfaces Une interface est une sorte de classe spéciale, dont toutes les méthodes sont déclarées public et abstract (sans code). En fait, une interface pr opose des ser vices, mais sans donner le code permettant d’exécuter ces services. Une classe qui souhaite utiliser une interface le signale par le mot implements : class B implements C {…} ; On dit alors qu’elle implémente l’interface. Dans la classe B, on doit alors donner le code de toutes les méthodes de l’interface. Une classe B peut hériter d’une classe A et implémenter une ou plusieurs interfaces : class B extends A implements C, D {...} ; class A interface C, D extends implements class B Les méthodes des interfaces C et D doivent alors obligatoir ement être définies dans la classe B. Les classes d’exceptions Lorsqu’une méthode est exécutée, il peut se produire des erreurs. On dit alors qu’une exception est levée. Une exception est un objet, instance d’une des nombreuses sous-classes de la classe Exception. Chaque méthode qui risque de provoquer une ou des erreur(s) le signale par le mot thr ows suivi de la nature des erreurs susceptibles de se produire. Lorsqu’on veut utiliser une méthode risquant de provoquer des erreurs, on englobe l’appel à cette méthode dans un bloc tr y (pour capturer l’erreur) et on précise ce qu’on fera en cas d’erreur dans une clause catch. Exemple : try { fichier.read() ; } catch (IOException) { System.out.println(" erreur de lecture ") ; return ; } Les différentes classes d’erreurs possibles sont spécifiées dans chaque paquetage. Exercices Rechercher dans la documentation le paquetage java.util. 1) Combien comporte-t-il d’interfaces ? 2) Combien comporte-t-il de classes ? 3) Combien comporte-t-il de classes d’exceptions ? 4) De quelle classe la classe GregorianCalendar est-elle fille ? 5) De combien de constructeurs cette classe dispose-t-elle ? 6) Combien de méthodes d’instance cette classe propose-t-elle ? 7) Combien de méthodes de classe cette classe propose-t-elle ? 15 petite-fille ?