1 Une introduction à Java IFT 287 (Semaine 1)
2 Java - Historique Développé par Sun Microsystems en 1994 –Inventeur James Gosling (canadien!) Objectif –langage sûr (fortement typé) –gestion automatique de la mémoire –usage sur le web
3 Aperçu de Java Comparable au C++ –Syntaxe très proche du C++ –Prog. Orienté-objet –… et prog. structurée –Fortement typé –Types de bases –Gestion des tableaux –Exceptions … mais différent –Interprété –Gestion implicite de la mémoire –Existence dune classe Objet –Bibliothèque de base très développée –Pas de gestion explicite des pointeurs –Pas de surcharge dopérateurs
4 Code javaCode java import java.lang.* class PremierProg { public static void main (String[] args){ System.out.println(Bonjour!); } } Code C++Code C++ #include int main (int argc, char *argv[]) { cout << Bonjour! << endl; } Premier exemple
5 Compilation/interprétation Pour obtenir un programme : à partir du code C++, on compile directement le source : gcc programme.cc à partir du java, on transforme le source dans un langage qui sera interprété dans la machine virtuel : javac PremierProg.java java PremierProg
6 Processus dobtention dun exécutable import java.lang.* class PremierProg { public static void main (String[] args){ System.out.println(Bonjour!); } class PremierProg { method public static void main (java.lang.String[]) max_stack 2 { getstatic java.io.PrintStream java.lang.System.out ldc " Bonjour! " invokevirtual void java.io.PrintStream.println(java.lang.String) return }
7 Conventions Fichier : porte le nom de la classe quil décrit ( PremierProg.java ) Package : commencent par une minuscule ( java.lang.* ) Classe : commencent par une majuscule ( String ) Variable : commence par une minuscule ( maVariable ) Constante : en majuscule ( UNE_CONSTANTE )
8 Catégories de types Types primitifs –entier, caractère, point flottant, booléen Types références –classes et vecteurs –ce sont des pointeurs vers des objets –allocation avec new –pas de destructeur (garbage collection par la machine virtuelle).
9 Types primitifs boolean : true ou false byte : -128 à 127 short : à int : à long : à char : \u0000 à \uffff float : 1e-45 à 1e+38 double : 1e-324 à 1e+308
10 Les tableaux Semblable au C++ Par exemple int numero[] = new int[3]; L'indexation commence à 0 Création implicite d'une classe Accès à la longueur par le champ length noms.length ; Tableaux multidimensionnels –int[][][] a = new int[l][m][n];
11 Les structures de contrôle Les mêmes quen C++ : –if –while / for / do…until –case –goto On retrouve : –break –continue
12 Le paradigme « orienté-objet » Caractéristique : encapsulation, héritage et polymorphisme Les entités sont des objets dont le modèle est une classe On fait agir les objets en activant des méthodes
13 Les classes On crée une nouvelle instance (un objet) dune classe avec le mot-clé new Par exemple pour créer une nouvelle chaîne de caractères dont la valeur est Bonjour : String maChaine = new String (Bonjour); Raccourci String maChaine = Bonjour;
14 Contenu d'une classe Champs Méthodes Constructeurs Destructeurs (Finalizer) Visibilité –public –protected –private –package Caract. Capacités Naissance Mort
15 Privilèges daccès Soit un membre m déclaré dans une class A
16 Les méthodes On appelle la méthode meth dun objet obj avec les paramètres params comme suit : obj.meth(params) Comme pour une procédure C on transmet des paramètres et on reçoit une valeur de retour : char prem = maChaine.charAt(0)
17 Exemple public class Test2 { public static void main(String[] args) { Personne p1 = new Personne("Denys Arcand"); Personne p2 = new Personne("Denise Robert"); Personne[] personnes = new Personne[3]; personnes[0] = p1; personnes[1] = p2; p1.setConjoint(p2); p2.setConjoint(p1); }
18 Égalité entre objets == –égalité sur les références –v1 == v2 ssi v1 et v2 réfère au même objet equals –pour vérifier si deux objets distincts sont égaux en contenu –v1.equals(v2) ssi v1 est égal en contenu à v2 –À redéfinir dans chaque classe, car limplémentation de equals dans la classe Object est faite avec ==
19 Passage dargument Le passage en java est toujours par valeur Comme les variables de type référence contiennent un pointeur vers un objet, seul le pointeur est copié lors dun appel; lobjet référencé nest pas copié, donc la méthode appelée peut modifier lobjet référencé. Attention aux effets de bord Nécessité de dupliquer un objet valeur si on ne veut pas quil soit modifié par la méthode appelée –o.clone()
20 La classe String Du package java.lang Représente une chaîne de caractères immutable Exemple String prenom = new String ("Benoit"); Pour les accents, il est conseillé d'utiliser l'unicode : \uxxxx où xxxx est le code du caractère Création dynamique de String avec " " et + x = "Je me nomme " + prenom + " !" ;
21 Méthodes de la classe String boolean equals(Object o) int compareTo(Object o) String concat(String str) boolean endsWith(String suffix) boolean startsWith(String prefix) char[] toCharArray() String substring(int beginIndex) …
22 La classe StringBuffer Du package java.lang Contrairement à String est mutable Permet de créer une créer une chaîne de caractères par morceaux Création : StringBuffer = new StringBuffer (32) ; StringBuffer = new StringBuffer ("Allo") ;
23 Méthodes de StringBuffer StringBuffer append(String s) int capacity() StringBuffer delete (int start, int end) StringBuffer insert (int offset, String s) StringBuffer reverse () String subString (int start, int end) String toString () …
24 La classe Vector Du package java.util Représente un tableau qui peut grossir dynamiquement Exemple Vector noms = new Vectors (2); noms.add("Benoit"); noms.add("Marc"); noms.add("Bob"); noms.capacity(); noms.lastElement(); La capacité de noms est augmenté de 1
25 Méthodes de la classe Vector boolean add (E o) int capacity () boolean contains (Object o) E get (int index) E set(int index, E o) boolean isEmpty() boolean remove(Object o) E lastElement() …
26 /** Permet de créer une personne et de l'associer à une autre personne qui est son conjoint. Chaque personne a un numéro unique, attribuée a sa création. */ public class Personne { // variable de classe // no à allouer à la prochaine personne créée private static int noPersonneCourant = 0; // variables d'instances private String nom; private Personne conjoint; private final int noPersonne; /** Construit une personne et lui assigne un numéro unique. */ public Personne(String nom) { this.nom = nom; noPersonne = noPersonneCourant; noPersonneCourant = noPersonneCourant + 1; } /** Retourne une chaîne de caractères représentant la personne. */ public String toString() { return nom + " " + noPersonne; } /** Associe un conjoint à la personne. */ public void setConjoint(Personne p) { conjoint = p; } }// fin classe Champs méthode Exemple d'une classe
27 Mot-clé final Comment empêcher quune variable soit modifiée par la suite ? Comment créer une constante ? final est l'équivalent de const en C: il empêche la modification de la variable
28 Variable de classe : mot-clé static Est-on obligé de toujours instancier un objet pour utiliser une méthode ? Comment faire pour utiliser une variable partagée par tous les objets dune même classe ? Utilisation du mot-clé static Celui ci rend le champs ou la méthode commune à tout objet de la classe; on dit quil définit une variable de classe –A.v1 : accède à la variable v1 de la classe A –a.v2 : accède à la variable v2 de lobjet référencé par a
29 Exemple la classe java.lang.Math La classe Math contient des méthodes pour effectuer des calculs mathématiques On appelle les méthodes en indiquant la classe et non l'objet : double x = Math.acos (10); double y = Math.sqrt(50); …
30 Les exceptions Mécanisme pour gérer facilement les cas limites Capture la continuation du programme (pile des exécutions) pour pouvoir y revenir le cas échéant Même système qu'en C++ Les exceptions sont des objets hérités de la classe java.lang.Exception Attention aux baisses de performances
31 Une trace d'exception ~/ift287/h04/tp1 > java Test1 Exception in thread "main" java.lang.NullPointerException at Film.addActeur(Film.java:70) at Test1.main(Test1.java:20) invasions.addActeur(girard); classe Test1 public void addActeur(Personne p) { acteurs[nbActeurs] = p; nbActeurs = nbActeurs + 1; } classe Film ligne 20ligne 70
32 Bibliothèques Les APIs de Java sont très développés On peut trouver une documentation en ligne sur le site d'Oracle – a/javase/overview/index.html
33 Packages courant java.lang java.util java.math java.io java.awt java.sql java.net
34 Types Génériques Permet de spécifier des paramètres dénotant des types à utiliser dans une classe Exemples classiques : les collections –Collection –Set –List –Map
35 Exemples dusage de types génériques import java.util.*; public class Test { public static void main(String[] args) { Set m = new HashSet (); m.add(new Integer(1)); for (Integer i : m) System.out.println(i); }
36 Conclusion Programmation par objets (basé sur les classes, de la famille C++). –Langage extrêmement simplifié (seulement types de données de base, objets et tableaux). –Pas de fonctions (seulement des méthodes), –pas de structure de données enregistrement (seulement des objets), –pas de types somme (i.e. variantes).
37 Conclusion Compilé vers du bytecode (indépendant du processeur et du système d'exploitation), et plus récemment vers du code natif (au vol, plus rapide, moins portable). Ramasse-miette Concurrence (threads)