01- LES BASES EN JAVA Introduction DEFINITION : JAVA est un langage de programmation objet créé en 1991 par la firme Sun Microsystems. Il est très proche du langage C++. C’est un langage portable (indépendant des plates formes : windows, linux….), compilé et interprété. Java est en plus multitâche, robuste ( gestion d’erreurs et d’exceptions intégrées au langage), gratuit, orienté client/serveur (traditionnel ou web). Avec java, on peut écrire : Des applications client/serveur traditionnel Des applications côté cliente pour le web (applet) Des applications côté serveur pour le web (servlet) OUTILS NECESSAIRES : Pour écrire et mettre au point un programme, vous aurez besoin : d'un éditeur de texte. Au choix : o Les plus courants : bloc-notes, gvim, gedit o Les plus appropriés pour java : jcreator o Les spécialisés (IDE) : netbean, eclipse du kit de développement appelé J2SE SDK (Software Development Kit) contenant : o un compilateur : javac o un interpréteur : java o la machine virtuelle java appelée J2SE JRE (Java Runtime Environment ) o des utilitaires. Ex : javadoc pour générer de la documentation , jar pour générer des archives, appletviewer pour visualiser des applets,…. LIENS UTILES : Le site dédié à JAVA par son constructeur : http://java.sun.com/ Et plus particulièrement la documentation sur les classes (API) : http://java.sun.com/j2se/1.4.2/docs/api/index.html Des cours et exercices en ligne : http://java.developpez.com/cours/ PREMIER PROGRAMME : Stocker une information simple Vous connaissez déjà l’utilité des variables, mais pas toujours leurs natures. Avec JAVA, on peut manipuler des variables : Simples : entier, caractère,… Structurées ou bien dites complexes : les objets Multiples : collections, listes ou tableaux 1 MANIPULATION D’UNE VARIABLE DITE SIMPLE Java étant un langage fortement typé, contrairement à PHP, vous devez déclarer une variable avant de pouvoir l’utiliser : déclarer, c’est définir son type. Syntaxe pour définir une variable type nomVariable ; Exemple int a ; int b , c ; // a est un entier // b et c sont des entiers Remarque : On peut affecter une valeur à une variable dès sa définition : c’est une initialisation ! Exemple : int a = 3 ; Opérations possibles sur une variable dite simple On peut : appliquer toutes les opérations élémentaires : + - / * les comparer 2 à 2 à l’aide des opérateurs : > >= < <= != REGLE : toute variable doit être déclarée et initialisée avant de pouvoir être utilisée. Exemple : somme = somme + 12 // provoquera une erreur de compilation CONVENTION POUR NOMMER UNE VARIABLE Le nom d’une variable commence par une minuscule. Cette convention prend son sens en POO, car seuls les noms de classes doivent débuter par une majuscule. LA PORTEE DES VARIABLES Une variable a une durée de vie liée à sa déclaration. Exemple : si une variable est déclarée à l’intérieur d’ une structure conditionnelle, elle n’a pour durée de vie que la structure. En dehors, elle n’existe plus. .... if (a>b) { int max = a ; } else { int max = b ; } System.out.println(“le max est”+ max); // provoquera une erreur de compilation LES TYPES SIMPLES Catégorie entier Elle permet l’emploi de valeurs numériques entières et signées. Type byte short int long Taille occupée dans la mémoire 1 octet 2 octets 4 octets 8 octets 2 Eventail de valeurs De –128 à 127 De 32 768 à 32 767 De – 2 147 483 648 à 2 147 483 647 De – 9 223 372 036 854 775 808 à 9 223 372 036 854 775 807 Catégorie réel Elle permet l’emploi de nombres à virgule. Type float double Taille occupée dans la mémoire 4 octets 8 octets Eventail de valeurs -1.4*10-45 à 3.4*1038 4.9*10-324 à 1.7*10308 Catégorie texte char : il sert à représenter des caractères isolés. Un caractère est codé sur 2 octets. L’éventail des valeurs est donc de 65 536 caractères différents (2 16). ATTENTION : 'F' est considéré comme une variable de type char "F" est considéré comme un objet de classe String Catégorie logique Il s’agit du type boolean. Un caractère est codé sur 1 bit. L’éventail des valeurs est : {false, true} ce qui est traduit par {0,1} CONVERSION DE TYPES SIMPLES (CASTING) On peut facilement changer le type d’une donnée, cela s’appelle faire une opération de cast. Exemple : int x; x = (int) 8.324; Exercice : Des erreurs se cachent dans ces extraits de code, trouvez les puis corrigez les : 1. int longueur, largeur = 5, perimetre ; perimetre = longueur * largeur ; 2. int a =10, b=15 ; if (a>b) max = a; else max = b; 3. int a,b,c ; a=2; b=a; c=c+b; 4. 5. char genre ; int prix ; ….. // genre est initialisé par une saisie utilisateur if (genre == ‘A’) prix = 10 ; if (genre == ‘E’) prix = 8 ; System.out.println("Le prix est de" + prix); 6. float prix ; ….. // prix est initialisé par une saisie utilisateur if ( prix > 250 ) int prixAvecRemise = prix * 0.9 ; System.out.println("Le prix :" + prix); System.out.println("Le prix avec remise : " + prixAvecRemise); float pi = 3.14 ; int rayon = 2 ; int perimetre = 2 * pi * (rayon * rayon) ; 3 Communiquer une information AFFICHER UNE INFORMATION En mode console : System.out.println(…) System.out.print( expr ) ; // affiche à l’écran le contenu de expr System.out.println( ) ; // saute une ligne System.out.println( expr ) ; // affiche à l’écran le contenu de expr et saute une ligne System.out.println( "Mon texte" ) ; // affiche à l’écran le texte et saute une ligne System.out.println("Mon texte" + expr ) ; // affiche à l’écran le le texte et le contenu de expr Remarque : Println et print sont des méthodes (fonctions) qui ont été définies plusieurs fois de manière à fonctionner quelque soit le type de l’expression qu’on leur passe en paramètre. En mode graphique : JOptionPane.showMessageDialog(…) import javax.swing.*; ….. JOptionPane.showMessageDialog (null,"Mon texte") ; // affiche une boite de dialogue contenant le texte Remarque : La méthode showMessageDialog est définie dans la classe JOptionPane qui se situe dans le package swing qui lui même est dans un plus gros package appelé javax. Remarque : un package est une unité (un fichier) regroupant des classes. Ainsi pour utiliser, cette méthode, vous pouvez : o la préfixez par le nom des packages : javax.swing.JOptionPane.showMessageDialog (null,"texte") ; o utilisez l’instruction d’import ( cf exemple ci dessus ) Pour les méthodes print et println , cela est inutile car elles font parties des classes standards. RECUPERER UNE INFORMATION (SAISIE) En mode console : lire …(…) Tout comme en PHP, il n’existe pas de méthode prédéfinie pour lire les données saisies par l’utilisateur dans une console. Alors, vous allez utiliser les méthodes définies dans la classe Lire (classe fournie en TP). Cette classe n’est pas définie par Java. C’est un fichier que vous devrez donc avoir en permanence. static String static float static int static char Class Lire lireStr() renvoie la saisie de l’utilisateur sous forme d’une donnée de type String lireFloat() renvoie la saisie de l’utilisateur sous forme d’une donnée de type float lireInt() renvoie la saisie de l’utilisateur sous forme d’une donnée de type int lireChar() renvoie la saisie de l’utilisateur sous forme d’une donnée de type char 4 Pour les utiliser, vous devrez faire référence à la classe afin que le compilateur puisse savoir où trouver la définition de ces méthodes. System.out.println(" Entrez votre age ") ; int age = Lire.lireInt() ; En mode graphique : JOptionPane.showInputDialog(…) String nom = JOptionPane.showInputDialog (null,"Votre nom ") ; Remarque : cette méthode ne sait renvoyer que des variables de type String. Il faut alors utiliser des méthodes qui permettent de changer le type des données. Ex : String sAge = JOptionPane.showInputDialog (null,"Votre age ") ; Int age = Integer.parseInt(sAge ) ; 5 Structures conditionnelles et répétitives Les instructions conditionnelles et répétitives sont généralement les mêmes quelque soit le langage. Remarques : o L’imbrication est toujours possible o Pour former une condition, les règles sont aussi les mêmes quelque soit le langage, on utilise les opérateurs de comparaison (<,>,==, !=…) et les opérateurs logiques (&&, ||| ) o S’il n’y a qu’une seule instruction, vous n’êtes pas obligé de mettre les accolades. FAIRE DES TESTS Syntaxe if (condition ) { // instructions … } if (condition ) { // instructions … } else { // instructions … } if (condition ) { // instructions … } elseif ( condition) { // instructions … } else { // instructions … } REPETER DES ACTIONS Syntaxe while (condition) { // instructions } do {// instructions } while (condition); for ( init° cpt; condition pour continuer ; pas du cpt) {// instructions } 6 Premier objet : variable de type String Une chaîne de caractère n’est pas considérée comme une variable simple, mais comme un objet de la classe String, autrement dit une variable complexe de type String ! DECLARER UN OBJET STRING Déclaration et initialisation d’un objet de classe String String maChaine ; maChaine = new String( "toto" ) ; String maChaine = new String( "toto" ) ; Remarques : On peut aussi initialiser un objet de classe String à l’aide d’une saisie utilisateur. Etant donné que String est un type couramment utilisé, déjà existant dans les langages procéduraux, les concepteurs de JAVA ont voulu faciliter son utilisation. On peut donc écrire : String maChaine = "toto" ; MANIPULER UN OBJET STRING Pour manipuler un objet String, il faut utiliser les méthodes définies pour la classe String. En POO, on dit qu’on applique une méthode à un objet. Cela se traduit en programmation : nomObjet . nomMethode(param1,…) ; Exemple : int taille = maChaine.length() ; // taille = 4 if (maChaine.equals("" ) == true) System.out.println ("Chaîne vide") ; Remarque : pour concaténer une chaîne de caractère, il existe une méthode mais vous pouvez utiliser l’opérateur + . EXTRAIT DES METHODES DE LA CLASSE STRING boolean boolean boolean String String Class String endsWith(String suffix) test if this String ends with the specifies suffix equalsIgnoreCase( String anotherString) Compares this String to another String ignoring case considerations. equals( String anotherString) Compares this String to another String toLowerCase() Converts all of the characters in this String to lower case using the rules of the default locale. toUpperCase() Converts all of the characters in this String to upper case using the rules of the default locale. 7 int int int String String String indexOf(int ch) Returns the index within this string of the first occurrence of the specified character. indexOf(int ch, int fromIndex) Returns the index within this string of the first occurrence of the specified character, starting the search at the specified index. length() Returns the length of this string. replace(char oldChar, char newChar) Returns a new string resulting from replacing all occurrences of oldChar in this string with newChar. subString(int beginIndex, int endIndex) Returns a new string that is a substring of this string. StartsWith( String prefix) Tests if this string starts with the specified prefix. Exercices : 1. Ecrivez les programmes JAVA permettant : a. D’afficher la somme 2 chiffres saisis par l’utilisateur. b. D’afficher un message de bienvenue personnalisé après avoir saisi le nom de l’utilisateur. 2. Que va afficher cet extrait de code : String chaine = «incontournable» ; boolean b = chaine.startsWith(«in»); if ( b == true) { String sousChaine = chaine.substring(2,13) ; System.out.println (« C’est le contraire de » + sousChaine) ; } b = chaine.endsWith(«s»); if ( b == false) System.out.println (« ce mot est au singulier ») ; else System.out.println (« ce mot est au pluriel») ; 3. Ecrivez les programmes JAVA permettant : a. D’afficher le nombre de lettre contenu dans un mot saisi par un utilisateur, ainsi que sa 1 ere et dernière lettre b. D’afficher le nom de l’utilisateur en majuscule et son prénom en minuscule excepté sa 1er lettre. c. D’afficher le login d’un utilisateur, celui-ci est composé des 6ères lettres du nom puis de la 1ere lettre du prénom. Remarque : java est un langage rigoureux, si vous demandez les 6ères lettres du nom mais que celui-ci ne comporte pas 6 caractères, vous aurez un plantage de votre programme ! 8 SUITE OUTILS DE BASE EN JAVA Contrairement au php, les notions de tableaux et de listes sont claires. Un tableau permet de stocker un nombre fixe de données alors que la liste permet de stocker un nombre indéterminé de données. Collectionner un nombre fixe d’objets LES TABLEAUX A UNE DIMENSION Comme toute variable utilisée dans un programme, un tableau doit être déclaré afin de : Donner un nom à l’ensemble des valeurs à regrouper Définir la taille du tableau Déterminer le type des valeurs Déclaration d’un tableau type [ ] nomTableau ; Exemple : float [ ] notes ; // notes est un tableau de float Création d’un tableau nomTableau = new type [ taille ] ; ou bien nomTableau = new type [ ] {valeur1,valeur2,...} ; Exemples : notes = new float[35] ; //notes vient d’être créé pour pouvoir stocker 35 float. mois=new String[]{« janvier », « février », « mars »,....} La création et la déclaration peuvent être faites sur la même ligne ! On peut définir des tableaux de valeurs : o de type simple o de type structuré : tableaux d’objets Remarques : o La taille du tableau correspond au nombre maximal de valeurs à traiter. Il n’est plus possible de la modifier en cours d’exécution ! Cependant il est possible de ne pas fixer la taille avant la compilation en plaçant une variable au lieu d’une valeur numérique entre les []. o Tous les tableaux ont un attribut publique length. LES TABLEAUX A DEUX DIMENSION 9 Déclaration et création d’un tableau à 2 dimensions type [ ] [ ] nomTableau = new type [nbLignes] [nbColonnes]; Exemple : float [ ] [ ] px = new float[2] [5] ; Collectionner un nombre indéterminé d’objets Mieux encore que les tableaux, il existe les listes. Les listes permettent de stocker un nombre variable de valeurs car le programmeur n’est pas contraint d’indiquer la taille de la liste lors de sa création. Mais dans la plupart des langages, la gestion d’une liste est beaucoup plus complexe que la gestion d’un tableau. Excepté pour Java, en effet, ce langage fournit deux types permettant de gérer facilement les listes : Vector et ArrayList . DEFINITION DE LA CLASSE ARRAYLIST La classe ArrayList permet de gérer les listes. Elle a succédé à la classe Vector. Etant plus efficace, il est préférable de l’utiliser à la place des vecteurs ( objets de type Vector). Cette classe est une classe de la bibliothèque java, elle est définie dans le package java.util. Pour l’utiliser, il faut donc importer le package : import java.util.* ; Alors que les tableaux sont une fonctionnalité du langage java, utilisables à tout moment. CONSTRUCTION D’UNE LISTE Comme toute variable utilisée dans un programme, une liste (ici, objet de type ArrayList) doit être déclarée puis créée. Déclaration d’une liste ArrayList nomListe; Création (ou construction) d’une liste Il existe 2 constructeurs : ArrayList() ArrayList(int capacite) nomListe = new ArrayList() ; ou nomListe = new ArrayList(x) ; Construit une liste ayant une capacité de 10 objets Construit une liste ayant pour capacité celle passée en paramètre x étant un entier > 0 Exemple : Créez une liste: lstMatiere-Elle servira à stocker le nom des matières Créez une liste: lstEtudiant-Elle servira à stocker des étudiants La classe ArrayList gère un tableau d’objets. Plus précisément, elle gère un tableau de références à des objets. Lorsque le tableau est plein, la liste crée automatiquement un tableau plus grand et recopie tous les objets du plus petit tableau vers le plus grand. Si vous connaissez déjà le nombre d’éléments que peut contenir la liste, il est bon de l’indiquer, cela évite des réallocations coûteuses. Cela ne limite en rien le nombre d’éléments effectifs puisqu’une liste est capable de s’agrandir en fonction des besoins. Taille d’une liste int size() Renvoie le nombre réel d’éléments contenus dans une liste Exercice : Que vont afficher ces instructions ? ArrayList lstEtud = new ArrayList(50); 10 System.out.println("taille de la liste : " + lstEtud.size()); Etudiant [] tabEtud = new Etudiant[50]; System.out.println("taille du tableau : " + tabEtud.length); Remarques Une liste est ordonnée, comme pour les tableaux un indice est géré pour chaque élément de la liste. On peut donc accéder à chacun des éléments à l’aide de l’indice. Contrairement aux tableaux, on ne définit pas le type des valeurs stockées dans une liste. Une liste gère des élément de type Object. La classe Object représente l’ancêtre ultime de toutes les autres classes. N’importe quel objet, qu’il soit de classe Etudiant, String,… est avant tout de classe Object. Donc une liste peut gérer n’importe quel type d’objet, excepté les types primitifs. MANIPULATION D’UNE LISTE (OBJET DE CLASSE ARRAYLIST) Ajouter des éléments ( des objets ) à une liste boolean void add(Object o) add(int indice, Object o) Ajoute l’objet passé en paramètre en fin de liste- Renvoie true. Insère l’objet passé en paramètre dans la liste à l’indice spécifié Exercice : 1. Ajouter 2 matières : alsi et amki à la liste des matières déclarée précédemment 2. Ajouter 2 étudiants à la liste d’étudiants déclarée précédemment. Ils doivent être rangés par ordre alphabétique. La classe Etudiant possède un constructeur : Etudiant( String nom, String prenom, int age) Ajouter tout d’abord l’étudiant : (Gregory, Puchot,19) Puis ajouter l’étudiant : (Adel,Zellama, 21) Une liste se compose uniquement d’objets, elle ne peut pas stocker des valeurs de types primitifs, comme peut le faire un tableau. Pour résoudre ce problème JAVA a prévu des classes qui redéfinissent les types primitifs. Exemple : classe : Float, Integer, … Exemple d’utilisation : Integer a = new Integer(2) ; Integer b = new Integer(4) ; ArrayList lstNote = new ArrayList(); lstNote.add(a); lstNote.add(b); ArrayList lstNote = new ArrayList(); lstNote.add(new Integer(2)); lstNote.add(new Integer(4)); Remarque : il est donc possible de stocker des objets de différents types dans une même liste. Les collections hétérogènes sont utiles dans de rares occasions. Cela n’est pas recommandé et traduit souvent une erreur de conception. Accéder aux éléments d’une liste void Object set(int indice, Object o ) get(int indice) Place l’objet passé en paramètre à l’indice spécifié. Ecrase l’ancienne valeur. Récupère l’objet stocké à l’indice spécifié en paramètre. Exercice : Modifier dans la liste des matières amki par amsi. Remarque : Pour travailler sur un objet contenu dans une liste, on doit avant tout extraire cet objet de la liste à l’aide de la méthode get ! 11 Extraire un élément d’une liste est assez complexe, car le type renvoyé par la méthode get est Object. Il faut donc convertir l’objet dans le type souhaité. On dit que l’on doit caster explicitement l’objet qui nous est renvoyé. Exemple : Etudiant unEtudiant ; unEtudiant = (Etudiant) lstEtudiant.get(1) ; Exercice : Afficher les propriétés du 1er étudiant à l’aide de la méthode afficheToi() : void Supprimer un élément d’une liste Object remove(int indice) Supprime l’objet dont l’indice est spécifié en paramètre. Retourne l’objet supprimé Rechercher un objet dans une liste int indexOf(Object o) Retourne l’indice de la 1ere occurrence de l’objet passé en paramètre dans la liste Remarque : Cette méthode compare l’objet passé en paramètre aux objets de la liste en utilisant la méthode equals de la classe Object. Or equals ne fait que vérifier si les 2 objets ont la même référence. Ce n’est donc pas un test utile. Pour que cela fonctionne, il faut alors redéfinir equals au niveau de la classe utilisée. Ici : il faut ajouter à Etudiant : 12