Cours JAVA Construction destruction initialisation d’objets

Cours JAVA Construction destruction initialisation d’objets, tutoriel & guide de travaux pratiques JAVA en pdf.

Présentation générale

Java a été conçu par James Gosling en 1994 chez Sun. L’idée était d’avoir un langage de développement simple, portable, orienté objet, interprété. Java reprend la syntaxe de C++ en le simplifiant. Java offre aussi un ensemble de classes pour développer des applications de types très variés (réseau, interface graphique, multi-tâches, etc.)
Le but de ces notes de cours est de donner un premier aperçu sur Java en ne présentant que ce qu’il est nécessaire de connaître pour bien programmer objet avec Java. Java comprend bien d’autres aspects (programmation graphique, applets, programmation réseau, multi-tâches) que ce document ne prend pas en compte. Ce document suppose connu le langage C, mais pas C++. Enfin, mieux vaut avoir des rudiments sur l’orienté objet sans que cela soit vraiment bloquant pour le lire.

Le minimum vital sur les entrées sorties

Il n’est pas trivial d’écrire le programme « BONJOUR LE MONDE » en Java. Le but de ce paragraphe est de montrer comment écrire ce programme et de présenter une classe Entree qui encapsule les fonctions d’entrée en Java. Ceci afin d’être capable d’amorcer l’apprentissage de la programmation en Java.
Ecrire sur la sortie standard
Le premier programme Java à écrire est le suivant :
class Machin {
public static void main(String argv[])
{
System.out.println (« Bonjour le monde ! ») ;
}
}
Ainsi, la sortie de ce premier programme Java est :
Bonjour le monde !
Pour les personnes patientes et pas curieuse, passez au paragraphe suivant, vous n’avez pas besoin d’en savoir plus et le reste sera expliqué plus tard.
Pour les curieux impatients :
« class Machin » est la déclaration d’une classe (obligatoire en Java).
« public » signifie que main est visible de l’extérieure de la classe machin.
« static » signifie que main n’est pas associée a une instance mais à une classe…
« main » est le nom de la méthode…
« argv » est le tableau de chaînes de caractères habituels du C.
« String » est le nom de la classe chaîne de caractères
« System » est le nom de la classe système
« out » est le nom de l’instance pour effectuer des sorties
« println » est le nom de la méthode qui imprime une ligne avec un retour chariot.
Lire sur l’entrée standard
On peut également lire des informations sur l’entrée standard du programme. Pour cela, les primitives Java sont dans la classe System.in. Mais elles sont d’un niveau trop bas et un peu compliqué. Nous présentons donc la classe Keyboard (ne faisant donc pas partie de Java) qui permettra de faire des entrées avec des fonctions plus simples.
La classe Keyboard.
// keyboard.java import java.io.*; public class Keyboard
{
public static char getChar() ; public static String getString() ; public static int getInt() ; public static void pause() ;
}
La méthode getString() retourne la chaîne de caractères lue sur l’entrée standard. Elle retourne tous les caractères tapés jusqu’au retour chariot. La méthode getInt() est analogue à getString, mais convertit la chaîne lue sur l’entrée standard en un entier qu’elle retourne. La méthode pause() attend un retour chariot sur l’entrée standard. Elle est utile pour mettre un point d’arrêt dans le programme. On peut ainsi éviter que la fenêtre d’exécution du programme s’en aille trop vite en plaçant un pause() à la fin du programme. NB : ces méthodes sont minimales et ne sont réutilisables que pour débuter la programmation des entrées-sorties en Java. Elles devront être améliorées ensuite selon les besoins du programmeur.

Spécificités de Java par rapport à C++

Ce paragraphe rassemble les spécificités de Java par rapport à C++. Il est donc à sauter si vous ne connaissez pas C++.
• Pas de pointeurs, que des références…
• Interprété et dynamique
• Portable
• Multi-tache
Pas de pointeurs
Java fait une partie de sa publicité auprès des programmeurs (débutants) en clamant qu’en Java il n’y a pas de pointeurs mais que des références et en sous-entendant donc que Java simplifie la programmation. Nous pensons qu’il est nécessaire de faire un paragraphe expliquant que ce n’est pas vrai. Pour cela, ce paragraphe rappelle d’abord ce que sont des pointeurs et des références en C++, puis il explique pourquoi programmer avec des références Java est aussi difficile que de programmer avec des pointeurs en C++.

Rappel sur les pointeurs et références

