Vous êtes sur la page 1sur 11

Langage Java

par Patrick BELLOT


Docteur d’État en informatique
Professeur à l’École nationale supérieure des Télécommunications
et Christophe MATIACHOFF
Docteur de l’université Pierre-et-Marie-Curie
IBM Global Services - CGI Informatique, centre de Compétences Objet

1. Le langage orienté objet Java ............................................................... H 3 088 - 2


1.1 Caractéristiques ............................................................................................ — 2
1.2 Conclusions................................................................................................... — 7
2. Les paquetages Java................................................................................ — 7
2.1 Le paquetage java.lang ................................................................................ — 7
2.2 Les paquetages utilitaires ............................................................................ — 7
2.3 Le paquetage java.applet............................................................................. — 7
2.4 Le paquetage java.awt et les paquetages dérivés ..................................... — 7
2.5 Les paquetages java.io et java.net .............................................................. — 7
2.6 Le paquetage java.rmi et les paquetages associés ................................... — 8
2.7 Le paquetage java.sql .................................................................................. — 9
2.8 Le paquetage java.beans ............................................................................. — 9
2.9 Le paquetage java.lang.reflect .................................................................... — 9
2.10 Le paquetage java.security et les paquetages associés............................ — 9
2.11 Conclusions................................................................................................... — 9
3. Java et la sécurité .................................................................................... — 9
3.1 Les restrictions par le langage .................................................................... — 9
3.2 L’analyse du bytecode .................................................................................. — 9
3.3 La maîtrise du chargement des classes...................................................... — 9
3.4 Les restrictions sur les applets .................................................................... — 9
3.5 Les applets signées ...................................................................................... — 10
3.6 Conclusions................................................................................................... — 10
4. Mythes et réalités ..................................................................................... — 10

Pour en savoir plus ........................................................................................... Doc. H 3 088

ava est le dernier né des langages de programmation orientée objet. Il n’est


J pas un journal relatif à l’informatique qui ne présente régulièrement des
articles concernant le langage Java. Java envahit l’industrie et les projets sont
nombreux. Il y a peu de projets réels mais beaucoup de prototypes de validation
de la technologie. Le deuxième symposium Java qui s’est tenu à Berlin fin 1997
a vu la présentation de nombreux produits. Les constructeurs et les sociétés de
logiciels s’investissent dans la technologie Java. Aucun colloque concernant la
programmation orientée objet ne peut faire l’impasse sur Java. Enfin, Java con-
quiert les universités et les écoles où sa publicité, alliée à une certaine simplicité
de programmation pour des résultats spectaculaires, induit la demande des élè-
ves. Nous allons présenter Java, sa technologie et examiner objectivement les
raisons de ce succès.
Le langage Java et ses concepts ont été développés par Sun Microsystems Inc.
Les concepts ont été pour l’essentiel empruntés aux langages orientés objet
existants. Un site Web maintient à jour les informations sur Java, son historique
et ses nouveaux développements. Ces derniers sont si rapides qu’il est pratique-

Toute reproduction sans autorisation du Centre français d’exploitation du droit de copie est strictement interdite.
© Techniques de l’Ingénieur, traité Informatique H 3 088 − 1
LANGAGE JAVA ________________________________________________________________________________________________________________________

ment impossible d’obtenir une information à jour sans la consultation régulière


de ce genre de sites. Même si Java n’est pas exclusivement un langage de déve-
loppement pour Internet, il a grandement facilité la programmation répartie,
celle des interfaces graphiques et celle des « applets », petits programmes exé-
cutés par les « navigateurs Internet ». De fait, la vie de Java se passe sur Internet.
C’est là qu’il faut chercher les dernières nouveautés, demander des aides en cas
de doute, rechercher les derniers outils de développement ou les bibliothèques
récentes.
Le concept Java a été développé par l’équipe de James Gosling de Sun Micro-
systems Inc. dans le but d’obtenir des programmes téléchargeables et indépen-
dants du support d’exécution, machine et système d’exploitation. Le marché
ciblé est celui des machines portables de faible capacité mais pouvant être
connectées au réseau. Il est aussi celui des navigateurs Web qui ont besoin
d’interactivité pour n’être plus de simples afficheurs d’informations multimé-
dias. Il leur faut donc être programmables à partir des serveurs où ils vont cher-
cher l’information. Les promoteurs de Java en disent que c’est un langage
orienté objet, simple, réparti, robuste, sûr, indépendant de l’architecture, por-
table, efficace, « multithread » et dynamique.

1. Le langage orienté objet public class Point {

Java private int x,y ; // les coordonnŽes du point

// dŽplacer un point

Java fait partie de la famille des langages orientés objet qui public void moveTo(int nx, int ny) {
regroupe Eiffel, C++, SmallTalk, Clos et quelques autres dont Ada
qui intègre à présent certains concepts de l’orienté objet. Sa syntaxe x = nx ;
est proche de celle de C++ [6] mais l’analogie avec C++ ne doit pas y = ny ;
être faite trop rapidement. Sur le fond, la parenté est bien plus
grande avec SmallTalk [9]. Être orienté objet signifie qu’en dehors }
des types de base prédéfinis tels que les nombres ou les caractères, }
tout est objet. Les programmes sont constitués par assemblages
des composants logiciels que sont les objets. L’objet est la réunion Figure 1 – Une classe Point
dans une même entité d’une structure de donnée et des algorithmes
permettant de manipuler cette structure de donnée. Cette idée
s’oppose à celle de la programmation conventionnelle où données Les objets : création et référence.
et traitements sont séparés. L’objet prolonge la célèbre équation de
N. Wirth [13] Program = Data Structures + Algorithms. L’objet se dis- Un objet pour exister doit être créé à partir de sa classe. La créa-
tingue du paquetage [3] de la programmation modulaire par l’outil tion se fait à l’aide mot clef new suivi du nom de la classe et d’une
de sa déclaration, la classe, et par la manière d’exécuter les pro- paire de parenthèses. Ainsi l’expression new Point() a comme
grammes. Enfin, il s’en distingue par le concept d’héritage qui per- valeur une référence sur un objet créé de la classe Point. Notons,
met de créer des objets par spécialisation du modèle d’autres que comme en Eiffel [15], la notion de pointeur n’existe pas en Java,
objets. elle est remplacée par celle équivalente de référence. Notons
également qu’il n’est pas possible d’effectuer d’opération sur les
références comme nous pourrions le faire sur des pointeurs en C ou
en C++. Ces opérations sont une source bien connue de bogues. En
1.1 Caractéristiques Java, comme en C++, et contrairement à Smalltalk, les types de base
tels que les nombres, les caractères ou les booléens ne sont pas
considérés comme des objets à part entière. Ils possèdent une
sémantique par valeur et non par référence : c’est une copie des
Les classes. types de base qui est passée comme argument des envois de mes-
Une classe est le type d’un objet. Tout objet appartient à une sages, et non une référence.
classe, on dit qu’il est instance de cette classe. La figure 1 donne la Les variables.
déclaration d’une classe Point décrivant un point comme ayant Les variables doivent être déclarées avec leur type avant toute
deux coordonnées x et y de type entier et connaissant une procé- utilisation. Une variable ayant pour type une classe est destinée à
dure moveTo(nx,ny) permettant de déplacer le point. De telles pro- contenir une référence sur les objets de cette classe. Initialement,
cédures ou fonctions décrites dans la classe sont appelées des elle contient la référence null qui ne référence aucun objet. Ainsi,
méthodes tandis que les données décrites dans la classe sont appe- on pourrait écrire :
lées des attributs, des champs ou encore des variables d’instance.
Les méthodes et les attributs sont communs à toutes les instances, Point p ; // la variable p contient la rŽfŽrence null
tandis que chaque objet possède ses propres valeurs d’attributs. p = new Point() ; // p contient une rŽfŽrence sur un Point crŽŽ

