Les interface homme-machine et le langage Java

Transcription

Les interface homme-machine et le langage Java
Java et les objets
Ressources
infodoc.iut.univ-aix.fr/~ihm/ : sujets des TP, pointeurs utiles, polys,
ces transparents, etc.
Les interface homme-machine
et le langage Java
java.sun.com (en réalité www.oracle.com/technetwork/java) : logiciel
et documentation, dont
JRE (Java Runtime Environment) : machine java + bibliothèques,
ce qu’il faut pour exécuter les programmes java
JDK (Java Development Kit) : compilateur et outils pour développer les
programmes – contient un JRE
la doc en ligne de l’API (docs.oracle.com/javase/7/docs/api)
DUT première année
Henri Garreta, Faculté des Sciences (Luminy)
Cyril Pain-Barre & Sébastien Nedjar, IUT d’Aix-Marseille (Aix)
avec le JDK n’importe quel éditeur de textes, mais
JDK + eclipse (ou JDK + NetBeans) pour plus d’efficience
Cours 1: Java et les objets
c
H.
Garreta, 2014
IHM et Java
henri.garreta.perso.luminy.univmed.fr : diverses ressources,
dont : « Le langage Java » (poly très complet)
1 / 21
c
H.
Garreta, 2014
Java et les objets
IHM et Java
2 / 21
Java et les objets
POO, esprit de la chose
POO, esprit de la chose (suite)
un programme est un ensemble d’objets
les objets interagissent en s’envoyant des messages
un objet est déterminé par un état et un comportement
un message a toujours un destinataire
état : donné par les valeurs d’un ensemble de données membres, champs ou
variables d’instance
comportement : implémenté par un ensemble de fonctions membres ou
méthodes d’instance
un message dit quoi faire, mais non comment : il incombe au destinataire du
message de savoir les détails que prend chez lui l’exécution du message
une classe est la description d’une sorte d’objets de même type, les instances
de la classe
indice : si p et q représentent des points
r = distance(p, q)
s’écrit plutôt
r = p.distance(q)
il y a aussi des données et des fonction non attachées aux objets :
l’ensemble des messages qu’un objet accepte constitue son interface
l’interface est la partie publique de l’objet ; elle doit être simple, robuste,
documentée
les données membres static ou variables de classe
les fonctions membres static ou méthodes de classe
c
H.
Garreta, 2014
IHM et Java
3 / 21
c
H.
Garreta, 2014
IHM et Java
4 / 21
Java et les objets
Java et les objets
Structure générale d’un fichier source
package
En Java, il n’y a pas
des directives pour le préprocesseur (lignes commençant par #)
notamment, il n’y a pas besoin de #include
des fichiers de spécification (« .h ») et des fichiers d’implémentation (« .cpp ») séparés
des variables globales
des fonctions autonomes
subdivision de l’espace des noms, à la manière des namespace
Fichier Liste.java
package mesOutils.mesListes;
class Maillon {
...
}
Fichier Liste.java
public class Liste {
...
}
package mesOutils.mesListes;
import java.outil.Vector;
import java.awt.*;
class Maillon {
déclaration des membres (variables et fonctions) de la classe Maillon
}
le nom complet de la classe Liste est :
l’instruction package doit être la première du fichier
si absente, la classe est dans le « paquet sans nom » (unnamed package)
public class Liste {
déclaration des membres (variables et fonctions) de la classe Liste
}
une classe publique (qualifiée public) est accessible partout
une classe non publique l’est uniquement dans les autres classes du même package
pour une classe publique, le package et le nom imposent le chemin du fichier source :
la classe
mesOutils.mesListes.Liste
doit se trouver dans le fichier ./mesOutils/mesListes/Liste.java
recommandation : une seule classe par fichier
obligation : une seule classe « public » par fichier
c
H.
Garreta, 2014
IHM et Java
5 / 21
c
H.
Garreta, 2014
Java et les objets
IHM et Java
6 / 21
Java et les objets
import
Compiler et exécuter une classe
Les exécutables Java sont de plusieurs sortes :
définition d’une certaine classe :
package mesOutils.mesListes;
– les applications s’exécutent sur une machine virtuelle Java
qui, elle-même, s’exécute sur un couple (processeur, système),
– les applets s’exécutent dans les navigateurs web,
– les servlets s’exécutent dans les serveurs d’applications.
public class Liste {
...
}
les applications Java sont compilées et interprétées :
le compilateur produit un bytecode que la machine java interprète
l’application la plus simple (en rouge, les éléments invariables)
utilisation de cette classe dans le même package :
Liste L = new Liste();
utilisation de cette classe dans un autre package :
mesOutils.mesListes.Liste L = new mesOutils.mesListes.Liste();
Fichier Bonjour.java
public class Bonjour {
public static void main(String[] args) {
System.out.println("Bonsoir !");
}
}
dans ce cas, import permet d’utiliser le nom court :
import mesOutils.mesListes.Liste;
...
Liste L = new Liste();
forme « collective » :
import mesOutils.mesListes.*;
compilation :
I javac Bonjour.java
exécution :
I java Bonjour
Bonsoir !
cela désigne toutes les classes du paquet mesOutils.mesListes
import n’est pas « #include »
c
H.
Garreta, 2014
mesOutils.mesListes.Liste
IHM et Java
7 / 21
c
H.
Garreta, 2014
IHM et Java
8 / 21
Java et les objets
Java et les objets
Java, le langage
Notion de référence en Java
Sauf indication contraire, Java = C : même syntaxe, mêmes concepts de base...
référence = pointeur géré discrètement par Java. Exemple
(on suppose avoir défini une classe Point) :
Point p;
p contiendra une référence sur un objet Point.
Pour l’instant, p contient null ou « non initialisé »
...avec la surcharge des noms des fonctions, comme en C++
Types primitifs (simples) :
byte (1 octet)
float (4 octets)
short (2 octets)
double (8 octets)
int (4 octets)
char
long (8 octets)
boolean
instantiation (création) d’un objet :
p = new Point(25, 50);
Maintenant p pointe un morceau de mémoire
contenant (au moins) les coordonnées (25,50).
Tous les entiers sont « avec signe ». De plus
on peut aussi associer déclaration et instantiation :
Point q = new Point(100, 200);
Les types primitifs obéissent à la sémantique de l’accès par valeur
Exemple : x == y signifie « x et y ont même valeur »
désignation des membres (sous réserve que x et distance soient membres de la
classe Point et qu’on ait le droit de les mentionner)
p.x
p.distance(q)
Types objets :
– tableaux
– chaı̂nes de caractères (String, une classe avec privilèges)
– toutes les autres classes
( en C++ cela s’écrirait
Exemple : x == y signifie « x et y ont même adresse »
IHM et Java
9 / 21
c
H.
Garreta, 2014
Java et les objets
p->x
et
p->distance(q) )
IHM et Java
10 / 21
Java et les objets
Tableaux
Chaı̂nes de caractères
Déclaration :
UnType tab[];
ou
UnType[] tab;
(ici tab vaut null)
Création du tableau :
tab = new UnType[nombre d’éléments];
Accès au ieme élément :
tab[i]
Nombre d’éléments du tableau :
tab.length
Un exemple :
public class Echo {
public static void main(String args[]) {
for (int i = 0; i < args.length; i++)
System.out.println(i + " : " + args[i]);
}
}
I javac Echo.java
I java Echo poids 200+30 ’au revoir’
0 : poids
1 : 200+30
2 : au revoir
I
c
H.
Garreta, 2014
puis
les références sont modifiables. Par la suite, on pourra écrire :
p = new Point(300, 0);
la précédente valeur de p est « oubliée »
Les objets obéissent à la sémantique de l’accès par référence
c
H.
Garreta, 2014
Point *p;
IHM et Java
11 / 21
Les objets String représentent des chaı̂nes de caractères immuables.
Notation :
String s = "Bonjour";
Concaténation :
s + " à tous" → "Bonjour à tous"
Propriété remarquable : si seul exp1 est de type String
exp1 + exp2
⇔
exp1 + conversionEnString(exp2 )
exemple :
System.out.println("x = " + x);
Comment ça marche ? Deux cas : a) si exp2 est d’un type primitif
exp1 + exp2
⇔
exp1 + String.valueOf(exp1 )
b) si exp2 est un objet
exp1 + exp2
⇔
exp1 + exp2 .toString()
(tous les objets possèdent une telle méthode toString())
c
H.
Garreta, 2014
IHM et Java
12 / 21
Java et les objets
Java et les objets
Classes, variables, méthodes
Une classe simple
Fichier Point.java
En Java il n’y a pas :
public class Point {
int x, y;
void placer(int a, int b) {
test de la validité de a et b
x = a;
y = b;
}
double distance(Point q) {
int dx = x - q.x;
int dy = y - q.y;
return Math.sqrt(dx * dx + dy * dy);
}
public String toString() {
return "(" + x + "," + y + ")";
}
exemple d’emploi :
}
Point p;
p = new Point();
p.placer(10, 20);
System.out.println("p : " + p);
p : (10,20)
des variables ou des méthodes définies en dehors de toute classe
des méthodes qualifiées inline
le compilateur se charge de détecter certaines méthodes qui le méritent
des classes ou méthodes amies (friend)
mais être du même paquet est une forme d’amitié
d’opérateur “::” pour la résolution de portée ; au lieu de
UneClasse::unMembre
on écrit
UneClasse.unMembre
c
H.
Garreta, 2014
IHM et Java
13 / 21
c
H.
Garreta, 2014
Java et les objets
14 / 21
Java et les objets
Le pointeur this
Constructeurs
Fichier Point.java
Fichier Point.java
public class Point {
int x, y;
void placer(int x, int y) {
test de la validité de a et b
this.x = x;
this.y = y;
}
double distance(Point q) {
int dx = this.x - q.x;
int dy = this.y - q.y;
return Math.sqrt(dx * dx + dy * dy);
}
public String toString() {
return "(" + this.x + "," + this.y + ")";
}
}
exemple d’emploi :
Point p;
p = new Point();
p.placer(10, 20);
System.out.println("p : " + p);
p : (10,20)
c
H.
Garreta, 2014
IHM et Java
IHM et Java
public class Point {
int x, y;
Point(int x, int y) {
test de la validité de a et b
this.x = x;
this.y = y;
}
Point(int x) {
test de la validité de x et 0
this.x = x;
this.y = 0;
}
Point() {
this.x = this.y = 0;
}
...
}
emploi :
Point p = new Point(10, 20);
Point q = new Point(30);
Point r = new Point();
15 / 21
c
H.
Garreta, 2014
IHM et Java
16 / 21
Java et les objets
Java et les objets
Collaboration entre constructeurs
Construction par défaut, destruction des objets
Fichier Point.java
Constructeur par défaut : si le programmeur n’a écrit aucun constructeur,
alors le compilateur fournit le constructeur sans argument
qui consiste à initialiser tous les champs avec 0 (ou 0.0, ou null).
public class Point {
int x, y;
Point(int x, int y) {
test de la validité de a et b
this.x = x;
this.y = y;
}
L’écriture d’un constructeur quelconque suspend ce mécanisme.
—————————–
Destruction des objets : il n’y a rien à faire, la machine Java s’en occupe.
Autrement dit : quand un objet n’est plus utile il suffit de l’« oublier »
Point p = new Point(x1, x1);
...
p = new Point(x2, x2);
Point(int x) {
this(x, 0);
}
}
Point() {
this(0, 0);
}
...
emploi :
Point p = new Point(10, 20);
Point q = new Point(30);
Point r = new Point();
c
H.
Garreta, 2014
IHM et Java
mécanisme du garbage collector, ou nettoyeur de mémoire
– déclenchement lorsque la mémoire manque ou la machine est oisive
– 1˚) marquage des cellules occupées par des objets accessibles
– 2˚) récupération des cellules non marquées : chaı̂nage, parfois regroupement
17 / 21
c
H.
Garreta, 2014
Java et les objets
IHM et Java
18 / 21
Java et les objets
Droits d’accès
Droits d’accès, exemple
Fichier Point.java
Quatre niveaux de visibilité :
public class Point {
le membre est accessible dans...
private int x, y;
int x;
...les méthodes de sa classe
exclusivement
public Point(int x, int y) {
test de la validité de x et y
this.x = x;
this.y = y;
}
int y;
...les méthodes de sa classe et celles
des autres classes du même paquet
public class UneClasse {
private
protected
int z;
...les méthodes de sa classe, des classes
du même paquet et des sous-classes
public
...
int t;
...les méthodes de n’importe quelle classe
public int
return
}
public int
return
}
accesseurs (getters)
getX() {
x;
getY() {
y;
public void setX(int x) {
test de la validité de x
this.x = x;
}
public void setY(int y) {
test de la validité de y
this.Y = y;
}
...
}
mutateurs (setters)
}
c
H.
Garreta, 2014
IHM et Java
19 / 21
c
H.
Garreta, 2014
IHM et Java
20 / 21
Java et les objets
Membres static et final, exemple
Fichier Truc.java
public class Truc {
int valeur;
Variable d’instance : chaque instance
en a son propre exemplaire.
final int rang;
Constante d’instance : chaque instance en a une,
dont on ne peut pas modifier la valeur.
static int nombreDeTrucs;
Variable de classe : il en existe un seul exemplaire,
accessible par toutes les instances.
static final int VAL_MAX = 100; Constante de classe : un seul exemplaire, immuable
(analogue à #define VAL_MAX 100 de C++)
public Truc(int valeur) {
assert valeur < VAL_MAX;
this.valeur = valeur;
rang = nombreDeTrucs;
nombreDeTrucs++;
}
...
}
c
H.
Garreta, 2014
IHM et Java
21 / 21