Cours-1 Ok
Cours-1 Ok
Antoine Miné
Cours 1
14 septembre 2022
Année 2022–2023
Objectifs du cours
Objectifs :
LU3IN002 — 2022–2023 — Cours 1 Introduction — Les bases du langage Java Antoine Miné p. 2 / 44
Organisation de l’UE
Chargés de cours :
• Antoine Miné
• Jonathan Lejeune
LU3IN002 — 2022–2023 — Cours 1 Introduction — Les bases du langage Java Antoine Miné p. 3 / 44
Environnement logiciel
[Link]
pour éditer, compiler et exécuter du Java, mais aussi : débugger et tester
• La ligne de commande
savoir compiler et exécuter du Java en ligne de commande, même si on l’utilise peu
LU3IN002 — 2022–2023 — Cours 1 Introduction — Les bases du langage Java Antoine Miné p. 4 / 44
Quelques liens bibliographiques
En ligne :
Livres :
• Java in a Nutshell
Ben Evans, David Flanagan
la 7ème édition couvre jusqu’à Java 11
• examen final : 45 %
épreuve sur papier, 2h
• partiel : 40 %
épreuve sur machine avec correction automatique, 2h
• contrôle continu : 15 %
rendu hebdomadaire de TME
Annales (en grande partie corrigées) disponibles sur la page de l’UE et sur Moodle.
LU3IN002 — 2022–2023 — Cours 1 Introduction — Les bases du langage Java Antoine Miné p. 6 / 44
TME
• utilisation de git : rendu par push et tag sur un fork du projet maître
• sur un GitLab privé : [Link]
inscription automatique : vous serez contactés par email pour activer votre compte
• auto-évaluation par test unitaire et intégration continue
Aujourd’hui :
• robuste
• extensible
Concepts de base :
1. encapsulation
2. abstraction
3. réutilisation
4. polymorphisme
• au langage Java
• aux bonnes pratiques de programmation
• aux design patterns : briques réutilisables en conception logicielle
LU3IN002 — 2022–2023 — Cours 1 Introduction — Les bases du langage Java Antoine Miné p. 9 / 44
Concept objet 1 : Encapsulation
Encapsulation :
Un objet regroupe dans une même unité
Mécanismes Java :
• les classes décrivent des objets ayant la même liste d’attributs (la valeur varie
généralement d’un objet à l’autre) et les mêmes méthodes
• et, à une granularité plus élevé, les packages (organisation hiérarchique) et les modules
=⇒ Pas de variable globale ! Tout l’état est encapsulé dans des objets (états locaux)
LU3IN002 — 2022–2023 — Cours 1 Introduction — Les bases du langage Java Antoine Miné p. 10 / 44
Concept objet 2 : Abstraction
Abstraction : distinguer
• les choix d’implantation, privés
• l’interface vers le client, publique
Bénéfices :
• compréhension et utilisation facilitées des objets, en ignorant les détails
• se concentrer sur les fonctionnalités des objets, pas les choix d’implantation
• protection : éviter la corruption accidentelle de l’état des objets
e.g., maintenir l’invariant : le coin haut-gauche est plus en haut que le coin bas-droite
Mécanismes Java :
• le contrôle d’accès aux attributs et méthodes
=⇒ les attributs sont presque toujours privés !
• les interfaces : vue(s) publique(s) des objets
=⇒ programmer vis à vis d’une interface, pas d’une implantation
LU3IN002 — 2022–2023 — Cours 1 Introduction — Les bases du langage Java Antoine Miné p. 11 / 44
Concept objet 3 : Réutilisation
Réutilisation :
Mécanismes Java :
• les classes : tous les objets d’une même classe ont les mêmes méthodes
• l’héritage : redéfinir une partie des comportements, réutiliser le reste
• les références : déléguer à un ou plusieurs autres objets
Polymorphisme :
=⇒ facilite la réutilisation
Mécanismes Java :
LU3IN002 — 2022–2023 — Cours 1 Introduction — Les bases du langage Java Antoine Miné p. 13 / 44
Le langage Java : origine et but
Java :
LU3IN002 — 2022–2023 — Cours 1 Introduction — Les bases du langage Java Antoine Miné p. 14 / 44
Le langage Java : caractéristiques
• des exceptions
=⇒ garantie dynamique de sûreté, à l’exécution
• du polymorphisme
polymorphisme d’objet, polymorphisme de surcharge, polymorphisme paramétrique
• de l’introspection
=⇒ permet la métaprogrammation (IDE, débogueur, . . . )
LU3IN002 — 2022–2023 — Cours 1 Introduction — Les bases du langage Java Antoine Miné p. 15 / 44
Le langage Java : évolution
Versions du langage :
• Java 5, 2004 : changement de numérotation, types génériques, autoboxing, énumerations, boucles for each
• Java 7, 2011 : reprise par Oracle, améliorations mineures aux switch et exceptions, inférence de type
• . . . évolution au rythme d’une version tous les 6 mois, LTS tous les 2–3 ans
• Java 16, 2021 : classes scellées, record
Enrichissement de la bibliothèque standard : de 212 classes pourJava 1.0 à 4411 pour Java 11
LU3IN002 — 2022–2023 — Cours 1 Introduction — Les bases du langage Java Antoine Miné p. 16 / 44
Les bases du langage Java
Expressions
LU3IN002 — 2022–2023 — Cours 1 Introduction — Les bases du langage Java Antoine Miné p. 17 / 44
Types en Java
• types objets
• types définis par le programmeur
• class : définit des instances de classes
• interface : regroupe des objets obéissants à une interface
• enum, record : extensions récentes (“sucre syntaxique”)
• tableaux
• objets alloués explicitement avec new, passés par référence, libérés automatiquement
• valeur universelle par défaut : null
les chaînes sont des objets en Java, pas des types primitifs
chaque type primitif a une classe correspondante : Integer, Float, . . .
LU3IN002 — 2022–2023 — Cours 1 Introduction — Les bases du langage Java Antoine Miné p. 18 / 44
Types primitifs et leurs opérateurs
• caractères : char
valeurs : Unicode 16-bit
constantes littérales : ’a’, ’\u03A9’, ’\’’
• booléens : boolean
valeurs et littéraux : true, false
opérateurs booléens : !, &&, ||
comparaisons : ==, !=, >, <, >=, <=
opérateur ternaire : ?:
conversion automatique si nécessaire : entier → flottant, petit entier → grand entier, etc.
mais pas de conversion automatique en booléen, contrairement au C
ni d’un type plus large vers un type plus petit : flottant → entier
LU3IN002 — 2022–2023 — Cours 1 Introduction — Les bases du langage Java Antoine Miné p. 19 / 44
Déclarations, blocs, affectation
• déclaration
définit des nouvelles variables, avec leur type et valeur initiale (optionnelle)
• déclaration simple :
type var1, var2, ...;
• déclaration avec initialisation :
type var1 = expr1, var2 = expr2, ...;
• déclaration avec inférence de type (Java ≥ 10) :
var var1 = expr1, var2 = expr2, ...;
• affectation
change la valeur d’une variable existante (ou celle d’un attribut d’un objet)
var = expr;
• la valeur stockée doit être compatible avec le type de la variable
• conversion possible : var = (type) expr;
• certaines conversions sont implicites (int → float)
• bloc
{ instruction1; ... ; instructionN; }
• regroupe des instructions
• restreint la portée des variables qui y sont déclarées
LU3IN002 — 2022–2023 — Cours 1 Introduction — Les bases du langage Java Antoine Miné p. 20 / 44
Structures de contrôle
• tests
• if (expr) instruction
• if (expr) instruction else instruction
• boucles
• while (expr) instruction
• do instruction while(expr)
• for (expr; expr; expr) instruction
• for (type var = expr; expr; expr) instruction
• for (type var : collection) instruction
peuvent être préfixées d’un label L:
• sortie de boucle (avec label optionnel) ou de switch
break; continue; break L; continue L;
• sortie de méthode (avec ou sans valeur de retour)
return; return expr;
• analyse par cas (en fonction de la valeur d’un entier ou d’une chaîne)
• switch (expr) { case expr: inst; break; ... default: insts }
• var = switch (expr)
{ case expr: inst; yield expr; ... default: insts ; yield expr; }
(switch-expression, en Java 13)
LU3IN002 — 2022–2023 — Cours 1 Introduction — Les bases du langage Java Antoine Miné p. 21 / 44
Instructions (exemples)
factorielle v1 factorielle v2
int fact(int n) { int fact(int n) {
int i = 0, x = 1; int x = 1;
while (i < n) { for (int i = 1; i <= n; i++)
i = i + 1; x *= i;
x = x * i; return x;
} }
return x;
}
LU3IN002 — 2022–2023 — Cours 1 Introduction — Les bases du langage Java Antoine Miné p. 22 / 44
Un exemple de classe : le point
La classe Point décrit comment créer et manipuler des points dans le plan.
LU3IN002 — 2022–2023 — Cours 1 Introduction — Les bases du langage Java Antoine Miné p. 23 / 44
Points : déclaration, attributs, getters
[Link] (début)
public class Point { // déclaration de classe
private double x,y; // attributs
public double getX() { return x; } // méthode d’accès
public double getY() { return y; } // méthode d’accès
Déclaration de classe :
Attributs :
LU3IN002 — 2022–2023 — Cours 1 Introduction — Les bases du langage Java Antoine Miné p. 24 / 44
Points : constructeurs
[Link] [Link]
// constructeur // constructeur
public Point() { public Point(double x, double y) {
x = 100; this.x = (x < 0) ? 0 : x;
y = 100; this.y = (y < 0) ? 0 : y;
} }
LU3IN002 — 2022–2023 — Cours 1 Introduction — Les bases du langage Java Antoine Miné p. 26 / 44
Points : méthodes
Appel de méthode :
• obj.méthode(expr1,...,exprN)
• méthode(expr1,...,exprN)
est équivalent à [Link](expr1,...,exprN)
Visibilité :
• private set(...) est une méthode à usage interne, cachée des autres classes
• public getX() est une méthode exportée aux autres classes
• translate(...) est une méthode exportée aux classes du même package
par défaut, si ni public ni private n’est précisé
LU3IN002 — 2022–2023 — Cours 1 Introduction — Les bases du langage Java Antoine Miné p. 27 / 44
Diagramme de classe UML
LU3IN002 — 2022–2023 — Cours 1 Introduction — Les bases du langage Java Antoine Miné p. 28 / 44
Agrégation : la classe Rectangle
Agrégation :
=⇒ les opérations sur les coins d’un Rectangle sont déléguées à la classe Point.
LU3IN002 — 2022–2023 — Cours 1 Introduction — Les bases du langage Java Antoine Miné p. 29 / 44
Diagramme de classes UML avec association
Point
− x : double Rectangle
− y : double
1
+ Point() − c1 + Rectangle(Point, Point)
+ Point(double, double) + getC1() : Point
+ getX() : double + getC2() : Point
+ getY() : double 1 ∼ translate(double, double) : void
− set(double, double) : void − c2 + toString() : String
∼ translate(double, double) : void
+ toString() : String
Attention : un attribut apparaissant dans une association ne doit pas être aussi présent dans le bloc des attributs de la classe !
LU3IN002 — 2022–2023 — Cours 1 Introduction — Les bases du langage Java Antoine Miné p. 30 / 44
Objets, références, égalité physique ==
client
Point a = new Point(10,10);
Point b = new Point(20,20);
Point c = new Point(20,20);
Rectangle g1 = new Rectangle(a,b);
Rectangle g2 = new Rectangle(a,c);
LU3IN002 — 2022–2023 — Cours 1 Introduction — Les bases du langage Java Antoine Miné p. 31 / 44
Attributs immuables : mot-clé final
LU3IN002 — 2022–2023 — Cours 1 Introduction — Les bases du langage Java Antoine Miné p. 32 / 44
Méthodes et attributs statiques : mot-clé static
LU3IN002 — 2022–2023 — Cours 1 Introduction — Les bases du langage Java Antoine Miné p. 33 / 44
Packages, mots-clés package et import
LU3IN002 — 2022–2023 — Cours 1 Introduction — Les bases du langage Java Antoine Miné p. 34 / 44
Visibilité et packages
Mais un attribut privé peut être rendu accessible via des méthodes publiques !
LU3IN002 — 2022–2023 — Cours 1 Introduction — Les bases du langage Java Antoine Miné p. 35 / 44
Point d’entrée : la méthode main
class Programme1 {
public static void main(String[] args) {
Point p1 = new Point(10, 10);
Point p2 = new Point(20, 20);
Rectangle r = new Rectangle(p1, p2);
[Link]("Rectangle: " + r);
}
}
LU3IN002 — 2022–2023 — Cours 1 Introduction — Les bases du langage Java Antoine Miné p. 36 / 44
Référence null
exemple
public class Test {
private Point a;
public Test() { }
• null peut être stocké dans une variable de tout type objet
• un attribut non fixé par le constructeur est égal à null par défaut
• un test == null permet de vérifier si une référence est valide
• tout accès (attribut ou méthode) à une référence null est une erreur
Exception in thread "main" [Link]
LU3IN002 — 2022–2023 — Cours 1 Introduction — Les bases du langage Java Antoine Miné p. 37 / 44
Tableaux
• déclaration (avec initialisation optionnelle)
type[] variable;
type[] variable = { expr1, ..., exprN };
où type est un type primitif (int, . . . ) ou un type objet
sans initialisation, le tableau vaut null (comme tout objet. . . )
• création : new type[expr]
où la valeur de l’expression expr fixe la taille du tableau
les éléments sont tous initialisés à null, 0 ou false
• accès : variable[expr]
expr est l’indice, de 0 à la taille - 1
• taille : [Link] (syntaxe d’attribut)
la taille d’un tableau est constante, fixée à la création ou à l’initialisation
• tableaux multidimensionnels : type[][] v = new type[expr][expr];
tableaux de tableaux, vus plus en détails en TME
exemple
Point[] points; // points est null
points = new Point[12]; // points[0] est null
points[0] = new Point(10,20); // points[0] est un point
points[0].translate(10,10);
LU3IN002 — 2022–2023 — Cours 1 Introduction — Les bases du langage Java Antoine Miné p. 38 / 44
Chaînes de caractères : classe String
En Java, les chaînes de caractères sont des objets de classe String (non primitif).
ou, plus précisément, [Link]
LU3IN002 — 2022–2023 — Cours 1 Introduction — Les bases du langage Java Antoine Miné p. 39 / 44
Méthodes standard, classe Object, @Override
pobj1/cours1/[Link]
@Override public String toString()
{ return x + "," + y; }
Toute classe a des méthodes standard, avec une implantation par défaut :
LU3IN002 — 2022–2023 — Cours 1 Introduction — Les bases du langage Java Antoine Miné p. 40 / 44
Compilation et exécution en ligne de commande
javac pobj/cours1/[Link]
java [Link]
LU3IN002 — 2022–2023 — Cours 1 Introduction — Les bases du langage Java Antoine Miné p. 41 / 44
Packaging : JAR, modules
But : distribuer une grande quantité de classes dans une hiérarchie de packages
Une classe implante une interface si elle définit au moins les méthodes demandées
avec une signature compatible.
pobj1/cours1/[Link]
pobj1/cours1/[Link]
public class Point implements IPoint {
public interface IPoint {
private double x,y;
public double getX();
public Point() { ...
public double getY();
public double getX() { ...
public double length();
public double getY() { ...
public String toString();
private void set(double ...
}
...
(plus sur—les
LU3IN002 interfaces
2022–2023 dans 1le
— Cours prochain cours)
Introduction — Les bases du langage Java Antoine Miné p. 43 / 44
Exemple d’interface : introduction aux listes
La bibliothèque standard Java contient des structures de données très utiles
comme les listes (un exemple de collection) :
• interface : [Link]
• implantations : [Link], [Link], . . .
même jeu d’opérations, mais des complexités algorithmiques différentes
• List<E> : type des listes d’éléments de E
utilisation de génériques : polymorphisme paramétrique, étudié dans un prochain cours