Ce paragraphe rappelle le strict minimum sur ce que sont un pointeur ou une référence. En C, lorsque l’on déclare une variable avec un nom et un type, un emplacement mémoire du type de la variable est créé à une certaine adresse avec son nom pour y accéder. L’emplacement mémoire recevra la valeur de la variable lors d’une affectation.
int x ; // une déclaration en C
x = 3 ; // une affectation en C
Le C permet de manipuler dans le programme, les adresses des emplacements mémoire des variables. &x désigne l’adresse de la variable x. On peut déclarer des pointeurs d’un type qui sont des variables contenant des adresses de variables de ce type avec le symbole *.
int * p ; // un pointeur sur un entier
p = &x ; // p vaut l’adresse de x
L’opérateur * s’appelle l’opérateur de déréférencement et *p désigne la valeur contenue dans l’emplacement mémoire dont l’adresse et p.
int y = *p ; // y vaut 3
On peut aussi déclarer une référence à une variable existante. Une référence se déclare avec l’opérateur &. Une référence est un synonyme – un alias – pour désigner l’emplacement mémoire d’une variable.
int & z = x ; // z est une référence a x, z vaut 3
Si on change la valeur de x, la valeur de z est aussi changée et inversement. Idem avec *p.
x = 4; // x et z valent 4, *p aussi
z = 5; // x et z valent 5, *p aussi
*p = 6; // *p, x et z valent 6
Noter que les opérateurs & et * sont inverses l’un de l’autre. On a toujours :
*(&x) = x et &(*p) = p
Bruno Bouzy 5 09/10/03
Notes de cours Java
Attention, on ne peut pas déréférencer un pointeur qui ne contient pas une adresse valide.
int * q ;
*q = 7 ; // plantage
Il faut initialiser le pointeur avant :
int * q = &x;
*q = 7 ; // ok
La manipulation des pointeurs en C ou en C++ est réputée difficile et source d’erreurs fatales pour l’exécution du programme.
Références Java ou pointeurs C++, relier des objets restera toujours une tâche délicate !
Un pointeur C++ est une sorte de référence au sens large. La manipulation des références Java est analogue à celle des pointeurs C++ et elle est tout aussi difficile. Dans les deux cas, on a un synonyme d’une variable et on cherche la variable ; dans les deux cas, pointeur C++ ou référence Java, le problème du programmeur est d’avoir un synonyme valide pour chercher la variable ; si le synonyme est invalide (un pointeur C++ qui contient une adresse d’un emplacement mémoire ne correspondant pas à la variable recherchée ou une référence Java ne correspondant pas à la variable recherchée) l’exécution du programme sera incorrecte, que l’on soit en C++ ou en Java.
Donc, attention ! Le fait qu’en Java, les pointeurs aient disparu, ne simplifie en rien la tâche du programmeur souhaitant manipuler des liens inter-objet. Il faudra toujours mettre à jour ces liens et cela sera d’une difficulté égale de le faire en Java avec des références ou avec des pointeurs en C++ !
Interprété et dynamique
Exemple:
Alice écrit un « programme » qui ajoute 4 à une donnée.
Alice écrit dans le langage L.
Programme écrit en langage L : A = B + 4
Elle sait que l’entrée sera représentée par B et que le résultat sera représenté par A.
Compilation et exécution
Une compilation consiste à transformer un programme écrit dans un langage L en un programme écrit dans un langage M, exécutable après coup par une machine qui sait interpréter ou exécuter le langage M.
Langage M registre R = (B)
registre S = 4
registre R = registre R + registre S
(A) = registre R
La compilation consiste à transformer le premier programme en le second. Pour chaque instruction écrite en langage L, le compilateur engendre une ou plusieurs instructions écrites en langage M. Le compilateur prépare le travail. L’exécution consiste à faire lire les instructions du second programme écrit en langage M.

Interprétation

Une interprétation consiste à exécuter directement un code écrit dans un langage L sans le transformer avant de l’exécuter. Sur la machine, il existe un programme nommé interpréteur I de programmes écrits en langage L.
A l’exécution, l’interpréteur lit le programme de Alice, par exemple de gauche à droite.
Il lit A, il associe A au registre R.
Il lit =, il sait qu’il va affecter un valeur à R.
Il lit B, il associe B au registre S.
Il lit +, il sait qu’il va additionner quelquechose à B.
Il lit 4, il ajoute 4 au registre S.
Il affecte la valeur de S à R.
Il écrit le résultat de A qui est contenu dans R.
L’interpréteur fait donc 2 choses en même temps : il transforme les instructions écrites en langage L en instruction écrites en langage M et il les exécute.
Compilation versus interprétation
Si on dispose un programme écrit en langage L et d’une machine qui exécute du langage
M, il faut soit :
• avoir un compilateur qui transforme le programme du langage L vers le langage M. Par exemple, si on a un programme C++, et 3 machines : un PC, un Mac et une Sun il faudra 3 compilateurs.
• avoir un interpréteur qui comprend le programme en langage L. Par exemple, si on a un programme C++, et 3 machines : un PC, un Mac et une Sun il faudra 3 interpréteurs différents.
L’interprétation est une opération longue car elle fait les 2 choses simultanément :
• transformer les instructions
• et les exécuter.
Un programme compilé tourne plus vite qu’un programme interprété
La compilation est une opération longue car elle transforme les instructions. Mais un programme, une fois compilé, tourne plus vite que le même programme interprété car la transformation est déjà faite par la compilation. Seule l’exécution des instructions intervient lorsque le programme compilé tourne.
Un programme compilé est plus long à mettre au point qu’un programme interprété
Par contre, il est plus rapide de programmer avec un langage interprété qu’avec un langage compilé. En effet, étant donné un programme à mettre au point, le cycle (éditer, engendrer l’application, se mettre dans les conditions de test, exécuter) est plus rapide si l’application est interprétée. En effet, avec un interpréteur, votre application donnant un erreur dans une certaine condition, vous voulez faire disparaître l’erreur : vous devez modifier votre programme, recharger la modification, remonter en arrière dans votre exécution pour vous mettre dans les conditions du test et exécuter. Avec un langage interprété, vous n’avez pas besoin de relancer votre programme depuis le début. Par contre, avec un compilateur, si vous voulez faire disparaître une erreur : vous devez modifier votre programme, recompiler votre application, redémarrer votre programme au début, exécuter pour vous mettre dans les conditions du test et exécuter.
Java est un langage semi-interprété et semi-compilé Lors de sa mise au point, un programme écrit en langage java est d’abord compilé en un « bytecode » java. Lors de son exécution sur une machine, un programme « bytecode » java est interprété par l’interpréteur java de la machine. Dans ce sens, on dit que java est semi-interprété (l’interpréteur java n’interprète pas du langage java mais du bytecode). On peut dire aussi qu’il est semi-compilé au sens où le compilateur java transforme le source java en un programme écrit en bytecode et non pas en code machine.

………

Cours gratuitTélécharger le cours complet

Télécharger aussi :

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *