Une introduction à Java Java - Historique Aperçu de Java Premier
Transcription
Une introduction à Java Java - Historique Aperçu de Java Premier
Java - Historique • Développé par Sun Microsystems en 1994 Une introduction à Java – Inventeur James Gosling (canadien!) • Objectif IFT 287 (Semaine 1) – langage sûr (fortement typé) – gestion automatique de la mémoire – usage sur le web UNIVERSITÉ DE SHERBROOKE 1 Premier exemple Aperçu de Java • Code java Comparable au C++ … mais différent – Syntaxe très proche du C++ – Prog. Orienté-objet – … et prog. structurée – Fortement typé – Types de bases – Gestion des tableaux – Exceptions 2 – Interprété – Gestion implicite de la mémoire – Existence d’une classe Objet – Bibliothèque de base très développée – Pas de gestion explicite des pointeurs – Pas de surcharge d’opérateurs import java.lang.* class PremierProg { public static void main (String[] args){ System.out.println(“Bonjour!”); } } • Code C++ #include <iostream.h> int main (int argc, char *argv[]) { cout << “Bonjour!” << endl; } 3 4 Processus d’obtention d’un exécutable Compilation/interprétation Pour obtenir un programme : • à partir du code C++, on compile directement le source : Fichier .java (source) 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 } } gcc programme.cc • à partir du java, on transforme le source dans un langage qui sera interprété dans la machine virtuel : Compilation : javac javac PremierProg.java java PremierProg Fichier .class (bytecode) 5 Interprétation: Java libjava.so 6 1 Conventions • Fichier : porte le nom de la classe qu’il 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) 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). 7 8 Les tableaux Types primitifs • Semblable au C++ • Par exemple boolean : true ou false byte : -128 à 127 short : -32768 à 32767 int : -2147483648 à 2147483647 long : -9223372036854775808 à 9223372036854775807 • char : \u0000 à \uffff • float : 1e-45 à 1e+38 • double : 1e-324 à 1e+308 • • • • • 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 9 – int[][][] a = new int[l][m][n]; 10 Le paradigme « orienté-objet » Les structures de contrôle • Les mêmes qu’en C++ : • 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 – if – while / for / do…until – case – goto • On retrouve : – break – continue 11 12 2 Les classes Contenu d'une classe • On crée une nouvelle instance (un objet) d’une 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”; • • • • • Champs Méthodes Constructeurs Destructeurs (Finalizer) Visibilité – – – – Caract. Capacités Naissance Mort public protected private package 13 14 Privilèges d’accès Les méthodes Soit un membre m déclaré dans une class A classe A visibilité private protected public package O O O O accès au membre m à partir de classe B B et A même package B et A package différent B n'est pas B n'est pas B soussous-classe B soussous-classe classe de A de A classe de A de A N N N N O O O N O O O O O O N N • On appelle la méthode meth d’un 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) 15 16 Exemple Égalité entre objets public class Test2 { • == public static void main(String[] args) { – égalité sur les références 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); – 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 l’implémentation de equals dans la classe Object est faite avec == } } 17 18 3 La classe String Passage d’argument • 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 d’un appel; l’objet référencé n’est pas copié, donc la méthode appelée peut modifier l’objet référencé. • Attention aux effets de bord • Nécessité de dupliquer un objet valeur si on ne veut pas qu’il soit modifié par la méthode appelée – o.clone() 19 Méthodes de 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 + " !" ; 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 : 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) StringBuffer = new StringBuffer (32) ; StringBuffer = new StringBuffer ("Allo") ; • … 21 22 La classe Vector Méthodes de StringBuffer • • • • • • • • 20 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 () … 23 • Du package java.util • Représente un tableau qui peut grossir dynamiquement • Exemple Vector<String> noms = new Vectors<String>(2); noms.add("Benoit"); noms.add("Marc"); La capacité de noms est augmenté de 1 noms.add("Bob"); noms.capacity(); noms.lastElement(); 24 4 /** 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 Champs private String nom; private Personne conjoint; private final int noPersonne; 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() •… Exemple d'une classe /** Construit une personne et lui assigne un numéro unique. */ public Personne(String nom) { this.nom = nom; méthode noPersonne = noPersonneCourant; noPersonneCourant = noPersonneCourant + 1; } /** Retourne une chaîne de caractères représentant la personne. */ public String toString() { return nom + " " + noPersonne; } 25 /** Associe un conjoint à la personne. */ public void setConjoint(Personne p) { conjoint = p; } }// fin classe 26 Variable de classe : mot-clé Mot-clé final static • Comment empêcher qu’une 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 • 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 d’une 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 qu’il 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 l’objet référencé par a 27 Exemple la classe java.lang.Math 28 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 • 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); … 29 30 5 Une trace d'exception Bibliothèques ~/ift287/h04/tp1 > java Test1 • Les APIs de Java sont très développés • On peut trouver une documentation en ligne sur le site d'Oracle – http://www.oracle.com/technetwork/jav a/javase/overview/index.html Exception in thread "main" java.lang.NullPointerException at Film.addActeur(Film.java:70) at Test1.main(Test1.java:20) ligne 70 invasions.addActeur(girard); ligne 20 public void addActeur(Personne p) { acteurs[nbActeurs] = p; nbActeurs = nbActeurs + 1; } classe Test1 classe Film 31 32 Packages courant Types Génériques • Permet de spécifier des paramètres dénotant des types à utiliser dans une classe • Exemples classiques : les collections • java.lang • java.util • java.math • java.io • java.awt • java.sql • java.net – – – – Collection<E> Set<E> List<E> Map<K,V> 33 Exemples d’usage de types génériques 34 Conclusion import java.util.*; public class Test { public static void main(String[] args) { Set<Integer> m = new HashSet<Integer>(); m.add(new Integer(1)); for (Integer i : m) System.out.println(i); } } 35 • 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). 36 6 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) 37 7