Toute reproduction sans autorisation du Centre français d’exploitation du droit de copie est strictement interdite.
H 3 088 − 2 © Techniques de l’Ingénieur, traité Informatique
_______________________________________________________________________________________________________________________ LANGAGE JAVA

remplacé par le mot clef this. C’est un cas particulier de la syntaxe


public class Point {
générale de l’envoi de message.
private int x,y ; // les coordonnŽes du point
L’initialisation d’un objet.
Le choix du constructeur pour l’initialisation se fait d’après les
arguments que l’on donne au moment de la création de l’objet. Une
// premier constructeur
création par l’appel p = new Point() utilisera le constructeur sans
argument s’il existe ou aucun sinon. L’appel p = new Point(23,
public Point() { 46) utilisera le constructeur à deux arguments entiers. Types et
moveTo(0,0) ; nombre des arguments déterminent le constructeur exécuté.
}
Ramasse-miettes et destruction d’objet.
Nous avons vu comment créer des objets mais il nous est impos-
// deuxi•me constructeur sible de les détruire. Si la création des objets est explicite, leur des-
truction est implicite. Il nous suffit de les oublier pour qu’un
programme appelé ramasse-miettes ou encore garbage collector se
public Point(int ix, int iy) { charge de récupérer la place allouée pour ces objets. Un objet est
moveTo(ix,iy) ;
oublié lorsqu’il n’est plus référencé nulle part, ni dans un attribut
d’un objet, ni dans une variable locale d’une méthode en cours
} d’exécution, etc. Ce programme est exécuté en tâche de fond de très
faible priorité. Il est bien connu qu’une source majeure de bogues
dans les programmes provient de désallocations de données mal
// dŽplacer un point
faites ou bien oubliées. Le ramasse-miettes, technologie très sophis-
tiquée déjà utilisée dans Lisp, Prolog, SmallTalk et Eiffel, libère le
public void moveTo(int nx, int ny) { programmeur de la contrainte de désallocation des données.
x = nx ; Les destructeurs.
y = ny ;
Le ramasse-miettes est capable de récupérer la mémoire d’un
objet oublié mais il ne peut réaliser certaines désallocations de res-
} sources liées à cet objet. Ainsi, si l’objet contient un descripteur de
fichier ouvert, le ramasse-miettes ne fermera pas le fichier seul. Si la
classe de l’objet déclare une méthode dont l’en-tête est void fina-
// calculer la distance ˆ l'origine (0,0)
lize(), celle-ci sera exécutée avant la destruction de l’objet. C’est
dans cette méthode que le programmeur doit éventuellement libé-
public int distOrigin() { rer des ressources autres que la mémoire.
L’héritage de classe.
return((int)Math.sqrt(x*x+y*y)) ;
La classe telle que nous l’avons définie n’est guère différente d’un
}
paquetage comme on en trouve en Ada [3]. C’est le mécanisme
} d’héritage qui distingue réellement la classe du paquetage. On peut
déclarer qu’une classe, la sous-classe, hérite d’une autre classe, la
Figure 2 – La classe Point avec des constructeurs super-classe. La déclaration d’héritage se réalise en faisant suivre le
nom de la sous-classe par le mot clef extends et le nom de la super-
classe (cf. figure 3). Une fois l’héritage déclaré, les attributs et les
Envoi de message. méthodes de la super-classe sont hérités dans la sous-classe
comme si ils y avaient été définis. Il est alors possible d’opérer de
Une méthode est toujours déclarée dans une classe et est exécu- plusieurs manières non exclusives :
tée par un envoi de message à un objet de la classe. Un envoi de — il est possible d’enrichir la sous-classe avec de nouveaux attri-
message peut être assimilé à un appel de procédure classique qui buts et de nouvelles méthodes. La figure 3 montre une classe
s’effectuerait dans le contexte d’un objet particulier, celui du rece- DrawablePoint héritant de la classe Point et l’enrichissant avec
veur du message. Ainsi l’instruction p.moveTo(23,1024) est un attribut color et un constructeur. Notons dans ce fichier l’impor-
l’envoi du message moveTo(23,1024) au point p, qui a pour effet tation des classes prédéfinies du paquetage java.awt sur laquelle
de déplacer p en attribuant les valeurs 23 et 1024 à ses coordonnées nous reviendrons plus tard. Ce paquetage définit la classe Color ;
x et y. Notons que les méthodes peuvent avoir des résultats et être — il est possible de redéfinir une méthode héritée. On donne
utilisées comme des fonctions. Ainsi la méthode distOrigin() alors dans la sous-classe une définition d’une méthode ayant la
décrite figure 2 peut s’utiliser dans un appel int n = p.distOri- même en-tête que celle que l’on désire redéfinir ;
gin() puisque son résultat est de type entier.
— il est possible de masquer une variable en en donnant une
Les constructeurs. nouvelle définition. Le masquage d’une variable n’est pas définitif,
on peut la préfixer par le nom de la classe où elle a été précédem-
La pratique de la programmation nous apprend qu’il est toujours ment introduite pour accéder aux définitions dans les super-classes.
préférable d’initialiser ses données. Par défaut, nombres et carac- La classe DrawablePoint peut à son tour donner naissance à un
tères seront initialisés à zéro, les booléens à faux tandis que les nombre quelconque de sous-classes : l’héritage n’a de limites ni en
variables ayant pour type une classe sont initialisées avec la réfé- profondeur ni en largeur. Une classe pour laquelle on ne précise pas
rence null. L’initialisation d’un objet est réalisée par des méthodes de super-classe, comme la classe Point de la figure 2, hérite impli-
spéciales appelées constructeurs. Un constructeur a toujours citement de la classe Object. En fait, toute classe hérite directement
comme nom celui de sa classe, n’a pas de type de retour et peut pos- ou indirectement d’Object. La classe Object est une classe qui
séder des paramètres quelconques. Une classe peut avoir différents contient des méthodes générales de recopie, de test d’égalité, etc.
constructeurs. Dans la figure 2, on a ajouté deux constructeurs à la
classe Point. Le premier sans arguments initialise les coordonnées Chaînage des constructeurs.
à 0, 0. Le deuxième initialise les coordonnées avec ses arguments. Notons dans le constructeur de la classe DrawablePoint de la
On remarque que l’objet Point que l’on initialise s’envoie lui-même figure 3 l’appel super(ix,iy). Ce type d’appel doit toujours être la
un message moveTo. Dans ce cas, le receveur peut être omis ou bien première instruction du constructeur d’une sous-classe et fait réfé-

Toute reproduction sans autorisation du Centre français d’exploitation du droit de copie est strictement interdite.
© Techniques de l’Ingénieur, traité Informatique H 3 088 − 3
LANGAGE JAVA ________________________________________________________________________________________________________________________

en Smalltalk [9] où le typage est purement dynamique, c’est-à-dire


