Vous êtes sur la page 1sur 37

Une introduction à Java

IFT 287
(Semaine 1)

U N IV E R S IT É D E
SH ER BR O O K E
1
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

2
Aperçu de Java
Comparable au C++ … mais différent
– Syntaxe très proche – Interprété
du C++ – Gestion implicite de la
– Prog. Orienté-objet mémoire
– Existence d’une classe
– … et prog. structurée
Objet
– Fortement typé – Bibliothèque de base
– Types de bases très développée
– Gestion des tableaux – Pas de gestion explicite
– Exceptions des pointeurs
– Pas de surcharge
d’opérateurs
3
Premier exemple
• Code java
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;
}
4
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
5
Processus d’obtention
d’un exécutable
import java.lang.*
Fichier .java import
class java.lang.*
PremierProg {
class
publicPremierProg
static void{ main (String[] args){
(source) public static void main (String[] args){
System.out.println(“Bonjour!”);
} System.out.println(“Bonjour!”);
} }
}

class PremierProg {
class PremierProg
method { main (java.lang.String[])
public static void
method public
max_stack 2 { static void main (java.lang.String[])
max_stack
getstatic 2{
java.io.PrintStream java.lang.System.out ldc "Bonjour!"
getstatic java.io.PrintStream
invokevirtual java.lang.System.out ldc "Bonjour!"
void java.io.PrintStream.println(java.lang.String) return
} invokevirtual void java.io.PrintStream.println(java.lang.String) return
} }
}
Compilation :
javac

Fichier .class
Interprétation: libjava.so
(bytecode)
Java

6
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)
7
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).

8
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
9
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];
10
Les structures de contrôle
• Les mêmes qu’en C++ :
– if
– while / for / do…until
– case
– goto
• On retrouve :
– break
– continue

11
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

12
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”;

13
Contenu d'une classe
• Champs Caract.
• Méthodes Capacités
• Constructeurs
Naissance
• Destructeurs (Finalizer)
Mort
• Visibilité
– public
– protected
– private
– package

14
Privilèges d’accès
Soit un membre m déclaré dans une class A

accès au membre m à partir de


classe A classe B
B et A même package B et A package différent
B n'est pas B n'est pas
B sous- sous-classe B sous- sous-classe
visibilité classe de A de A classe de A de A
private O N N N N
protected O O O O N
public O O O O O
package O O O N N

15
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)
16
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);

}
17
É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 ==

18
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
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 + " !" ; 20
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)
• …
21
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") ;

22
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 ()
• …

23
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"); La capacité de noms
noms.add("Bob"); est augmenté de 1

noms.capacity();
noms.lastElement(); 24
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()
•… 25
/** 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. */

Exemple d'une classe


public class Personne { // variable de classe
// no à allouer à la prochaine personne créée
private static int noPersonneCourant = 0;
// variables d'instances
private String nom; Champs
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; méthode
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; } 26
}// fin classe
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

27
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

28
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);

29
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
30
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)

public void addActeur(Personne p)


public void addActeur(Personne p)
ligne 70 {
{
acteurs[nbActeurs] = p;
acteurs[nbActeurs] = p;
invasions.addActeur(girard); ligne 20 nbActeurs = nbActeurs + 1;
invasions.addActeur(girard); nbActeurs = nbActeurs + 1;
}
}
classe Test1
classe Film

31
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/jav
a/javase/overview/index.html

32
Packages courant
• java.lang
• java.util
• java.math
• java.io
• java.awt
• java.sql
• java.net
33
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>

34
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);
}
}
35
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).

36
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

Vous aimerez peut-être aussi