Le langage Java fut développé par James Gosling chez Sun Microsystems en 1991. Depuis l'apparition du WEB en 1993, le langage Java connaît un essor considérable.
· Java est un langage interprété et non compilé : les instructions Java Virtual Machine sont traduites lors de leur exécution en instructions natives de la machine.
Supposons que sur un des ordinateurs existe un
programme qui devra être exécuté sur les trois autres. On devra
alors non pas télécharger le fichier exécutable mais le fichier
source et le recompiler sur chaque machine avant exécution.
Mais si le programme est écrit en Java il suffit que chaque machine
télécharge le même fichier pré-compilé (___.class qu'on appelle
Bytecode file) et qu'elle le passe à son interpréteur Java qui se
charge alors du bon fonctionnement du programme.
En effet, Java repose sur une machine virtuelle qu'on appelle Java Virtual Machine (JVM). Le fichier source Java (extension .java) est pré-compilé en un fichier binaire (extension .class) exécutable sur la machine virtuelle Java. La machine virtuelle se charge alors de transformer les instructions JVM en des instructions natives de la plate-forme.
Programmation "classique"
programme
source
programme exécutable
compilation
= Exécution du ___.exe
_____.c
_____.cpp ______.exe
Programmation JAVA
programme
source
programme interprétable (bytecode)
pré-compilation
= Interprétation sur la
Machine Virtuelle Java
_____.java _____.class
Avantages : portabilité
Inconvénients : L'interprétation du bytecode est un processus plus lent que l'exécution d'un programme compilé dans le langage du processeur.
· Java est un langage orienté objet (vu à partir du cours n°2, dans ce premier cours, les concepts objet ne sont pas étudiés).
· Java est un langage sécurisé : par exemple en éliminant le référencement direct de la mémoire, on évite des erreurs graves pouvant mener à l'arrêt du système.
De nombreux logiciels permettent de développer en Java, on peut citer :
NetBeans, Eclipse, Jbuilder….
Pour exécuter un programme Java, il faut un
pré-compilateur et un interpréteur Java. Les créateurs de Java
fournissent gratuitement le JDK (Java Developpement Kit) qui
consiste en une collection de programmes et de fichiers permettant
de pré-compiler et d'exécuter des programmes Java.
Le kit complet peut être téléchargé à partir du site
www.javasoft.com.
Nous utiliserons le JDK 1.8
Les principaux outils que nous utiliserons sont :
javac : le pré-compilateur Java
java : l'interpréteur Java
appletviewer : le visualiseur des applets.
Pour écrire un programme Java, il faut utiliser un éditeur comme Notepad ou UltraEdit si on utilise le jdk ou l'éditeur fourni avec l'outil de développement (si on utilise un autre produit que le jdk).
Dans un 2ème temps (vers décembre) nous étudierons la plateforme Eclipse (version WebTools).
La syntaxe de java est proche de celle de C++. Toutefois, il faut préciser que :
@Java ne permet plus de définir des fonctions et des procédures indépendantes. Elles devront obligatoirement être définies dans une classe en tant que méthode.
@Le passage des paramètres par référence n’existe plus en tant que tel. Il faut pour l’implémenter , transmettre un tableau du type du paramètre, un tableau étant traité par Java comme une référence.
@Les chaînes des caractères ne sont pas traitées comme des tableaux.
@Les types structurés n'existent pas en tant que tels, il faut créer une classe.
@La syntaxe pour les entrées/sorties, les fonctions de manipulation de chaînes … est différente.
@Le type booléen existe en tant que tel.
· Ci-dessous figure un premier programme Java :
// Premier essai Ligne 1
class Premier_essai // Ligne 2
{ // Ligne 3
public static void main(String[] argv) // Ligne 4
{ // Ligne 5
System.out.println("Cela fonctionne"); // Ligne 6
} // Ligne 7
} // Ligne 8
La deuxième ligne class Premier_essai commence par le mot class, qui veut dire que nous allons définir une nouvelle classe java, suivi du nom de cette classe, qui est aussi le nom de notre programme. Nous verrons dans un chapitre ultérieur ce que sont exactement les classes. Retenez pour l'instant les choses suivantes :
Ø Un programme comporte au moins une classe.
Ø Cette classe doit obligatoirement porter le même nom que le fichier dans lequel le programme est enregistré. Le fichier possède, en plus, l'extension .java. Donc le programme Java ci-dessus doit être enregistré dans le fichier Premier_essai.java
La 4ère ligne est public static void main(String[] argv)
La partie fondamentale de cette ligne est void main(). main signifie que nous allons définir une méthode, ce qui est indiqué entre autres, par les parenthèses (). Une méthode est une sorte de procédure ou fonction appartenant à une classe.
Le type retourné est ici void donc "rien".
Cette méthode va être en quelque sorte le point d'entrée dans la classe et devra être présente si on souhaite que l'utilisateur puisse invoquer la classe.
Dans notre programme, la méthode main prend un paramètre, dont le nom est argv et le type String[]. Notre méthode main n'utilise pourtant pas ce paramètre, mais nous sommes obligés de le faire figurer. Notons que ce paramètre sera utilisé si on souhaite que le lancement du programme nécessite un paramètre.
La 6ème ligne affiche le message "Cela fonctionne".
Remarques : . les symboles pour les commentaires sont les mêmes qu'en C++.
. le respect de la casse est impératif comme c'est le cas en C ou C++.
Comme tout langage de programmation, Java possède ses propres types élémentaires servant à représenter les données.
Remarque : Dans Java la taille des types élémentaires est la même sur toutes les plate-formes. Ainsi le programmeur n'aura pas à se soucier des problèmes qui découlent en général d'un changement de plate-forme.
Les types
élémentaires ainsi que leurs caractéristiques sont résumés dans le
tableau ci-dessous:
Type |
Contenu |
Valeur initiale |
Bits occupés |
boolean |
true ou false |
false |
1 |
byte |
entier signé |
0 |
8 |
char |
caractère Unicode |
\u0000 |
16 |
short |
entier court signé |
0 |
16 |
int |
entier signé |
0 |
32 |
long |
entier long signé |
0 |
64 |
float |
nombre décimal à virgule flottante |
0.0 |
32 |
double |
nombre décimal à virgule flottante |
0.0 |
64 |
Codage des caractères par UNICODE (=> ASCII sur 128 premiers caractères et les 128 autres pour caractères spéciaux des divers langages, les suivants étant des symboles mathématiques, des symboles graphiques …).
Les caractères sont écrits entre ’ alors
’ ’ signifie blanc.
’\uNNNN’ signifie caractère dont la valeur UNICODE est NNNN.
Exemples :
’\u0020’ signifie blanc.
’\u0041’ signifie A çè 'A'
’\’’ signifie ’
’\\’ signifie \
Remarque : A la différence de C, la chaîne de caractères ne se termine pas par ‘\n’.
Attention : Le type d’un littéral est déterminé de la façon suivante :
· Un entier qui se termine par L ou l est un long, tous les autres sont des int.
· Un réel qui se termine par F ou f est un float, les autres sont des double.
Ils doivent :
Ø Commencer par une lettre de l’alphabet, une lettre accentuée ou _ ou $
Ø Comporter des lettres de l'alphabet, des lettres accentuées, des chiffres, le _ ou le $.
Exemple : garçon, maïs,... (Attention pas dans tous les JAVA)
Syntaxe : type ident ; // déclare une variable
ou type ident = valeur ; // déclare une variable et donne une valeur initiale ;
Exemple de définition et d'affectation d’une variable
int valeur;
// instruction quelconque
valeur=3;
La portée d'une variable est par définition la partie du code où cette variable est visible. Dans Java une variable n'est visible qu'à l'intérieur du bloc entre accolades dans lequel elle est déclarée et également dans les blocs qui y sont imbriqués.
Dans l’ordre de priorité :
1. [ ] () signes + et -
2. ++ -- ! (négation) instanceof
3. * / %
4. + -
5. < > <= >=
6. == (égalité) != (différence)
7. &&
8. ||
9. ? : (boolexpr) ? expr1 : expr2
10. = (affectation) ainsi que += *=…....
11. , (virgule, cf 2 instructions dans la partie initialisation ou dans la partie progression de la boucle for)
L'opérateur de concaténation des chaînes est +
Comme en C :
mat = ++ nombre est <> de mat = nombre + 1. En
effet dans le 1er cas on augmente la valeur de nombre
puis on attribue la valeur de nombre à mat.
dans le 2ème cas, on attribue nombre + 1 à mat, mais
nombre reste inchangé.
int x = 5 ; int y = x++ è à l'issue de ces 2 affectations, x=6 et y=5.
Exemple : // convertir ce décimal en entier
int entier = (int) flottant ;
promotion : la conversion peut être omise exemple : long ß int
l’inverse est accepté mais le type est obligatoire int ß (int) long
Exemples :
int i;
long l;
i = 15;
|
l = 5000;
|
En Java, les chaînes de caractères sont définies à l’aide du mot clé String (String est une classe) suivi du nom de variable. A la différence du C, elles ne sont pas une application particulière des tableaux et ne se terminent pas par le caractère nul ('\u0000').
Les variables chaînes de caractères peuvent être initialisées directement avec une chaîne de caractères.
Exemple : |
String chaine1 = "Bonjour"; String chaine2; chaine2 = "Bonsoir"; |
Attention : String commence par une majuscule.
Les fonctions de manipulation de chaînes seront étudiées ultérieurement.
if (boolexpr)
{
// instructions
}
else
{
// instructions
}
Remarques :
· Le else est bien sûr facultatif.
· Plusieurs instructions if...else peuvent être imbriquées les unes dans les autres.
· Il est à noter que comme en C, pour une instruction unique dépendant d’une condition, aucune accolade n’est obligatoire.
Exemple : |
if
(température>28)
if (température > 10) else System.out.println ("Il fait frais"); |
L'instruction de choix
switch (expr) exemple : switch (c)
{ {
case cexpr1 : case '0' : case '1' :
// instructions // instructions
break ; break ;
case cexpr2 : case '2' :
// instructions …
break ; break;
|
// instructions }
}
Idem langage C
Boucles tant que Boucles jusqu'à
while (boolexpr) do
{ {
// instructions // instructions
} }
while (boolexpr)
Boucles pour :
for (instruction(s)_initialisation; boolexpr; instruction(s)_progression)
{
// instructions;
}
Exemple:
for (int i = 0 ; i < tailletable ; i++)
{
table[i] = 0 ;
}
Remarque :
@Pour une instruction unique dépendant d’une condition de boucle, aucune accolade n’est obligatoire.
@Le corps de la boucle for n'est pas obligatoire.
@Il est possible (mais pas forcément conseillé) d'utiliser la commande break pour sortir de la boucle.
Les sorties
Nous avons déjà utilisé System.out.println.
out représente le flux de sortie standard.
Exemple de sortie standard(affichage) :
System.out.println("Bonjour"); // Affichage puis passage au début de la ligne suivante
System.out.print("Bonjour"); // Affichage non suivi du passage au début de la ligne suivante
println est une méthode qui prend un paramètre de type chaîne de caractères et affiche sa valeur sur la sortie standard. Cette méthode s'applique sur l'objet out, qui lui-même appartient à la classe System.
Nous avons vu que le caractère "\" permet de signaler les caractères spéciaux. Pour la mise en forme, on peut utiliser le passage à la ligne "\n" et la tabulation "\t".
Exemple :
System.out.println("\nLe silence est d'or");
Les chaînes de caractères Java peuvent être concaténées avec l'opérateur + , en fait toute variable (même d'un type autre que String) peut être concaténée à une autre variable pour former une chaîne dans une instruction d'affichage ou autre.
Exemples :
|
|
|
|
|
|
System.out.println(i+j);
Les entrées
in représente le flux d'entrée standard du système.
Exemple d’entrée standard :
import java.io.*;
class saisies
{
public static void main(String args[]) throws IOException
{
BufferedReader rep = new BufferedReader(new inputStreamReader(System.in));
…
String valeur = rep.readLine() ;
System.out.println("Voici la chaîne saisie : "+valeur);
}
}
Pour utiliser la classe BufferedReader qui est nécessaire pour la lecture du flux d'entrée, il faut inclure java.io.* et il faut renvoyer les exceptions (tout ceci n'est pas utile pour l'utilisation du flux de sortie).
On a effectué la déclaration d’un nouveau buffer d’entrée nommé rep et la saisie d’une chaîne par rep.readLine().
On peut convertir ce qui est saisi en entier, en byte, en entier court, en entier long, en réel simple précision, en réel double précision ou en caractère.
int i = Integer.parseInt(rep.readLine());
byte b = Byte.parseByte(rep.readLine());
short s = Short.parseShort(rep.readLine());
long l = Long.parseLong(rep.readLine());
float f = Float.parseFloat(rep.readLine());
double d = Double.parseDouble(rep.readLine());
String valeur = rep.readLine() ;
char c = valeur.charAt(0);
remarques :
Bien sûr, si la valeur saisie n'est pas du type attendu, cela "plante" le programme. Nous verrons plus tard comment procéder pour effectuer les contrôles de type à la saisie.
Pour éviter d'utiliser ce bloc d'instructions quelque peu complexes on construira et on utilisera une classe Entrée.