Programmation - A. Cohen
Cours

Programmation orientée objet - Terminologie

Programmation procédurale vs POO

Le schéma suivant montre la différence entre une approche procédurale et une approche orientée objet.

En programmation orienté objet, on associe aux objets des actions (appelées méthodes).

Par exemple, à l'objet livre on va associer les actions retour du livre, prêt du livre, etc.

Illustration de la PP vs POO
Illustration de la PP vs POO

Les avantages d'une telle approche sont :

  • On peut utiliser des objets sans savoir comment ils sont programmés.

  • On peut aussi modifier les instructions qui décrivent les actions sur les objets sans modifier le programme qui les utilise.

  • Les objets sont ainsi facilement réutilisables dans d'autres programmes.

Nous allons préciser les terminologies suivantes : classe, objet, méthode, etc.

Retenez déjà que :

  • La définition d'un objet et de ses méthodes est appelée une classe

  • A partir d'une classe, on peut définir plusieurs objets. Chaque objet s'appelle une instance de la classe.

Exemple introductif 

Java est avant tout un langage de programmation orientée objet.

Pour mieux cerner les différents concepts de la programmation objet en Java, regardons l'exemple d'un gestionnaire d'emploi du temps.

Exemple : Gestionnaire d'emploi du temps

Considérons les deux cadres suivants :

Ces deux cadres sont semblables : l'élément cours programmation de Atika Cohen n'est pas différent de l'élément correspondant au cours de Joël Goossens si ce n'est l'indication de la salle, du jour et du créneau horaire!

Définition :

On appellera classe, un modèle pour plusieurs objets semblables, partageant des caractéristiques communes.

Dans notre exemple, nous pouvons avoir la classe des cours "COURS", représentée graphiquement par le schéma suivant.

La classe cours décrit des éléments qui possèdent les caractéristiques suivantes :

  • un nom de cours

  • un nom d'enseignant

  • une salle de cours

  • un public

  • jour de la semaine

  • un créneau horaire

Une instance de la classe COURS n'est autre qu'un objet issu de cette classe.

La classe est une notion abstraite, tandis que l'objet est la concrétisation de la classe.

Dans notre exemple on a deux objets instances de la classe COURS : un cours le lundi de 14h à 17h et un cours le mardi de 8h à 11h.

On appelle variable, un élément (ou une information) associé à un objet ou bien à une famille d'objets. Par exemple, dans notre classe COURS, chaque caractéristique (créneau horaire, salle, nom d'enseignement, ...) est une variable.

Enfin, nous appellerons méthode, la description d'une action ou d'un comportement qui permet de modifier une ou plusieurs valeurs associées aux variables d'un objet d'une classe donnée.

La méthode est définie au niveau de la classe et pourra s'appliquer sur toutes les instances d'une classe.

Dans notre exemple du gestionnaire d'emploi du temps, nous pourrions définir la méthode déplacer, qui nous permettra de changer le créneau horaire d'un cours dans le planning. Cette méthode sera appliquée sur une instance de la classe COURS.

Notion d'objet

Fondamental : Quelques concepts clés

