61
[email protected] Introduction au Langage Java LA PROGRAMMATION ORIENTÉE OBJET

La programmation orientée objet

  • Upload
    others

  • View
    15

  • Download
    0

Embed Size (px)

Citation preview

Page 1: La programmation orientée objet

[email protected]

Introduction au Langage Java

LA PROGRAMMATION

ORIENTÉE OBJET

Page 2: La programmation orientée objet

[email protected]

Historique • 1990 :

Internet peu connu, Web inexistant, Projet Oak de SUN Microsystems Langage pour la communication des appareils électroniques de poche et domotique

• 1993 :

Le NCSA (National Center for Supercomputing Applications) lance MOSAIC premier navigateur internet (protocole http, langage html)

Oak s’adapte à la technologie internet

• 1995 : Annonce officielle de la naissance de la technologie Java (issue de Oak)

Page 3: La programmation orientée objet

[email protected]

Technologie Java - 1

• Langage de programmation orienté objet

• Machine virtuelle (JVM) Java Virtual Machine

• Bibliothèques de classes standards

(API) Application Programming Interface

(> 2500 classes dans java 1.4)

http://java.sun.com/j2se/1.4.2/docs/api/

• Ensemble d’outils (java, javac, javadoc, jar…)

Page 4: La programmation orientée objet

[email protected]

Technologie Java - 2

interpréteur

Programme

Données

compilateur Fichier

exécutable Programme

Données

(Rappels)

Page 5: La programmation orientée objet

[email protected]

Technologie Java - 3

compilateur

Fichier

« class »

Programme

« java »

Données

« interpréteur »

Machine Virtuelle Java Hello.java

Hello.class

byte-code

Page 6: La programmation orientée objet

[email protected]

La machine virtuelle

Réseau

ou

système

de fichiers

Class loader

Byte-code verifier Interpreter

Security manager Classes

locales

JVM

Page 7: La programmation orientée objet

[email protected]

Approche orientée objet

• Logiciel = Collection d'objets dissociés définis

par des propriétés

Propriétés :

- Attributs

description de l'état de l'objet

- Méthodes

description du comportement de l'objet

Page 8: La programmation orientée objet

[email protected]

Qu’est-ce qu’un objet ?

• Objet = concept, abstraction, entité …

sémantique propre au contexte

Exemple :

Deux éléphants ont le même âge, la même

taille, le même poids !!!

Mais sont 2 objets distincts

Page 9: La programmation orientée objet

[email protected]

Qu’est-ce qu’une classe ?

• Une classe regroupe des définitions

d’attributs et de méthodes : c’est une

catégorie particulière d'objets.

• Un objet est une instance de sa catégorie

de référence.

Exemple : la classe Personne a comme

instances eric, maina, ... et ali qui sont

des objets distincts.

Page 10: La programmation orientée objet

[email protected]

Qu’est-ce qu’une méthode ?

• Une méthode est une fonction ou une

procédure attachée à une classe.

• Une méthode peut agir sur tous les objets de

la classe sans distinction (STATIC)

méthode de classe

• ou bien n'agir que sur un objet bien particulier

(non STATIC) méthode d’objet

Page 11: La programmation orientée objet

[email protected]

Exemple

ATTRIBUTS

(les variables)

METHODES

(les fonctions)

Portion invisible de

l'extérieur

private

Portion visible de

tous les autres

public

Page 12: La programmation orientée objet

[email protected]

Exécution : Échanges de messages entre objets

• Les objets interagissent en s'envoyant des messages

• Un message est formé : 1 - d'un objet destinataire du message 2 - du nom d'une méthode, point d'entrée sur l'objet destinataire 3 - d'arguments à associer aux paramètres de la méthode appelée

nom_objet.nom_méthode(arg1, arg2, …);

Page 13: La programmation orientée objet

[email protected]

Exemple

int x

float y

char c

… // Les attributs

m1() m2()

m3()

m4()

m5() m6()

m7()

int x

float y

char c

… // Les attributs

m1() m2()

m3()

m4()

m5() m6()

m7()

messages

Objet2 Objet1

méthodes méthodes

Page 14: La programmation orientée objet

[email protected]

Création d’objets : Constructeurs

• Constructeur(s) d'objet : méthode(s)

particulière(s) ayant le même nom que la classe : Appel d’un constructeur : on peut voir cela comme un message

envoyé au gestionnaire de tous les objets existants.

• Un objet peut avoir à créer un autre objet :

Nom_classe var_objet ; //référence

var_objet = new Nom_classe(arguments… );

Page 15: La programmation orientée objet

[email protected]

Premier objet ...

public class Essai1 {

public static void main( String [] args ) {

System.out.println("Bonjour") ;

}

}

Point d’entrée

Page 16: La programmation orientée objet

[email protected]

Premier objet ...

import javax.swing.*; // librairie graphique

public class Essai1 {

public static void main( String [] args ) {

JFrame f1 = new JFrame("Premiers objets...(1)");

JFrame f2 = new JFrame("Premiers objets...(2)");

f1.setSize(300, 300);

f2.setSize(300, 300);

f1.setVisible(true); // pareil que f1.show();

f2.setVisible(true);

}

}

Point d’entrée

f1.show();

Méthode déconseillée (depricated) :

C’est une méthodes qu’il ne faut pas utiliser

Il existe un autre moyen pour faire la même chose

Page 17: La programmation orientée objet

[email protected]

Premier test ...

Compilation : javac Essai1.java

Exécution : java Essai1

Page 18: La programmation orientée objet

[email protected]

Héritage de classe • Il est possible (et souhaitable) de réutiliser une

classe existante pour créer une sous-classe plus spécifique

• La sous-classe :

– dispose des mêmes attributs et méthodes que la classe parente dont elle hérite

– peut avoir des attributs et méthodes supplémentaires, spécifiques

– peut aussi redéfinir des éléments hérités, afin d'adapter une fonctionnalité générale à ses spécificités

Page 19: La programmation orientée objet

[email protected]

Visibilité

des attributs et des méthodes

Page 20: La programmation orientée objet

[email protected]

Premiers objets hérités

import javax.swing.*;

public class MesFenetres extends JFrame {

public static int nbre=1;

public MesFenetres() {

System.out.println("Premiers objets... "+nbre);

nbre++;

setSize(300,300);

setBackground(new Color(0,255,0));

setVisible(true) ;

}

}

Page 21: La programmation orientée objet

[email protected]

Premiers objets hérités

// Test

public class Essai2 {

public static void main( String args[ ] ) {

MesFenetres f1 = new MesFenetres();

MesFenetres f2 = new MesFenetres();

}

}

Page 22: La programmation orientée objet

[email protected]

Pourquoi faire

de la programmation objet ?

• Pour certaines applications, la programmation

structurée devient trop compliquée et trop

« linéaire »

• On déroule des sous-programmes dans un ordre

pré-établi a priori

Exemple : une application graphique multifenêtres

Page 23: La programmation orientée objet

[email protected]

Application multifenêtres

• Cahier des charges : – Fenêtres dont la taille et la position sont fixées lors de

leur création

– Un curseur mobile : une petite croix

– Commandes reliées à l'utilisation d'un périphérique (clavier, souris, ...) :

• Déplacer curseur (4 directions)

• Créer fenêtre (deux coins opposés fixés successivement avec le curseur)

• « PopUp » de fenêtres

Page 24: La programmation orientée objet

[email protected]

Multifenêtres

(programmation structurée)

struct fenetre { int xsg, ysg; //coin supérieur gauche

int xid, yid; //coin inférieur droit

struct bitmap zone; //zone recouverte

};

struct listf { struct fenetre F;

struct listf *suivante ; }; //liste de fenêtres

struct pile_file_f { struct listf *debut, *fin; };

//pile ou file des fenêtres selon opération

struct curseur { int cx,cy ; }; //position courante

Page 25: La programmation orientée objet

[email protected]

Multifenêtres

(programmation structurée)

• Déplacer le curseur : modification des valeurs cx et/ou cy

• Création de fenêtre :

- créer une structure fenêtre supplémentaire

- y placer les valeurs de xsg, ysg, xid, yid et la zone d'écran recouverte - empiler la nouvelle structure fenêtre ( premier plan : sommet de pile_file_f ) - afficher la nouvelle fenêtre

Page 26: La programmation orientée objet

[email protected]

Multifenêtres

(programmation structurée)

struct pile_file_f PFF; //global, fenêtres actives

PopUP : {

Trouvée=FAUX;

liste = PFF->debut;

répéter {

si (contient_position(liste->F,cx,cy) alors Trouvée=VRAI;

sinon liste = liste->suivante; }

jusqu'à (Trouvée OU vide(liste));

si (Trouvée) alors { //fenêtre sous curseur

si (liste == PFF->debut) alors {

si (PFF->debut != PFF->fin) alors {

enfiler(liste,PFF); // dernier plan

dépiler(PFF); } }

sinon {

empiler(liste,PFF); // premier plan

enlever (liste, second(PFF)); // ôter du second plan }

}

Page 27: La programmation orientée objet

[email protected]

Ouf c’est codé ! Un test ?

ça marche !!!

Page 28: La programmation orientée objet

[email protected]

Un test ?

Popup ! ( il faut gérer les zones couvertes )

Page 29: La programmation orientée objet

[email protected]

Des solutions ?

• La fenêtre déplacée doit communiquer sa

« zone couverte » à toutes les fenêtres qui se

trouve devant elle

– Comme si la fenêtre déplacée avait disparu

• On re-dispose tout à l’écran en partant d’un

fond uni et en replaçant les fenêtres dans

l’ordre, de l’arrière-plan à l’avant-plan

Page 30: La programmation orientée objet

[email protected]

Problèmes

de la programmation structurée

• Une légère modification des spécifications oblige

à reprendre l'ensemble du logiciel et à re-vérifier

que tout fonctionne

• Quelques exemples d’améliorations :

- pouvoir détruire une fenêtre

- déplacer une fenêtre

- mettre une fenêtre sous forme d'icône

C'est encore plus gênant quand ce n'est pas la

même personne qui fait des modifications !

Page 31: La programmation orientée objet

[email protected]

Les interfaces • C’est un modèle d'implémentation

public interface I_GestionDuSon {

public void reglerVolume( int valeur ) ;

public int volume() ;

}

(Toutes les interfaces portent implicitement le modificateur abstract)

• implements permet d'indiquer que la classe fournit une implémentation pour une ou plusieurs interfaces

public class Magnetophone implements I_GestionDuSon {

public void reglerVolume( int valeur ) {

… // description du comportement

}

}

Page 32: La programmation orientée objet

[email protected]

Les interfaces

• Lorsque des objets fonctionnent bien et ont été testés d’autres programmeurs peuvent les utiliser :

1 - Appels des méthodes de ces objets 2 - Héritage à partir d’objets existants 3 - Raccordement d’un objet créé par l’utilisateur à un objet existant par des interfaces

Exemple : la gestion d’événements.

Page 33: La programmation orientée objet

[email protected]

Gestionnaire d’événements - 1

import java.awt.*;

import java.awt.event.*;

public class Controleur implements WindowListener {

public void windowOpened (WindowEvent e)

{ System.out.println(e.toString()); }

public void windowClosing (WindowEvent e)

{ System.out.println(e.toString()); }

public void windowClosed (WindowEvent e)

{ System.out.println(e.toString()); }

public void windowIconified (WindowEvent e)

{ System.out.println(e.toString()); }

public void windowDeiconified (WindowEvent e)

{ System.out.println(e.toString()); }

public void windowActivated (WindowEvent e)

{ System.out.println(e.toString()); }

public void windowDeactivated (WindowEvent e)

{ System.out.println(e.toString()); }

}

Page 34: La programmation orientée objet

[email protected]

Gestionnaire d’événements - 2

public class MesFenetres extends JFrame {

public static int nbre=1;

public MesFenetres(Controleur c) {

System.out.println("Premiers objets... "+nbre);

nbre++;

addWindowListener(c);

setSize(300,300);

setBackground(new Color(0,255,0));

setVisible(true);

}

}

Page 35: La programmation orientée objet

[email protected]

Gestionnaire d’événements - 3

public class Essai3 {

public static void main( String [] args) {

Controleur co = new Controleur();

MesFenetres f1 = new MesFenetres(co);

MesFenetres f2 = new MesFenetres(co);

}

}

Page 36: La programmation orientée objet

[email protected]

Auto-référence - 1

• Le mot clé this permet :

– de faire référence à l’objet courant (celui que l’on est

en train de définir),

– ou de désigner ses attributs, ses méthodes ou

ses constructeurs :

this.nomAttribut

this.nomMethode()

this(Arguments, …) // un constructeur

Page 37: La programmation orientée objet

[email protected]

Auto-référence - 2

• Le mot clé super permet :

– de faire référence à l’objet de la super-classe dont

hérite l’objet courant,

– ou de désigner les attributs, les méthodes ou

les constructeurs de la super-classe :

super.nomAttribut

super.nomMethode()

super(Arguments, …) // un constructeur

Page 38: La programmation orientée objet

[email protected]

Auto-référence - 3 public class MesMenetres extends JFrame implements WindowListener {

public static int nbre=1;

public MesFenetres() {

super("Premiers objets...(" + nbre + ")");

nbre++;

this.addWindowListener(this);

this.setSize(300,300);

this.setBackground(new Color(0,255,0));

this.setVisible(true);

}

public void windowOpened (WindowEvent e) { }

public void windowClosing (WindowEvent e) {

System.exit(0) ;

}

public void windowClosed (WindowEvent e) { }

public void windowIconified (WindowEvent e) { }

public void windowDeiconified (WindowEvent e) { }

public void windowActivated (WindowEvent e) { }

public void windowDeactivated (WindowEvent e) { }

}

Page 39: La programmation orientée objet

[email protected]

Auto-référence - 4

public void windowOpened (WindowEvent e) { }

public void windowClosing (WindowEvent e)

{ System.exit(0); }

public void windowClosed (WindowEvent e) { }

public void windowIconified (WindowEvent e) { }

public void windowDeiconified (WindowEvent e) { }

public void windowActivated (WindowEvent e) { }

public void windowDeactivated (WindowEvent e) { }

}

Page 40: La programmation orientée objet

[email protected]

Le polymorphisme

• Un même nom de méthode peut être utilisé pour des usages différents

C’est l’objet manipulé qui va en déterminer la fonction

Exemple : signification de + ? Addition d’entiers, de réels, "a"+"bc", bleu+vert

• Les paramètres sont des références à des objets (comme des pointeurs en C)

On peut avoir en argument des objets très différents et leur appliquer une méthode de nom identique

Page 41: La programmation orientée objet

[email protected]

Polymorphisme ad hoc

• Possibilité d'avoir des méthodes de même nom

dans des classes sans aucun rapport entre elles

public class Armoire {

public void remplir( ) {

… // traitement spécifique à l’armoire

}

}

public class Bouteille {

public void remplir( ) {

… // traitement spécifique à la bouteille

}

}

Page 42: La programmation orientée objet

[email protected]

Polymorphisme d’héritage

• Possibilité de redéfinir une méthode dans des

classes héritant d'une classe de base

public abstract class Piece {

public abstract void deplacer();

}

public class Cavalier extends Piece {

public void deplacer( ) {

… // traitement spécifique au cavalier

}

}

public class Reine extends Piece {

public void deplacer( ) {

… // traitement spécifique à la reine

}

}

Page 43: La programmation orientée objet

[email protected]

Polymorphisme paramétrique

• Possibilité de définir plusieurs fonctions de même nom mais possédant des paramètres différents (en nombre et/ou en type)

public class Voiture {

public float faire_le_plein() {

… // traitement

return(prix);

}

public void faire_le_plein( int jauge, Carburant c ) {

… // traitement

}

public void faire_le_plein( float kms, Carburant c ) {

… // traitement

}

}

Page 44: La programmation orientée objet

[email protected]

Les « packages »

Package : regroupement de classes ayant un

lien logique entre elles

– pour les utiliser dans d'autres classes

– pour les « spécialiser »

En plus d’un langage de programmation,

l’environnement Java définit une API (Application

Programmer’s Interface) comportant de nombreux

« packages »

(ou paquetage)

Page 45: La programmation orientée objet

[email protected]

API

Principaux packages - 1

java.lang : classes essentielles

objet, types de base, processus

java.util : structures de données (collections)

listes, ensembles, hashtables, arbres, itérateurs …

java.awt: interface graphique (Abstract Window Toolkit)

fenêtres, boutons, événements ...

java.io : entrées / sorties

flot de données provenant : d'un fichier, d'un buffer, d'un "pipe »

java.net : réseau

URL, sockets

Page 46: La programmation orientée objet

[email protected]

API

Principaux packages - 2

java.rmi : objets distribués (Remote Method Invocation)

java.sql : JDBC (Java Data Base Connectivity)

connexion à une base de données relationnelle

envoi de requêtes SQL, récupération des résultats

java.beans : composants logiciels

composants logiciels autonomes pouvant être contrôlés dynamiquement

et assemblées pour former des applications

modèles de composants de SUN

environnement d'exécution des JavaBeans intégré dans la plate-forme

Java

javax.swings : interface graphique

composants d’interface de plus haut niveau que ceux de awt

look and feel indépendant de l ’OS (Operating System)

exploitation du modèle MVC (Model View Controler )

Page 47: La programmation orientée objet

[email protected]

Le JDK

JDK Java Developer’s Kit : environnement

standard (Windows, Solaris ou linux) diffusé

gratuitement par Sun : http://java.sun.com

– outils de développement : compilateur,debugger, …

– "librairies" de classes standards

– documentation

Version actuelle Java 1.6

Version 1.7 (en cours ?)

Page 48: La programmation orientée objet

[email protected]

Le JDK 1.7

• Ajout de type String dans la commande switch

• Automatisation de certains accès aux ressources

– Fermeture automatique des fichiers ouverts

• Ajout de certaines initialisations aux collections

– List<String> list = ["item"];

• Les underscores (entiers et binaires) :

– int billion = 1_000_000_000;

– int binary = 0b1001_1001;

• Amélioration des performances

Page 49: La programmation orientée objet

[email protected]

LES FENÊTRES ET LES

APPLETS

Page 50: La programmation orientée objet

[email protected]

Les applets

• Hériter de la classe Applet de Java

• Définir les méthodes :

- init : réservation des ressources, initialisation

- start : première activation

- stop : arrêt dès que la page de l’applet

n’est plus vue

(reprise d’activité dès qu’on la revoit )

- destroy : libération des ressources, fin

Page 51: La programmation orientée objet

[email protected]

Les applets import java.awt.*;

import java.awt.event.*;

import java.applet.*;

public class essai6 extends Applet {

outils6 mesoutils;

TextArea messages;

public void init() {

messages=new TextArea("Hello!",2,40);

setLayout(new BorderLayout());

add("North",mesoutils=new outils6(messages));

add("Center",messages);

messages.append(" init fini! ");

}

public void destroy() {

remove(mesoutils);

remove(messages);

}

public void start() {

messages.append(" start fait! ");

}

Page 52: La programmation orientée objet

[email protected]

Les applets

public void stop() {

messages.append(" applet stoppee! ");

}

public static void main( String args[ ] ) {

Frame f= new Frame("applet");

essai6 monapplet = new essai6();

monapplet.init();

monapplet.start();

f.add(monapplet);

f.setSize(300,300);

f.setBackground(new Color(0,0,255));

f.show();

}

}

class outils6 extends Panel implements ActionListener {

TextField e;

TextArea ptrmessages;

Page 53: La programmation orientée objet

[email protected]

Les applets

outils6(TextArea ta) {

Button b = null;

ptrmessages=ta;

add(e = new TextField("45", 4));

b = new Button("Dessin");

b.addActionListener(this);

add(b);

b = new Button("Reset");

b.addActionListener(this);

add(b);

}

public void actionPerformed(ActionEvent ev) {

String label = ev.getActionCommand();

System.out.println(ev.toString());

System.out.println(label + " " + e.getText().trim());

ptrmessages.append(" "+label + " " + e.getText().trim());

}

}

Page 54: La programmation orientée objet

[email protected]

<applet height=100 width=100

codebase="myclasses/"

code="My.class">

<param name="ticker">

</applet>

Ma_page.html

Du Java sur le web

Page 55: La programmation orientée objet

[email protected]

Une applet toute simple import java.awt.*;

import java.applet.*;

public class essai7 extends Applet {

TextArea messages;

public void init() {

messages=new TextArea("Hello!",2,40);

add("Center",messages);

messages.append(" init fini! ");

}

public void destroy() {

remove(messages);

}

public void start() {

messages.append(" start fait! ");

}

public void stop() {

messages.append(" applet stoppee! ");

}

}

Page 56: La programmation orientée objet

[email protected]

Thread = Tâche

Thread monProcess = new Thread();

Modification des propriétés

monProcess.setPriority(MAX_PRIORITY);

Démarrage

monProcess.start();

Appel de la méthode run() de monProcess

Définition de la méthode run() Spécialisation de run() dans une sous-classe de Thread

Implémentation de l’interface Runnable

Les Threads

Page 57: La programmation orientée objet

[email protected]

Synchronisation (verrou)

sur un objet Exemple : public class Bouteille {

private double volume;

public Bouteille() {

volume = 0;

}

public synchronized double niveau() {

return volume;

}

public synchronized void remplir(double quantite) {

volume = volume + quantite;

}

}

niveau et remplir sont exécutés en exclusion mutuelle

Page 58: La programmation orientée objet

[email protected]

Synchronisation

Bloquer une tâche wait();

sur un objet quelconque

Réveiller d’une tâche notify();

sur l’objet cause du blocage

Réveiller toutes les tâches notifyAll();

sur l’objet cause du blocage

Passer en état d'attente sleep(delai); // en millisecondes

Génère une InterruptedException

Redonner le contrôle au scheduler yield();

Attendre

try {

wait(delai); // en millisecondes }

catch (InterruptedException e) {

// Actions à faire si le délai est dépassé

}

Page 59: La programmation orientée objet

[email protected]

Les Threads : exemple

import java.awt.Graphics;

import java.awt.Color;

import java.util.*;

import java.text.DateFormat;

public class Clock extends java.applet.Applet implements Runnable {

private Thread clockThread = null;

public void init() {

setBackground(Color.white);

}

public void start() {

if (clockThread == null) {

clockThread = new Thread(this, "Clock");

clockThread.start();

}

}

Page 60: La programmation orientée objet

[email protected]

Les Threads : exemple public void run() {

Thread myThread = Thread.currentThread();

while (clockThread == myThread) {

repaint();

try {

Thread.sleep(1000);

}

catch (InterruptedException e) { }

}

}

public void paint(Graphics g) {

Calendar cal = Calendar.getInstance();

Date date = cal.getTime();

DateFormat dateFormatter = DateFormat.getTimeInstance();

g.drawString(dateFormatter.format(date), 5, 10);

}

public void stop() {

clockThread = null;

}

}