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