Un objet est caractérisé par :

  • un ensemble d'attributs (ou de champs), ces attributs portent des valeurs attachées à l'objet et caractérisent l'état de l'objet

  • un ensemble de méthodes (ou d'opérations), ces méthodes définissent le comportement de l'objet. Il s'agit d'opérations que l'on peut appliquer à l'objet.

  • une identité qui permet de le distinguer des autres objets

L'objet est connu du monde extérieur à travers une description (= interface)

Attention :

Un objet ne doit jamais manipuler les données internes d'un autre objet.

Cela permet de préserver l'intégrité des services.

Toute communication se fait par l'intermédiaire d'appels de méthodes.

On utilisera ce qu'on appelle l'encapsulation pour accéder aux valeurs des champs.

Exemple : Un bouton dans une interface

Un bouton dans une interface graphique est caractérisé par :

  • Attributs = image, label, couleur de fond, police de caractères, ...

  • Méthodes = se dessiner, réagir à un clic, ...

Notion de classe

Introduction

Java est un langage de programmation orienté objet, c'est-à-dire que les programmes écrits à l'aide de ce langage sont structurés en classes.

Tout programme écrit en Java se fonde sur l'utilisation de classes.

On peut avoir un fichier source par classe ou alors définir plusieurs classes dans le même fichier source.

Rappel

public class Hellobis { public static void main (String[] argv)

{

System.out.println("Bonjour à tous");

}

}

Pour des programmes plus complets, on sera amené à la fois à utiliser des classes prédéfinies mais aussi à définir ses propres classes.

Pour cela, il faut définir la structure et le comportement communs à un ensemble d'objets.

Une classe est donc constituée d'un ensemble d'attributs et d'un ensemble de méthodes (et aussi de classes internes).

Une classe a une organisation unique, elle décrit :

  • la partie privée (données, méthodes, les classes imbriquées éventuellement)

  • la partie publique - interface (noms et paramètres des méthodes).

Chaque méthode est définie par sa signature Les méthodes sont définies par leur signature. La signature comporte le son nom de la méthode, le type de ce qu'elle retourne et la nature de ses arguments. C'est ce qu'on appelle parfois aussi son entête.

Un programme construit en général des instances de classe. Une instance de classe est appelé objet.

Ainsi, par instanciation, on fabrique des objets conformes au schéma de la classe.

Tous les objets d'une même classe ont la même structure

Exemples

Exemple : Définition de la classe Client
Exemple : Objet Instance de la classe Client
Exemple : Définition de la classe Livre

Notion de paquetage

Un programme orienté objet est l'association de quelques classes à plusieurs centaines de classes.

Java est livré avec un grand ensemble de classes. L'ensemble des packages livrés par Java forme ce qu'on appelle l'API (Application Programming Interface). On les regroupe en packages nommés java.*.

Utiliser la documentation du JDK est indispensable pour connaître le contenu de ces classes.

Exemple : Exemple de packages
  • Le package java.lang est chargé automatiquement, ses classes sont donc toujours utilisables. On y trouve, entre autres :

    la classe Object dont dérivent toutes les autres classes

    les classes représentant les types numériques de bases : Boolean, Byte, Double, Float, Integer, Long

    la classe Math qui fournit des méthodes de calcul des fonctions usuelles en mathématiques

    les classes Character, String et StringBuffer pour la gestion des caractères et des chaînes de caractères

    la classe System que nous utilisons pour afficher du texte sur la console DOS.

  • Le paquetage java.util définit un certain nombre de classes utiles et est un complément de java.lang.

  • Le paquetage java.awt (awt = Abstract Window Toolkit) contient des classes pour fabriquer des interfaces graphiques.

  • Le paquetage java.applet est utile pour faire des applets.

  • Le paquetage java.io contient les classes nécessaires aux entrées-sorties.

Mis à part le package java.lang, tous les autres packages doivent être déclarés (mot clé import) pour pouvoir être utilisés.

L'utilisation d'une classe d'un package spécifique (par exemple java.applet) nécessite d'importer le package entier dans votre programme ou alors de préciser juste la classe à importer.

Ceci se fait en insérant tout au début du programme et avant la définition de la classe ; l'instruction

import suivi du nom du paquetage à importer

l'instruction import peut donc avoir deux formes :

  • import nomDePackage.nomDeClasse ;

    la classe nomDeClasse peut ensuite être désignée par son simple nom,

  • import nomDePackage.*  ;

    toutes les classes du package nomDePackage peuvent ensuite être désignée par leur simple nom.

    L'instruction import java.lang.*; est implicite dans tout programme JAVA, elle rend directement accessible les classes de base JAVA.

    Si deux packages importés contiennent des classes de nom identique, il est nécessaire d'utiliser un nom complet pour désigner chacune de ces deux classes

import java.applet.*;

import java.awt.*;

si on souhaite juste une classe

import java.awt.Graphics;

import java.util.Date ;

Programme avec deux classes

L'exemple suivant est un programme qui comporte deux classes.

Pour que le programme puisse être exécuté, une des deux classes doit contenir une méthode main.

Dans notre exemple cette classe s'appelle DeuxClasses et utilise une autre classe qui s'appelle Ecriture.

Après compilation, ce sont les instructions de la méthode main qui seront exécutées.

Pour utiliser la classe Ecriture, il faut instancier celle-ci à l'aide de l'opérateur "new".

écrivain = new Ecriture();

Cette instruction crée un objet de la classe Ecriture et alloue en mémoire de l'espace pour chacun des attributs de la classe.

L'instruction new Ecriture() ; renvoie la référence de l'objet créé, référence qui est mise dans l'objet écrivain.

Exemple : Programme utilisant deux classes

class Ecriture

{

String chaine ="Bonne ann\u201ae ";

void ecrire(String autreChaine)

{

System.out.print(chaine);

System.out.println(autreChaine);

}

}

class DeuxClasses

{

public static void main(String tab[])

{

Ecriture écrivain;

écrivain = new Ecriture();

écrivain.ecrire("et meilleurs voeux");

écrivain.chaine ="et pour finir ";

écrivain.ecrire("au revoir");

}

}

/*A l'execution, on obtient :

Bonne année et meilleurs voeux

et pour finir au revoir

*/

Question : quel nom devra porter le fichier comportant ce programme ?

Remarque :

Cet exemple est extrait du site Web

http://www.infres.enst.fr/~charon/coursJava/index.html

Notion d'encapsulation

Chaque classe est responsable de l'intégrité de ses données.

C'est pourquoi ce sont les méthodes qui permettent :

  • d'accéder aux données

  • de modifier ces données

Objectif : masquer l'implémentation des données aux utilisateurs de l'objet.

  • Un objet ne doit jamais manipuler directement les données internes d'un autre objet,

  • Un objet ne doit pas rendre accessibles directement les données aux autres objets

Ainsi, l'accès aux données ne peut se faire qu'au travers des méthodes de l'objet suivant le principe de l'encapsulation.

Les programmes doivent interagir avec les données d'un objet uniquement par l'intermédiaire des méthodes de l'objet.

L'encapsulation est le moyen pour donner à l'objet son comportement de "boîte noire". C'est sur elle que reposent

  • la réutilisation

  • et la sécurité de l'objet

Exemple :

Dans l'exemple suivant, la méthode getBourse a pour rôle de retourner le contenu de l'attribut bourse

public double getBourse()

{

return bourse;

}

Remarque :

L'ensemble des opérations publiques constitue ce qu'on appelle une interface.

Tant que ces interfaces ne changent pas :

  • les autres classes qui utilisent cette classe ne sont pas concernées par les modifications internes de la classe et de ses opérations,

  • une classe peut donc complètement modifier la manière dont elle stocke ses données.

Analyse d'un programme - Notions de blocs et portée de variables

Analyse d'un programme

Analyse du programme
Analyse du programme
Explication
  • Le mot-clé class introduit le nom de la classe (si la compilation se passe bien, la classe sera connue sous le nom HelloWorld.class)

  • La 1ère accolade marque le début du corps de la classe,

  • la dernière (sans point-virgule) sa fin

    La 2ème paire d'accolades marque le début et la fin de la méthode main

  • La méthode main donne le point d'entrée du programme.

La méthode main est dans ce cas :

  • public : accessible par tout le monde (elle fait partie de l'interface de la classe)

  • static : toutes les instances de la classe HelloWorld se partageront cette méthode main

  • void indique qu'il n'y a pas de type de retour

  • arguments de main : se présentent sous la forme d'un tableau args[ ] de type String

System est une classe qui permet d'interagir avec le "run-time system" à travers un ensemble de variables et de méthodes toutes de type static

En appelant la méthode println() sur System.out on affiche la chaîne de caractères "Hello World!" avec un retour à la ligne.

(si on ne veut pas de retour à la ligne, on utilisera print au lien de println)

Blocs et portée des variables

Les programmes sont très structurés et sont organisés en blocs :

  • commençant par {

  • et se terminant par }

Par exemple, tout ce qui est contenu dans la méthode main() est un seul et même bloc (souvent subdivisé en d'autres petits blocs)

Une variable classique a une portée dans le bloc qui la contient.

Si vous faites référence, dans un bloc, à une variable déclarée dans un autre bloc, le compilateur générera une erreur.

Visibilité des variables
  • Si dans un bloc on crée une variable de même nom qu'une variable d'un bloc supérieur, cette nouvelle variable masque la variable supérieure à l'intérieur de ce bloc

Variables de classe et variables d'instance

Une variable de classe (static) est une variable qui n'est créée qu'une seule fois par classe, et qui est partagée par toutes les instances de cette classe.

On les déclare à l'aide du mot clé static

Une variable d'instance est une variable qui existe pour chaque instance d'une classe, et qui contient une valeur relative à l'instance à laquelle elle appartient.

Exemple : Variables static

static int nombreDeBilles = 200 ;

static String surnom = "bob" ;

Cela peut être utile pour

  • les constantes d'une classe

  • les variables qui contiennent une information relative à l'ensemble des instances d'une classe (compteur d'instances,...)

Remarque :

Une méthode qui ne manipule aucune variable d'instance (par exemple, une méthode qui effectue un calcul uniquement à partir de ses paramètres) a vocation à être déclarée static.

Java et les objets (page suivante)Programmation orientée objet (page Précédente)
AccueilImprimerRéalisé avec SCENARI