import java.awt.* ;
où seuls les objets sont typés, pas les variables.
public class DrawablePoint extends Point { On pourrait déclarer la variable de type Object, mais alors la
méthode moveTo(x,y) devrait être définie dans cette classe, alors
qu’il n’y a pas forcément de sens à déplacer n’importe quel objet.
private Color color ; // la couleur du point
Pour donner un sur-type à un ensemble de classes, Java utilise la
notion d’interface.
// un constructeur
Interfaces.
public DrawablePoint(int ix, int iy, Color ic) {
Une interface se déclare comme une classe mais en mettant le
super(ix,iy) ; mot clef interface à la place du mot clef class. Une classe
pointColor = ic ; n’hérite pas d’une interface, elle la met en œuvre, ou l’implémente.
L’interface n’est qu’une déclaration de signatures de méthodes et
}
toutes les classes implémentant cette interface auront une connais-
} sance commune de ces méthodes. Une même classe peut implé-
menter plusieurs interfaces. L’en-tête d’une classe sous sa forme
Figure 3 – La classe DrawablePoint générale est :
public class A extends B implements I1, ..., In {
... }
rence au constructeur de la super-classe. Si cet appel n’existait pas, Une interface peut être utilisée à la place d’une classe dans la
le compilateur rajouterait implicitement l’appel super() au cons- déclaration de type d’une variable à la condition que les seuls mes-
tructeur sans argument de la super-classe. sages envoyés à l’objet que la variable référence correspondent à
Héritage et typage. des méthodes déclarées dans l’interface. Par exemple, avec les
déclarations de la figure 4, les instructions suivantes sont valides :
Nous avons à présent deux classes, Point et DrawablePoint qui Mobile m ;
hérite de Point. Cela signifie que tout objet instance de la classe m = new Point() ;
DrawablePoint est aussi un objet de la classe Point. Ainsi, une m.moveTo (100,100) ;
variable de type Point peut contenir une référence sur une instance m = new Circle() ;
de la classe Point mais aussi une référence sur une instance de
m.moveTo(50,50) ;
n’importe quelle sous-classe de Point, en particulier Drawable-
Point. Les interfaces sont un moyen de donner un sur-type commun à
un ensemble de classes qui n’ont pas de relations d’héritage entre
Redéfinition et liaison dynamique. elles.
L’un des points forts de la programmation orientée objet est la
liaison dynamique des méthodes. Supposons que la classe Point Héritage simple et héritage multiple.
ait une méthode writeText qui affiche sous forme de texte les L’héritage en Java est simple. Cela signifie qu’une classe ne peut
coordonnées du point. Nous redéfinirons cette méthode dans la hériter que d’une seule autre classe. Il en est ainsi en SmallTalk.
classe DrawablePoint pour qu’elle affiche aussi la couleur. Suppo- Cependant C++ et Eiffel ont adopté l’héritage multiple : dans ces
sons une variable p de type Point. Nous avons vu que cette variable deux langages, une classe peut hériter de plusieurs autres classes.
peut contenir une référence sur une instance de la classe Point ou L’argumentation en faveur de l’héritage simple est qu’il est beau-
bien sur une instance de la classe DrawablePoint. Comment doit coup plus facile à appréhender que l’héritage multiple et qu’il ne
alors être compilé un appel de méthode p.writeText() ? Le pro- pose pas de problèmes sémantiques comme celui de savoir quelle
blème est que si p référence une instance de la classe Point, il faut méthode exécuter lorsque deux méthodes de même en-tête sont
exécuter la méthode writeText de la classe Point alors que si p héritées dans une classe. La technologie Eiffel est là pour montrer
référence une instance de la classe DrawablePoint, c’est la que, bien appréhendé et en utilisant des ressources programma-
méthode writeText de la classe DrawablePoint qu’il faut exécu- tiques bien conçues comme les clauses d’adaptation d’héritage
ter. Le compilateur n’a statiquement aucun moyen de déterminer d’Eiffel, l’héritage multiple se révèle simple d’utilisation, sans
quel objet sera référencé par la variable p. Il n’a d’autre choix que de aucune ambiguïté et tellement plus puissant. S’il est vrai que l’on
programmer une recherche dynamique de la méthode à exécuter à peut se passer de l’héritage multiple dans la modélisation des pro-
partir de l’objet référencé par p au moment de l’exécution de l’appel. blèmes et dans la programmation, il est appréciable de pouvoir l’uti-
Signalons que ce type de recherche n’est nécessaire que dans des liser. En Java, les interfaces permettent de contourner le problème,
cas comme celui-ci et qu’il est néanmoins très efficace. À tel point au prix de redéfinitions de méthodes.
que les langages SmallTalk et Eiffel [15] l’utilisent exclusivement
même quand ce n’est pas obligatoire. Variables et méthodes de classes.
Polymorphisme. En faisant précéder des déclarations de variables ou de méthodes
par le mot clef static, on déclare des variables et des méthodes de
La recherche dynamique de la méthode à exécuter est l’une des classe. Cela signifie que ces variables et méthodes appartiennent à
forces de la programmation orientée objet puisqu’elle permet une la classe et non aux objets. Ce n’est plus un objet qui les exécute. On
bonne modularité et une bonne répartition du code dans les classes. les référence en utilisant la notation pointée avec le nom de la
C’est elle qui nous dispense des grosses procédures de traitement classe plutôt qu’un objet. Ainsi dans la figure 2, l’appel
par cas selon la nature de l’argument employé. La faculté de décla- Math.sqrt(x*x+y*y) dans la méthode distOrigin correspond à
rer et de mettre en œuvre des méthodes de signatures identiques l’appel d’une méthode de classe. En effet Math est le nom d’une
dans des classes différentes ne se limite pas aux classes et leurs classe fournissant des outils mathématiques et sqrt est une
sous-classes. On parle alors de polymorphisme. On pourrait ainsi méthode de classe de la classe Math. Programmer uniquement avec
définir la méthode moveTo(x,y) dans d’autres classes que les clas- des méthodes de classe revient à programmer classiquement. En
ses Point et DrawablePoint, par exemple une classe Circle. Le effet, une classe contenant des méthodes de classes apparaît
problème est alors de savoir comment manipuler des objets aussi comme un paquetage de procédures et de fonctions impératives
différents à l’aide d’une même variable ou, plus précisément, quel classiques qu’il suffit de préfixer par le nom de la classe pour les
type donner à cette variable. Notons que ce problème n’existe pas exécuter.

Toute reproduction sans autorisation du Centre français d’exploitation du droit de copie est strictement interdite.
H 3 088 − 4 © Techniques de l’Ingénieur, traité Informatique
_______________________________________________________________________________________________________________________ LANGAGE JAVA

par défaut lorsqu’aucun mot clef n’est utilisé. Le tableau 1 décrit


// DŽclaration d'une interface. sommairement ces quatre modes.
Nota : en Ada [3], c’est la notion de paquetage avec ses deux composantes : l’une
public interface Mobile { déclarative à l’intention de l’utilisateur qui ne contient que des en-têtes et de la documen-
tation, l’autre à l’usage du programmeur qui met en œuvre le paquetage et qui contient le
public void moveTo(int nx, int ny); code effectif. Eiffel et son environnement [16] proposent de nombreux outils syntaxiques
} pour décrire la visibilité des composantes d’une classe mais aussi et surtout différents
modes de visualisation d’une classe dont un qui permet de ne voir que les composantes
accessibles avec leurs en-têtes, leurs commentaires et leurs conditions d’utilisation sous la
// DŽclaration de la class Point implŽmentant l'interface
forme de pré et postconditions.

