Upload
chrestien-mathis
View
109
Download
5
Embed Size (px)
Citation preview
1
Une introduction à Java
IFT 287(Semaine 1)
U N IV E R S IT É D ESH ERBROOKE
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 JavaComparable 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 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
4
• Code javaCode javaimport java.lang.*class PremierProg { public static void main (String[] args){ System.out.println(“Bonjour!”);
}}
• Code C++Code C++#include <iostream.h>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.javajava PremierProg
6
Processus d’obtention d’un exécutable
Fichier .java(source)
Fichier .class(bytecode)
libjava.soInterprétation:Java
Compilation :javac
import java.lang.*class PremierProg { public static void main (String[] args){ System.out.println(“Bonjour!”); }}
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 } }
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
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)
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 : -32768 à 32767• int : -2147483648 à 2147483647• long : -9223372036854775808 à
9223372036854775807• 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 lengthnoms.length ;
• Tableaux multidimensionnels– int[][][] a = new int[l][m][n];
11
Les structures de contrôle
• Les mêmes qu’en 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) 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”;
14
Contenu d'une classe
• Champs• Méthodes• Constructeurs• Destructeurs (Finalizer)• Visibilité
– public– protected– private– package
Caract.CapacitésNaissanc
eMort
15
Privilèges d’accès
Soit un membre m déclaré dans une class A
classe A
visibilitéB sous-
classe de A
B n'est pas sous-classe
de AB sous-
classe de A
B n'est pas sous-classe
de A
private O N N N Nprotected O O O O Npublic O O O O Opackage O O O N N
B et A package différentB et A même package
accès au membre m à partir declasse B
16
Les méthodes
• 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)
17
Exemplepublic 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 l’implémentation de equals dans la classe Object est faite avec ==
19
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()
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<String> noms = new Vectors<String>(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 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
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 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
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);invasions.addActeur(girard);
classe Test1
public void addActeur(Personne p){ acteurs[nbActeurs] = p; nbActeurs = nbActeurs + 1;}
public void addActeur(Personne p){ acteurs[nbActeurs] = p; nbActeurs = nbActeurs + 1;}
classe Film
ligne 20
ligne 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 – http://www.oracle.com/technetwork/
java/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<E>– Set<E>– List<E>– Map<K,V>
35
Exemples d’usage de types génériques
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); }}
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)