Java
Votre Publicité sur le Réseau |
Introduction: Le langage JAVA
Présentation
Java est une technologie composée d’un langage de programmation orient objet et d’un environnement d’exécution. Préalablement nomme Oak, il a été créé par James Gosling et Patrick Naughton chez Sun Microsystems avec le soutien de Bill Joy. Le langage Java fut officiellement présent le 23 mai 1995 au SunWorld. Java est à la fois un langage de programmation et une plateforme d’exécution. Le langage Java a la particularité principale d’être portable sur plusieurs systèmes d’exploitation tels que Windows, MacOS ou Linux. C’est la plateforme qui garantit la portabilité des applications développées en Java.
Java et la programmation orientée objet
La programmation orientée-objet (introduite par le langage SmallTalk) propose une méthodologie centrée sur les données. Le programmeur Java va d’abord identifier un ensemble d’objets, tel que chaque objet représente un élément qui doit être utilisé ou manipulé par le programme, sous la forme d’ensembles de données. Ce n’est que dans un deuxième temps, que le programmeur va écrire les traitements, en associant chaque traitement à un objet donné. Un objet peut être vu comme une entité regroupant un ensemble de données et de méthodes de traitement.
Classe
C’est une description d’un ensemble d’objets ayant les mêmes ATTRIBUTS et les mêmes METHODES. Exemples: la classe ARTICLE, la classe POINT
Encapsulation
Lors de la conception d’un programme orienté objet, le programmeur doit identifier les objets et les données appartenant à chaque objet mais aussi des droits d’accès qu’ont les autres objets sur ces données. L’encapsulation de données dans un objet permet de cacher ou non leur existence aux autres objets du programme. Une donnée peut être déclarée en accès :
✓ public: propriétés visibles et accessibles à l’extérieur de la classe.
✓ private: propriétés visibles et accessibles uniquement à l’intérieur de la classe.
✓ protected: propriétés visibles et accessibles à l’intérieur de la classe, dans les sous-classes et dans les classes du même package.
✓ Par défaut: propriétés visibles et accessibles à l’intérieur de la classe et dans les classes du même package.
Constructeur
Chaque classe doit définir une ou plusieurs méthodes particulières appelées des constructeurs. Un constructeur est une méthode invoquée lors de la création d’un objet. Cette méthode, qui peut être vide, effectué les opérations nécessaires à l’initialisation d’un objet. Chaque constructeur doit avoir le même nom que la classe où il est défini et n’a aucune valeur de retour (c’est l’objet créé qui est renvoyé).
Objet
Dans un modèle orienté objet, toute entité du monde réel est un objet. Un objet est caractérisé par : Un état : Données stockées dans des champs appelés ATTRIBUTS. Un Comportement : Opérations implémentées à l’aide de fonctions ou procédures appelées METHODES. Exemples: ARTICLE (Article en stock), POINT (point dans un plan)
Syntaxe du langage
Types de données
Types simples
Les types de donnée de base en Java sont :
boolean : un booléen (d'ordre 2 en réalité) qui ne pourra prendre que les valeurs true ou false.
✓ byte : un entier relatif très court (entre -128 et 127).
✓ short : un entier relatif court (entre -32 768 et 32 767).
✓ int : un entier relatif (entre -2 147 483 648 et 2 147 483 647).
✓ long : un entier relatif long (entre -9 223 372 036 854 775 808 et 9 223 372 036 854 775 807).
✓ float : un nombre décimal.
✓ double : un nombre décimal à double précision.
✓ char : un caractère.
✓ String : une chaine de caractère.
Exemple :
int a=4;
float b=5.2;
String ch='Bonjour';
Tableaux et matrices
Un tableau a toujours une taille fixe qui doit être précisée avant l’affectation de valeurs à ses indices, de la manière suivante :
Exemple : pour déclarer un tableau de 20 entiers
int[] mon_tableau = new int[20];
Les opérateurs
Structures de contrôle
Structures conditionnelles
Syntaxe :
if (<condition>) <bloc1> [else <bloc2>]
ou
<condition>?<instruction1>:<instruction2>
<condition> doit renvoyer une valeur booléenne. Si celle-ci est vraie c’est <bloc1> (resp. <instruction1>) qui est exécuté sinon <bloc2> (resp. <instruction2>) est exécuté. La partie else <bloc2>est facultative.
Exemple :
if (a == b)
{ a = 50; b = 0;}
else{a = a - 1;}
Structures itératives
Structure itérative complète
Syntaxe :
for (<init>;<condition>;<instr_post_itération>) <bloc>
Exemple:
int s=0;
for (int i = 0, i<20;i++)
{ s=s+i;}
Structure itérative à condition d'arrêt
TantQue...Faire...
Syntaxe :
while (<condition>) <bloc>
Exemple:
while (a != b) a++;
Faire...TantQue...
Syntaxe :
do <bloc> while (<condition>);
Exemple:
do a++ while (a != b);
Héritage
L’idée principale de l’héritage est d’organiser les classes de manière hiérarchique. La relation d’héritage est unidirectionnelle et, si une classe B hérite d’une classe A, on dira que B est une sous classe de A. Cette notion de sous-classe signifie que la classe B est un cas particulier de la classe A et donc que les objets instanciant la classe B instancient également la classe A.
Prenons comme exemple des classes Carre, Rectangle et Cercle. La figure ci-dessous propose une organisation hiérarchique de ces classes telle que Carre hérite de Rectangle qui hérite, ainsi que Cercle, d’une classe Forme.
Syntaxe:
L’héritage est mis en œuvre à l’aide du mot clé extends:
class NomSousClasse extends NomSuperClasse
Redéfinition
L’héritage intégral des attributs de la classe Rectangle pose deux problèmes : Il faut que chaque carré ait une longueur et une largeur égales ; . La méthode affiche écrit le mot “rectangle” en début de chaîne. Il serait souhaitable que ce soit “carré” qui s’affiche. De plus, les constructeurs ne sont pas hérités par une sous classe. Il faut donc écrire un constructeur spécifique pour Carre. Ceci nous permettra de résoudre le premier problème en écrivant un constructeur qui ne prend qu’un paramètre qui sera affecté à la longueur et à la largeur. Pour attribuer une valeur à ces variables (qui sont privées), le constructeur de Carre doit faire appel au constructeur de Rectangle en utilisant le mot-clé super qui fait appel au constructeur de la classe supérieure comme suit :
public Carre(int cote) { super(cote,cote); }
Polymorphisme
Le polymorphisme est la capacité d’une même opération à pouvoir s’appliquer sur des objets différents d’une même hiérarchie de classes et à pouvoir déclencher des traitements différents, selon la nature de l’objet en question.
❖On dit alors que cette opération est polymorphe.
❖La gestion du polymorphisme est assurée par la machine virtuelle de façon dynamique lors de l’exécution du programme;
Classe abstraite
Soit la classe Forme représentant les formes géométriques. Chaque catégorie de forme géométrique (Carré, Cercle, Rectangle, Triangle, …) peut être représentée par une sous classe de cette classe mère. Toutes ces formes possèdent une surface calculable, donc une méthode Surface () est commune à toutes les sous-classes, sauf que chacune de ces formes possède une manière spécifique pour calculer sa surface. D’où, l’action Surface () n’a pas vraiment de sens au niveau de la classe mère : c’est une notion abstraite qui sera précisée concrètement au niveau de chaque sous-classe.
❖Méthode Abstraite: une méthode déclarée à l’aide du mot clé abstract à l’intérieur d’une super-classe:
➢ n’a pas d’implémentation (juste une entête de méthode)
➢ n’est pas exécutable
➢ Doit être redéfinie dans les classes filles.
❖Classe Abstraite: une classe contenant au moins une méthode abstraite.
➢ Ne peut pas être instanciée.
➢ seules les sous-classes qui redéfinissent toutes les méthodes abstraites de leur classe mère sont instanciables.
Une classe abstraite ne peut pas être instanciée directement : seule une sous-classe qui redéfinit obligatoirement toutes les méthodes abstraites de la classe mère peut être instanciée.
Une sous-classe qui redéfinit toutes les méthodes abstraites de la super-classe, sauf une (ou quelques unes), ne pourra pas non plus être instanciée et subit la même règle que sa super-classe : elle contient au moins une méthode abstraite → elle-même sera une classe abstraite à déclarer avec le mot clé abstract.
Gestion des entrées/sorties simples
Flux d’entrée
Un flux d’entrée est une instance d’une sous-classe de InputStream. Chaque classe de flux d’entrée a son propre mode d’échange de données qui spécifie un format particulier de données ou un accès particulier. Les classes les plus couramment utilisées sont :
●ByteArrayInputStream : permet de lire le flux d’entrée sous la forme d’octets(byte).
●DataInputStream : permet de lire le flux d’entrée sous la forme de types de données primitifs de Java. Il existe des méthodes pour récupérer un entier, un réel, un caractère,…
● FileInputStream : est utilisé pour lire le contenu d’un fichier. Les objets de cette classe sont souvent encapsulés dans un autre objet de classe InputStream qui définit le format des données à lire.
● ObjectInputStream : permet de lire des objets (c-à-d des instances de classes Java)à partir du flux d’entrée, si ces objets implémentent les interfaces java.io.Serializable ou java.io.Externalizable.
● Reader : n’est pas une sous-classe de InputStream mais représente un flux d’entrée pour chaînes de caractères. Plusieurs sous-classes de Reader permettent la création de flux pour chaînes de caractères.
● Scanner : n’est pas une sous-classe de InputStream, mais un Iterator qui permet de lire un flux (fichier ou chaîne de caractères par exemple) “mot” par “mot” en définissant le délimiteur entre les mots.
Lecture des entrées clavier
Les données provenant de l’utilisation du clavier sont transmises dans un flux d’entrée créé automatiquement pour toute application Java. On accède à ce flux par la variable statique de la classejava.lang.System qui s’appelle in. Ce flux est alors utilisé comme paramètre d’entrée du constructeur d’un autre flux d’entrée. Pour cet autre flux, on utilise généralement une sous-classe de Reader pour récupérer les entrées de l’utilisateur sous la forme d’une chaîne de caractères.
Lecture à partir d’un fichier
Un fichier est représenté par un objet de la classe java.io.File. Le constructeur de cette classe prend en paramètre d’entrée le chemin d’accès du fichier. Le flux d’entrée est alors créé à l’aide de la classe FileInputStream sur lequel on peut lire caractère par caractère grâce à la méthode read().
Lecture d’objets enregistrés
Il est parfois utile d’enregistrer l’état d’objet (de n’importe quelle classe implémentant les interfaces java.io.Serializableoujava.io.Externalizable) pour des exécutions futures. Le flux d’entrée est encore créé à l’aide de la classe FileInputStream et est ensuite encapsulé dans un autre flux spécifiant le format des données à lire.
Flux de sortie
Écriture sur la sortie standard “écran”
Comme pour les entrées du clavier, l’écriture vers l’écran fait appel à la variable statiqueout de la classe System. On appelle généralement la méthode System.out.print ou System.out.println.
Écriture dans un fichier
L’écriture dans un fichier se fait par un flux de la classe FileOutputStream qui prend en entrée un fichier (instance de la classe File). Ce flux de sortie permet d’écrire des caractères dans le fichier grâce à la méthode write().
Écriture d’objets
Le flux de sortie peut également être encapsulé dans un flux de type ObjectOutputStream.
Définition graphique
Concepts ou notions associés
Java - Glossaire / (+)
Exemples, applications, utilisations
Sun fournit un grand nombre de frameworks et d’API afin de permettre l’utilisation de Java pour des usages très diversifiés. On distingue essentiellement quatre grands frameworks : Java SE (anciennement J2SE) : Ce framework est destiné aux applications pour poste de travail ; Java EE (anciennement J2EE) : Ce framework est spécialisé dans les applications serveurs. Il contient pour ce faire un grand nombre d’API et d’extensions ; Java ME (anciennement J2ME) : Ce framework est spécialisé dans les applications mobiles ; JavaFX (à ne pas confondre avec JavaFX) : Ce framework est spécialisé dans les applications liées aux cartes à puces et autres SmartCards.
................................................................................ ................................................................................ ................................................................................ |
Erreurs ou confusions éventuelles
- Confusion entre Objet et Classe
- Confusion entre JavaScript et Java
- Confusion entre polymorphisme et héritage Polymorphisme et Héritage
Questions possibles
Liaisons enseignements et programmes
Idées ou Réflexions liées à son enseignement
- Utiliser le même exemple durant tous le cours:
- Il est préférable d'utiliser un exemple simple pour expliquer les différents parties du cours( l'exemple du point est le plus simple)
Aides et astuces
- Pour introduire la notion du boucle :
- on peut demander au élèves qui ont un niveau cognitif faible d'utiliser Scratch
- Utilisation de Netbeans :
- Installation du JDK.
Education: Autres liens, sites ou portails
Bibliographie
Pour citer cette page: ([1])
ABROUGUI, M & al, 2020. Java. In Didaquest [en ligne]. <http:www.didaquest.org/wiki/Java>, consulté le 25, novembre, 2024