public class Point implements Mobile { Par exemple, avec la déclaration de la figure 2, seules les métho-
des de la classe Point peuvent utiliser nommément les attributs x
private int x,y ; // les coordonnŽes du point et y alors qu’un message moveTo(nx,ny) peut être envoyé par
n’importe quel objet.
...

public void moveTo(int nx, int ny) {

x = nx ; Tableau 1 – Les modes de visibilité


y = ny Mode par Mode Mode Mode
Visibilité
défaut public protégé privé
}
} Visible par les sous-classes oui oui oui non
du même paquetage
// DŽclaration de la classe Circle implŽmentant aussi l'interface Visible par les sous-classes non oui oui non
d’un autre paquetage
public class Circle implements Mobile {
Visible par les non-sous- oui oui oui non
private Point centre ; // centre et rayon du cercle private classes du même
paquetage
int radius ;
Visible par les non-sous- non oui non non
public Circle() { classes d’un autre
paquetage
radius = 20 ;
centre = new Point() ;
} Classes abstraites.
Presque tous les langages orientés objets proposent la notion de
public void moveTo(int nx, int ny) { classe abstraite. Une classe est déclarée abstraite, mot clef abs-
centre.moveTo(nx, ny); tract, dès lors que l’une de ses méthodes est elle-même abstraite.
Une méthode abstraite est une méthode dont on ne déclare que
}
l’en-tête et dont on ne donne pas la mise en œuvre. Les méthodes
} abstraites sont héritées par les sous-classes. Si la sous-classe ne
donne pas une mise en œuvre de la méthode abstraite, elle doit elle-
Figure 4 – L’interface Mobile même être déclarée abstraite. Les classes abstraites ne peuvent pas
avoir d’instances car il leur manque des éléments de mise en œuvre.
Utilisation des classes abstraites.
Constantes, méthodes et classes finalisées. L’utilité des classes abstraites est fort bien décrite dans de nom-
Java se veut un langage sécurisé et il est vrai que beaucoup de breux ouvrages [4], [15]. Un exemple de classe abstraite est la classe
protections sont mises en place. L’une d’elles consiste à empêcher la Textable de la figure 5. Cette classe décrit deux méthodes d’affi-
redéfinition de méthodes ou le changement de valeurs de variables chage textuel d’un objet. La première, writeText() est abstraite
d’instances en les déclarant finalisées à l’aide du mot clef final. car elle dépend des particularités de l’objet. La deuxième,
Une variable de classe finalisée et initialisée est une constante de writeTextN1() écrit une représentation textuelle de l’objet par un
classe. On peut également empêcher les programmeurs d’étendre appel à writeText() puis affiche un saut de ligne. Pour que
une classe donnée à l’aide du qualificatif final : aucune classe ne writeTextN1() puisse appeler writeText(), il faut que celle-ci
peut hériter d’une classe finalisée. Cela permet d’éviter des utilisa- soit déclarée. Dans cette classe, c’est une méthode abstraite. Puis,
tions perverses de certaines classes, en particulier parmi celles four- toutes les sous-classes qui hériteront de la classe Textable devront
nies par l’environnement Java. Cela permet aussi d’optimiser la mettre en œuvre la méthode writeText() à leurs manières particu-
compilation des appels de méthodes de cette classe puisqu’on sait lières mais elles hériteront toutes de la méthode writeTextN1().
qu’elles ne seront pas redéfinies et qu’on peut se passer de la liaison Ici aussi, on comprend que la recherche de la méthode write-
dynamique de méthodes. Text() doit être dynamique.
Encapsulation des données et des programmes. Retour sur les interfaces.
Un credo du Génie logiciel est la nécessité de masquer tout ou Une interface peut être vue comme une classe complètement abs-
partie des informations qui ne sont pas strictement nécessaires à traite. Les interfaces peuvent néanmoins contenir des déclarations
l’utilisation d’un sous-programme par un autre programmeur. Les de constantes. Les constantes sont des attributs déclarés statiques,
avantages en sont bien connus avec, en particulier, la possibilité de mot clef static et finalisés, mot clef final.
mettre en œuvre différemment ce sous-programme sans que son Les paquetages.
utilisateur ne soit pénalisé.
Afin d’éviter les collisions de noms en cas de réutilisation de code,
Java propose quatre modes de visibilité des composantes : le les classes sont regroupées en paquetages. Les paquetages sont
mode public avec le mot clef public, le mode protégé avec le mot appelés des clusters en Eiffel. Un paquetage est le regroupement
clef protected, le mode privé avec le mot clef private et le mode logique et physique d’un certain nombre de classes dans un réper-

Toute reproduction sans autorisation du Centre français d’exploitation du droit de copie est strictement interdite.
© Techniques de l’Ingénieur, traité Informatique H 3 088 − 5
LANGAGE JAVA ________________________________________________________________________________________________________________________

public abstract class Textable { public class MyThread implements Runnable {

public abstract void writeText() ; public void startThread() {

public void writeTextNl() { // crŽation de la thread

writeText() ; Thread t ;

System.out.println() ; t = new Thread(this) ;

} t.start() ;

} }

Figure 5 – La classe abstraite Textable public void run() {


// code ˆ exŽcuter dans la thread
...
public interface Runnable { }
public abstract void run() ; }

} Figure 7 – Un lancement de processus léger

Figure 6 – L’interface Runnable

La généricité.
toire. Ces classes doivent bien entendu former un tout à peu près Une classe générique est une classe paramétrée par une ou plu-
autosuffisant. De fait, le nom complet d’une classe est composé du sieurs autre(s) classe(s). L’exemple le plus commun pourrait être
nom du paquetage, suivi d’un point et du nom de la classe. Le nom Stack[T] décrivant des piles d’objets de type T où T paramètre
complet n’est utilisé que pour désigner les classes définies dans un générique n’est pas spécifié. En effet, les opérations sur une pile
autre paquetage que celui où elles sont employées. Cependant, ne dépendent pas du type des objets de la pile. Il est ensuite
grâce à des déclarations import comme celle de la figure 3, il est possible d’utiliser Stack[Point] pour une pile de points ou
possible d’indiquer les paquetages dans lesquels le compilateur doit Stack[FloatNumber] pour une pile de nombres flottants. Java ne
rechercher une classe utilisée et non définie localement. propose pas les types génériques.
Les exceptions.
Structures de contrôle et expressions.
Pour gérer les erreurs et les situations exceptionnelles, Java
Les structures de contrôle de Java, conditionnelles, boucles, etc., propose un mécanisme d’exception inspiré de C++. La structure de
sont celles du C ANSI. Les opérateurs sont aussi ceux du C ANSI, les contrôle try permet de lancer l’exécution d’un bloc d’instructions
trois opérateurs concernant les pointeurs, i.e. ->, *, et &, en moins et tout en proposant des traitements d’exceptions dans des blocs
deux opérateurs >>> et instanceof(C) en plus. Signalons pour les catch suivant le bloc try. L’exécution du bloc d’instructions peut
programmeurs habitués à C que la sémantique des opérateurs déclencher une exception explicite à l’aide d’une instruction throw.
infixés  et & est modifiée dans le cas où les opérandes des données Le programme est alors interrompu et l’exception, qui est un objet
sont de type boolean. particulier, est propagée. Les traitements d’exceptions vérifient s’ils
ont prévu un traitement de ce type d’exception. Si oui, le traitement
Les processus légers.
du bloc catch correspondant est exécuté. La structure try peut
Java propose la notion très intéressante de thread, c’est-à-dire de également comprendre un bloc d’instructions, mot clef finally,
processus légers. Les processus légers sont des flots de contrôle qui sera exécuté qu’il y ait ou non une exception de déclenchée. La
distincts qui s’exécutent en parallèle dans un même programme. Ils programmation et la gestion des situations exceptionnelles par les
partagent leurs données. Java propose des outils de synchronisa- exceptions sont maintenant bien connues.
tion de type wait(), la thread s’endort, et notify() qui réveille une La machine virtuelle.
thread endormie. Enfin des outils d’exclusion mutuelle, mot clef
synchronized, permettent de poser des verrous sur un objet pour Le résultat de la compilation d’un programme Java est un code
en interdire l’accès à d’autres threads. L’exécution concurrente des abstrait, le bytecode, conçu pour un processeur abstrait [14]. Pour
flots de contrôle est réalisée en fonction des niveaux de priorité des exécuter ce bytecode, il faut un programme spécialisé, la machine
threads que le programmeur peut fixer. Les threads les plus priori- virtuelle, qui émule le processeur abstrait. Ainsi un programme Java
taires sont exécutées prioritairement jusqu’à ce qu’elles décident de est indépendant de la plate-forme, de l’architecture et du système
passer la main à l’aide d’une instruction wait() ou de l’appel de la d’exploitation, dès lors qu’il existe une machine virtuelle sur cette
méthode de classe Thread.yield(). C’est quand même au pro- plate-forme. Le défaut de ce genre de technique réside dans la perte
grammeur de gérer la concurrence en cas de processus ayant des de performances due à l’émulation du processeur abstrait. Dans [5],
priorités distinctes. Dans le cas le plus courant de priorités identi- nous aborderons les problèmes de la portabilité réelle de Java et de
ques, il n’a en général pas à intervenir. l’impact de la technologie machine virtuelle sur les performances de
ce langage.
Le petit schéma que nous allons présenter montre l’utilisation des
Les applets.
interfaces pour la création d’une thread. Pour pouvoir créer une
thread, il faut implémenter l’interface Runnable (cf. figure 6). Implé- Les applets, appliquettes en français, sont des applications desti-
menter Runnable oblige juste à avoir une méthode run(). nées à être exécutées dans les navigateurs Web. Les principaux
navigateurs Web ont incorporé une machine virtuelle qui leur per-
Pour lancer une thread, il faut un objet d’une classe implémentant met d’exécuter le code compilé Java. Nous y reviendrons aux para-
Runnable, la classe MyThread (figure 7), et qui crée un objet de la graphes 2 et 3.
classe Thread en se donnant lui-même en paramètre à l’aide du mot
clef this qui désigne l’objet lui-même. En envoyant le message L’édition de lien dynamique.
start à l’objet de type Thread, celui-ci lance l’exécution de la La classe ClassLoader du paquetage fourni java.lang permet
méthode run() de l’instance de MyThread, dans un flot de contrôle de charger dynamiquement des classes. Ces classes peuvent même
séparé. être téléchargées à travers le réseau Internet si elles proviennent

Toute reproduction sans autorisation du Centre français d’exploitation du droit de copie est strictement interdite.
H 3 088 − 6 © Techniques de l’Ingénieur, traité Informatique
_______________________________________________________________________________________________________________________ LANGAGE JAVA

d’un serveur accédé par le Web. Java propose donc, et c’est relative- sion. Enfin le paquetage java.text permet le formatage des dates,
ment unique, des outils de chargements et d’éditions de lien dyna- des heures et des nombres suivant les conventions de chaque pays.
miques. Les navigateurs Web se servent de la classe ClassLoader Java utilise le standard Unicode établi par le Unicode Consortium
pour réaliser des téléchargements de classes sécurisées (cf. § 3). pour le codage des caractères. Ce codage est réputé pourvoir sup-
porter l’échange, le traitement et l’affichage de textes écrits dans dif-
férentes langues.
1.2 Conclusions
2.3 Le paquetage java.applet
Java est un langage plaisant qui a fait le choix de la sécurité plutôt
que celui des fonctionnalités à tout prix. On peut se féliciter de la
suppression des pointeurs remplacés par des références. Certains Le paquetage java.applet permet d’écrire des applets, ces
déplorent l’absence de pointeurs sur fonction comme il en existe en petits programmes que peuvent exécuter les navigateurs Web.
C++, mais la technologie objet permet sans aucun travail supplé- L’applet est une classe héritant de la classe java.applet.Applet.
mentaire de s’en passer, grâce à une conception véritablement C’est un programme d’interface dont l’affichage est réalisé à l’inté-
orientée objet : on peut réifier les traitements en en faisant des rieur du navigateur Web, au sein d’une page HTML. L’utilisateur
objets que l’on passe en paramètres [4], [15]. peut redéfinir des méthodes comme init(), initialisation des res-
On peut, en revanche, regretter l’absence d’héritage multiple. La sources de l’applet, ou paint(), dessin de l’interface de l’applet. Il
méthode des interfaces compense cela mais elle est beaucoup peut aussi définir simplement les réactions de l’interface aux actions
moins naturelle que l’héritage multiple. Si l’héritage multiple a la de l’utilisateur : gestion des événements liés aux mouvements et
C++ peut sembler regrettable en raison des confusions et des clicks de la souris, saisie au clavier, changement de focus, ouverture
bogues qu’il apporte, les concepteurs de Java auraient pu s’inspirer et fermeture des fenêtres, etc.
des travaux de B. Meyer sur Eiffel. L’ouvrage de Flanagan [8] montre la puissance et la concision de
Même si les aspects sécurité sont cruciaux pour l’utilisation atten- Java pour l’écriture de telles applications interactives. Ce qui est
due de Java, ils induisent des limitations qui peuvent sembler remarquable, c’est que si l’on ne cherche pas à trop personnaliser
excessives. Beaucoup de classes importantes des paquetages four- ses interfaces et si l’on accepte des présentations à peu près stan-
nis avec Java sont finalisées et donc non extensibles. De plus, le lan- dardisées, il est très rapide d’écrire des applets. La figure 8 montre
gage est très limité du point de vue de l’interopérabilité et des accès une applet permettant à l’utilisateur de dessiner librement avec la
aux systèmes d’exploitation. Cela est justifié par la prévision de souris. Elle est inspirée de [8] (chapitre 4, page 102). Pour être char-
machines entièrement Java. C’est aussi l’origine du procès entre gée dans un navigateur Web, il suffit de mettre les lignes suivantes
Microsoft et Sun Microsystems puisque la machine virtuelle du dans un fichier HTML :
navigateur Microsoft Explorer intègre des fonctionnalités d’accès au <APPLET code=ÓDessin.ClassÓ
système d’exploitation sous-jacent qui n’entrent pas dans la norme width=300
Java de Sun Microsystems [20]. height=200>
</APPLET>

2. Les paquetages Java


2.4 Le paquetage java.awt
et les paquetages dérivés
Un ensemble riche de classes regroupées par domaines dans dif-
férents paquetages est fourni d’origine avec Java. Cette standardi-
sation de fait de nombreuses classes devrait permettre d’éviter les Ce paquetage est celui qui permet de construire des interfaces
problèmes rencontrés avec C++, où chaque éditeur de compilateur a graphiques. Classiquement, on crée des conteneurs, classe
développé ses propres classes, rendant difficile la recompilation Container et ses sous-classes, dans lesquels on dispose des com-
d’un programme source C++ dans un environnement de développe- posants appelés les widgets, classe Component et ses sous-classes,
ment différent de celui d’origine. La grande variété des classes pro- à l’aide d’instructions de répartition du type « en haut au centre ».
posées dans les paquetages Java permet une programmation facile Ce placement des widgets grâce à un gestionnaire de répartition,
et rapide d’applications complexes. Dans cette section, nous don- classe implémentant l’interface Layout.Manager, est beaucoup
nons un bref aperçu de ce dont on dispose. plus pratique que le placement par coordonnées. Les interfaces gra-
phiques ainsi construites peuvent être exécutées par un navigateur
Web ou indépendamment de tout navigateur.
2.1 Le paquetage java.lang La programmation des réponses aux événements quand l’utilisa-
teur interagit avec les widgets est relativement classique et donc
assez lourde. Le paquetage java.awt.event lui est dédié.
Le paquetage java.lang contient les classes de base de Java : Le paquetage java.awt.datatransfer contient les classes per-
Object, String, Math, Thread, etc. La directive d’importation mettant de gérer le presse-papiers : opérations couper, copier, coller.
import java.lang.* ; est implicite. java.awt.image se charge des animations et traitements
d’images.

2.2 Les paquetages utilitaires


2.5 Les paquetages java.io et java.net
D’autres classes d’intérêt général comme Date, Random, Vector
ou Stack sont définies dans java.util. Le paquetage java.math Le paquetage java.io permet de réaliser classiquement des pro-
ne contient que les deux classes BigDecimal et BigInteger per- cédures d’entrée-sortie sur console ou sur fichiers. Notons qu’il per-
mettant de manipuler de très grands nombres sans perte de préci- met également de définir des tubes, les pipes d’Unix, pour la

Toute reproduction sans autorisation du Centre français d’exploitation du droit de copie est strictement interdite.
© Techniques de l’Ingénieur, traité Informatique H 3 088 − 7
LANGAGE JAVA ________________________________________________________________________________________________________________________

import java.applet.* ;
import java.awt.* ;
import java.awt.event.* ;

public class Dessin extends Applet {


protected int x_origin = 0 ; // coordonnŽes de l'origine pour
protected int y_origin = 0 ; // tracer des traits

public Dessin() { // procedure d'initialisation


addMouseListener(new DMouseListener()) ;
addMouseMotionListener(newDMouseMotionListener()) ;
}

// Les classes de rŽponse aux ŽvŽnements dus ˆ la souris.


// Ces classes sont dŽfinies ˆ l'interieur de la classe
// Dessin, ce sont des "inner class". Elles auraient pu
// •tre dŽfinies ˆ l'extŽrieur

private class DMouseListener extends MouseAdapter {


// AppelŽe quand l'utilisateur enfonce le bouton de la souris,
// elle mŽmorise les coordonnŽes de l'origine
public void mousePressed(MouseEvent e) {
x_origin = e.getX() ;
y_origin = e.getY() ;
}
}

private class DMouseMotionListener extends MouseMotionAdapter {


// AppelŽe quand l'utilisateur bouge la souris avec bouton
// enfoncŽ, trace des traits partiels.

public void mouseDragged(MouseEvent e) {


Graphics g = getGraphics() ;
g.drawLine(x_origin,y_origin,e.getX(),e.getY()) ;
x_origin = e.getX() ;
y_origin = e.getY() ;
}
}
}

Figure 8 – Une applet de dessin en Java 1.1

communication entre threads. Dans java.util.zip, on trouve les 2.6 Le paquetage java.rmi
outils nécessaires à la création et l’utilisation de fichiers compres-
sés.
et les paquetages associés
Avec le paquetage java.net, nous entrons dans un des aspects
Les paquetages java.rmi, java.rmi.dgc, java.rmi.registry
le plus intéressant et le plus original du langage Java : la program- et java.rmi.server sont dédiés à l’invocation de méthodes à dis-
mation en réseau. En matière de programmation du Web, il est pos- tance : Remote Method Invocation ou RMI. Il s’agit d’un mécanisme
sible d’analyser une information à partir d’une URL, c’est-à-dire à qui permet à un programme Java d’appeler certaines méthodes
partir de son adresse, pour en connaître le type et diverses autres d’un objet s’exécutant dans une autre machine virtuelle Java, le plus
informations. Il est également possible de télécharger cette URL. Ce souvent sur un serveur distant. L’établissement de la connexion et le
paquetage permet aussi d’établir assez simplement des communi- transfert des arguments et de la valeur de retour du message sont
cations entre machines distantes reliées par réseau à l’aide de soc- entièrement pris en charge par les différentes classes des paque-
kets via le protocole TCP/IP. tages RMI [10].

Toute reproduction sans autorisation du Centre français d’exploitation du droit de copie est strictement interdite.
H 3 088 − 8 © Techniques de l’Ingénieur, traité Informatique
_______________________________________________________________________________________________________________________ LANGAGE JAVA

2.7 Le paquetage java.sql 3.1 Les restrictions par le langage

Le paquetage java.sql est dédié à JDBC, Java DataBase Le premier niveau de sécurité est celui du langage lui-même. Java
Connectivity, une interface standard d’accès aux bases de données a remplacé les pointeurs par des références. Il n’y a pas d’arithmé-
SQL. Elle permet de se connecter et d’interroger toute base de don- tique des références en Java similaire à l’arithmétique des pointeurs
nées relationnelle possédant un driver JDBC ou ODBC, puisque le de C ou de C++. Il est donc impossible au programmeur de manipu-
pont JDBC-ODBC est fourni d’origine. ler des adresses mémoires pour accéder à des zones non autorisées.
La possibilité de déclarer une classe ou des méthodes finales
interdit tout héritage de la classe et toute redéfinition des méthodes.
2.8 Le paquetage java.beans Cela interdit à un programmeur mal intentionné de détourner ces
classes et ces méthodes de leurs objectifs initiaux.

Ce paquetage java.beans est dédié à l’architecture de compo-


sants logiciels JavaBeans. Elle permet de transformer une classe en 3.2 L’analyse du bytecode
composant autosuffisant et réutilisable, manipulable et paramétra-
ble dans un environnement de développement graphique, où les
applications sont construites par assemblage graphique de tels
composants. Ceux-ci sont constitués de propriétés, les attributs, Rien n’empêche un programmeur bien avisé de la machine vir-
proposent des services, les méthodes. Ils signalent des événements, tuelle de produire un bytecode véreux, ne respectant pas les restric-
comme le changement de la valeur d’une propriété. tions sur le langage énumérées dans le paragraphe 3.1. Rien
n’empêche un bon informaticien de concevoir un compilateur ne
respectant pas les restrictions sur le langage et produisant néan-
moins des fichiers d’instructions pour la machine virtuelle de Java.
2.9 Le paquetage java.lang.reflect C’est pourquoi le chargement des classes suspectes, c’est-à-dire cel-
les importées à travers le réseau, s’accompagne d’une vérification
du code pour la machine virtuelle. C’est de la responsabilité de votre
environnement d’exécution, en général un navigateur Web, de véri-
Ce paquetage est consacré à la méta-programmation. Il offre les
fier la qualité du bytecode pour la machine virtuelle. On s’assure
moyens de connaître dynamiquement les attributs et les méthodes
bien entendu que le code est bien un code pour la machine virtuelle
d’une classe chargée, pour envoyer par exemple un message cons-
Java. On vérifie aussi que l’exécution se passera sans débordement
truit dynamiquement à un objet.
de la pile d’exécution, que les registres de la machine virtuelle ne
sont pas utilisés à mauvais escient, bref que le code qui sera exécuté
n’a aucune chance de mettre à mal la machine virtuelle.
2.10 Le paquetage java.security
et les paquetages associés
3.3 La maîtrise du chargement des classes
Les paquetages java.security, java.security.acl et
java.security.interfaces sont dédiés à la sécurité des pro- C’est l’une des sous-classes de la classe abstraite
grammes Java et, notamment, aux applets signées, sujet du para- java.lang.ClassLoader qui est responsable du chargement
graphe 3. dynamique des classes. Le chargement des classes fait une distinc-
tion entre les classes locales et les classes téléchargées. Les classes
locales, qu’elles proviennent des bibliothèques du langage Java ou
qu’elles soient propriétés de l’utilisateur, sont considérées comme
2.11 Conclusions fiables. Elles sont chargées dans un espace d’adressage différent de
celui des classes téléchargées qui sont considérées comme non fia-
bles. On empêche ainsi la substitution d’une classe téléchargée à
Les paquetages Java sont la force de Java. Quel programmeur n’a une classe locale et donc le remplacement des classes fondamenta-
rêvé par exemple de pouvoir programmer simplement des inter- les des bibliothèques par des classes douteuses.
faces graphiques ou des programmes répartis. Ces paquetages le
permettent. Des 8 paquetages de la version 1.0 de Java, on est passé
à 22 dans la version 1.1. De nouvelles possibilités sont déjà propo-
sées pour la version 1.2, en béta test au moment où nous écrivons. 3.4 Les restrictions sur les applets
Parmi celles-ci, citons notamment une refonte des composants gra-
phiques, la gestion du glisser-déposer et un ensemble de classes
collections plus évoluées. Les environnements d’exécution des applets, c’est-à-dire les navi-
gateurs Web, sont chargés de mettre en œuvre des restrictions sur
ce que les applets sont autorisées à faire dans votre environnement.
Ces restrictions concernent, par exemple, les accès à vos systèmes
3. Java et la sécurité de fichiers. Il est interdit d’ouvrir des fichiers en lecture ou en écri-
ture, d’analyser des répertoires, de détruire ou renommer des
fichiers, de vérifier l’existence d’un fichier, etc.
Les programmes Java sont destinés à être téléchargés à travers le Les restrictions concernent aussi les accès réseaux, qui sont éga-
réseau, ce qui implique des aspects sécuritaires. Nul n’oserait exé- lement interdits sauf vers le site d’où provient l’applet téléchargée.
cuter un code téléchargé dont il ignore le contenu réel s’il ne dispose Les applets ne doivent pas pouvoir créer d’objets fondamentaux,
d’éléments quant à la sûreté du code. La sécurité est assurée à plu- comme des dérivés de la classe java.lang.ClassLoader. Elles ne
sieurs niveaux et concerne principalement les applets. peuvent exécuter que des méthodes Java, les appels à des DLL écri-

Toute reproduction sans autorisation du Centre français d’exploitation du droit de copie est strictement interdite.
© Techniques de l’Ingénieur, traité Informatique H 3 088 − 9
LANGAGE JAVA ________________________________________________________________________________________________________________________

tes dans d’autres langages étant interdits. Les navigateurs offrent arrière car l’on perd le réflexe d’envisager soi-même la gestion de la
souvent la possibilité d’inhiber les restrictions. mémoire.
Pour les applications Java qui ne sont pas des applets, il n’y a Un langage efficace et portable.
aucune restriction a priori. Il est possible alors de définir ses propres Le problème de l’efficacité réelle de Java sera abordé plus profon-
règles, en créant une sous-classe de la classe abstraite Security- dément dans [5]. La mise en œuvre de Java est présentée comme
Manager et en l’associant à l’application par la méthode de classe novatrice alors que le concept de machine virtuelle était déjà forma-
System.setSecurityManager. lisé par L. Nolin, un des pères de l’informatique française, en 1969
On peut imaginer bien d’autres restrictions, mais il faut garder à [19]. Il a d’ailleurs largement été utilisé dans le passé. Même s’il
l’esprit que c’est le navigateur, et lui seul, qui est libre de les mettre apporte des avantages non négligeables dans le domaine de la por-
en œuvre. En particulier, on ne connaît pas de navigateur restrei- tabilité en libérant l’exécutable du système d’exploitation et de
gnant la surconsommation de mémoire ou de CPU. l’architecture matérielle, il n’en reste pas moins que la perte
d’efficacité est sensible. Sans cette technique, il n’aurait pas été
envisageable de télécharger du code dans les navigateurs Web,
mais Java est en moyenne vingt fois plus lent qu’un code C++ équi-
3.5 Les applets signées valent [8]. On peut cependant arguer que, dans son domaine
d’application privilégié, c’est-à-dire les interfaces et la programma-
tion répartie, le problème des performances est moins crucial que
Les restrictions imposées aux applets sont, dans la pratique, sou- celui des fonctionnalités.
vent trop contraignantes. Depuis la version 1.1, Java introduit la Nous pouvons aussi mentionner les compilateurs JIT, compila-
notion d’applets signées pour lesquelles les restrictions sont levées. teurs Just In Time aussi appelés compilateurs à la volée que nous
Il s’agit d’applets téléchargées dont le code est accompagné d’un verrons dans [5].
certificat garantissant son origine et sécurisé par un système de
cryptage pour garantir la sûreté du transfert. Les facilités d’un langage de prototypage.
On sait l’attrait des langages interprétés (Lisp, Prolog, Basic...)
dans le processus de programmation : une erreur est corrigée
presqu’à la volée et il n’y a pas de temps de compilation et d’édition
3.6 Conclusions de lien. On peut donc reprendre immédiatement l’exécution et les
tests. En Java, les classes sont compilées mais il n’y a pas d’édition
de lien, cette dernière est dynamique. Si une erreur est détectée, on
Tout a été pensé et mis en œuvre pour assurer la sécurité des corrige la classe, on la recompile et on relance l’exécution. Java
environnements exécutant des applets téléchargées. Cependant, les combine donc les avantages des langages interprétés et des langa-
informaticiens sont bien placés pour savoir que le risque zéro ges compilés.
n’existe pas.
Un langage puissant, simple d’utilisation.
Java est un langage simple d’utilisation car son orientation objet
est réduite au plus simple et sa sémantique est également simple.
4. Mythes et réalités Mais c’est surtout les bibliothèques de classes fournies avec le lan-
gage et dont nous avons parlé qui font de Java un langage très
apprécié. Il est très simple d’écrire des interfaces. Il est très simple
d’écrire des applications réparties. Il est très simple d’attaquer Inter-
Cette présentation avait pour but de montrer l’essence de Java, ce net depuis Java. C’est une des raisons du succès de Java dans
qu’on peut en attendre et comment y accéder. Nous pouvons à pré- l’enseignement universitaire : des élèves débutants peuvent se per-
sent faire le point sur les différentes qualités que l’on prête à ce lan- mettre d’écrire des applications impressionnantes. Par ailleurs, les
gage. outils de développement dont nous parlons en Doc H 3 088 sont
Un langage orienté objet. assez complets et simples d’utilisation.
Java est un langage orienté objet, mais il ne propose pas tout ce Un langage sécurisé.
que l’on peut attendre d’un langage de ce type. En un sens, les puris- Nous avons vu au paragraphe 3 toutes les mesures qui ont été
tes de l’objet peuvent être déçus, mais le langage est suffisamment prises pour faire de Java un langage sécurisé protégé aussi bien
simple pour que le programmeur peu au fait de la technologie objet contre les maladresses des programmeurs que contre d’éventuelles
puisse s’y investir et maîtriser le langage rapidement. Seule les mauvaises intentions. Nous pensons que le but est atteint, notam-
notions de redéfinitions et de liaison dynamique des méthodes peu- ment par le contrôle du bytecode par la machine virtuelle, mais
vent demander un certain apprentissage. La syntaxe très proche de seule l’expérience nous le montrera. Il n’est pas certain que les pro-
celle de C ou de C++ est un autre facteur facilitant la prise en main moteurs de Java affichent les failles constatées ou connues du sys-
du langage. Mais attention, cette proximité de syntaxe ne traduit pas tème.
une proximité des sémantiques. Java est très éloigné de C++.
Un langage d’avenir.
Un langage plus propre. L’investissement de Sun Microsystems Inc., d’IBM et de Microsoft
Un aspect important pour les théoriciens de la programmation et a été colossal. Il est suivi de celui de beaucoup d’entreprises de
des langages est le toilettage du langage. Le langage est plus simple développement informatique. Les fonctionnalités de Java concer-
et plus propre que C++ avec, notamment, la suppression des poin- nant la programmation du Web sont telles qu’il devient l’outil incon-
teurs déjà préconisée par SmallTalk et Eiffel. De même, l’héritage tournable pour ce faire. C’est Java qui a donné l’interactivité réelle
simple apporte aussi une simplification de la sémantique du lan- aux applications dans les navigateurs Web. Sans Java, ces naviga-
gage même si celle-ci se paie par une complexification de la pro- teurs ne sont que de simples afficheurs d’informations et ce n’est
grammation. Le programmeur est libéré de la gestion de la mémoire pas suffisant pour des activités de gestion d’une entreprise via
grâce au ramasse-miettes qui le dispense des trop fameux problè- l’Intranet ou des activités de commerces électronique via Internet. Il
mes d’allocation et désallocation de mémoire propres aux langages est certain que l’on n’écrira pas tout en Java, car certaines applica-
de moins haut niveau. Le programmeur alloue en créant des objets tions ont besoin de beaucoup d’efficacité, mais le domaine d’appli-
mais il n’a jamais la charge de la récupération de la mémoire non cation de Java est très large et ses bibliothèques de classes lui
utilisée. Cela peut être déroutant pour les habitués de C et de C++ assurent un intérêt remarquable. Alors, oui ! Java est un langage
mais on s’y fait très bien au point de ne plus pouvoir revenir en d’avenir.

