Introduction au langage JAVA

1. Généralités

1.1. Présentation

 

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"

 

imageprogramme source                                      programme exécutable

image                                      compilation

image                                                                                                         = Exécution du ___.exe

 

       _____.c

       _____.cpp                                                         ______.exe

 

Programmation JAVA

 

imageprogramme source                                             programme interprétable (bytecode)

image                                  pré-compilation

image                                                                                                         =  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.


 

1.2. Outils Java

 

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).

 

 

2.   Syntaxe du langage

 

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.


 

2.1. Premier programme Java

 

·       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++.


 

2.2. Types élémentaires

 

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.


 

2.3. Les identificateurs

 

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)

 

2.4. La déclaration des variables

 

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.

 

2.5. Principaux opérateurs

 

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 Cmat = ++ 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.


2.6. Le transtypage ou casting ou promotion

 

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;

Transtypage implicite

 
image         l = i;

         l = 5000;

Transtypage

 
image         i = (int) l;

 

2.7. Les chaînes de caractères

 

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.

 

2.8.Les instructions conditionnelles

Idem langage C
L'instruction SI

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)
            System.out.println ("Il fait très chaud");
else

            if (température > 10)
                        System.out.println ("Il ne fait ni trop chaud ni trop frais");

            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;

image

facultatif

 
            default :                                                           …

                   // instructions                                           }

}

 

2.9. Les instructions d’itération

 

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.


 

2.10.               Les entrées/sorties

 

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 :

Numéro = 10

 

donnera

 
int i = 10, j=3;

donnera

 
imageSystem.out.println("Numéro = " + i);

Numéro = 13

 

Numéro = 103

 

donnera

 
imageSystem.out.println("Numéro = " + i + j);

imageSystem.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.