Toute reproduction sans autorisation du Centre français d’exploitation du droit de copie est strictement interdite.
H 3 088 − 10 © Techniques de l’Ingénieur, traité Informatique
P
O
U
Langage Java R

E
par Patrick BELLOT
N
Docteur d’État en informatique
Professeur à l’École nationale supérieure des Télécommunications
et Christophe MATIACHOFF
Docteur de l’université Pierre-et-Marie-Curie S
IBM Global Services-CGI Informatique, centre de Compétences Objet
A
Références bibliographiques V
[1] Java : market, opportunities, and trend. Zona
Research Inc (1997).
[8] FLANAGAN (D.). – Java in a nutshell. O’Reilly
International Thomson (1996).
[15] MEYER (B.). – Eiffel : The Language. 2e éd.
Prentice Hall (1992).
O
[2] ARON (P.) et PRADENC (H.). – La Java Card
débarque. Le Monde Informatique 739 (24
octobre 1997), 4.
[9] GOLDBERG (A.) et ROBSON (D.). – Smalltalk-
80 : The Language and its implementation.
Addison-Wesley (1983).
[16] MEYER (B.). – An Object-oriented environ-
ment : principles and application. Prentice
Hall (1994).
I
[3] BARNES (J.). – Programming in Ada 95.
Addison-Wesley (1995).
[10] HAROLD (E.R.). – Java Network Program-
ming. O’Reilly (1997).
[17] MEYER (B.). – Reusable software : the base
object-oriented component libraries. Pren-
R
[4] BELLOT (P.). – Conception et programmation [11] HOLMES (J.). – Object oriented compiler tice Hall (1994).
par les objets, le langage Eiffel. Soumis pour construction. Prentice Hall International
parution chez Eyrolles, 250 p., Paris (1997). (1995). [18] MORREY (B.) et HAMMOND (E.). – Java, por-
table avec certaines limites. Le Monde Infor-
[5] BELLOT (P.) et ROBINET (B.). – Conception de
logiciels et portabilité (H 3 288). Techniques
de l’Ingénieur, traité Informatique (1998).
[12] JAMES GOSLING (B.J.) et STEELE (G.). – The
JavaTM language specification. Addison-
Wesley, The Java Series (1996). [19]
matique 736 (3 octobre 1997), 26-27.
NOLIN (L.). – Formalisation des notions de
P
[6]

[7]
STROUSTRUP (B.). – The Design and Evolu-
tion of C++. Addison-Wesley (1994).
BURGER (C.). – Deuxième symposium inter-
[13]

[14]
JEANSEN (K.) et WIRTH (N.). – Pascal. Sprin-
ger-Verlag (1974).
LINDHOLM (T.) et YELLIN (F.). – The JavaTM [20]
machine et de programme. Gauthier-Villars
(1969).
SAINT-ÉLIE (L.). – Compatibilité Java : le dia-
L
national Java - 100 % Java, sinon rien ! Le
Monde Informatique 739 (24 octobre 1997), 4.
virtual machine. Addison-Wesley, The Java
Series (1996).
logue de sourd Sun-Microsoft. Le Monde
Informatique 739 (24 octobre 1997), 44-45. U
S
Outils de développement

D’après [1], le marché des outils de développement pour le langage Java En dehors de ces riches environnements de développement, il est possible
aura été dominé en 1997 principalement par quatre acteurs : Microsoft, de s’initier à Java sans bourse délier, avec le JDK, Java Development Kit de
Symantec, Sun et IBM. Ils représentent à eux seuls près de 80 % des revenus Sun Microsystems Inc., qui est téléchargeable à partir de
estimés de ce marché. En 1998, Borland devrait les rejoindre. Ils proposent les
http://java.sun.com/products/jdk.
environnements de développement graphiques suivants :
— Microsoft Visual J++, URL : Le JDK contient le minimum nécessaire à la programmation en Java :
http://www.microsoft.com/visualj ;
— les différents paquetages de Java ;
— Symantec Visual Café for Java, URL :
— le compilateur Java en ligne, javac ;
http://www.symantec.com/domain/cafe/deved ;
— Sun Java Workshop, URL : — la machine virtuelle et son interpréteur, java ;
http://www.sun.com/workshop/java ; — le visualisateur d’applet, permettant d’exécuter des applets sans utiliser
— IBM VisualAge for Java, URL : de navigateur Web, appletviewer ;
http://www.software.ibm.com/ad/vajava ; — le débogueur Java, jdb ;
— Borland JBuilder, URL : — le désassembleur de classes compilées, javap ;
http://www.borland.com/jbuilder. — le générateur de documentation qui suppose une certaine discipline
dans l’écriture des commentaires, javadoc ;
Une comparaison de ces environnements peut être consultée à l’adresse
Web : — des outils pour RMI ou la création de signatures d’applet ;
http://www.javaworld.com/javaworld/jw-11-jvtools.html. — bien d’autres outils : archiveurs, pour les nouvelles versions, etc.
Le choix des utilisateurs figure dans : On trouvera aussi bien d’autres paquetages permettant de réaliser des fonc-
http://www.developer.com/news/userschoice/111297_ide.html. tions importantes : JavaHelp pour la création de documentation en ligne,
JavaBlend pour l’écriture d’application accédant aux bases de données, Java-
Enfin, une liste très complète de tous les environnements de développe- Mail pour accéder au courrier électronique, Java Electronic Commerce Fra-
ment pour Java est tenue à jour dans : mework pour la programmation d’outils de commerce électronique, JavaIDL
http://www.javaworld.com/javaworld/tools/jw-tools-ide.html. pour interopérer avec CORBA, etc.

Toute reproduction sans autorisation du Centre français d’exploitation du droit de copie


est strictement interdite. − © Techniques de l’Ingénieur, traité Informatique Doc. H 3 088 − 1

Vous aimerez peut-être aussi