Informatique / Programmation

Documents pareils
Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Java Licence Professionnelle CISII,

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Chapitre 10. Les interfaces Comparable et Comparator 1

Programmer en JAVA. par Tama

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Généralités sur le Langage Java et éléments syntaxiques.

ACTIVITÉ DE PROGRAMMATION

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Premiers Pas en Programmation Objet : les Classes et les Objets

Objets et Programmation. origine des langages orientés-objet

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Systeme d'exploitation

INITIATION AU LANGAGE JAVA

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

TP1 : Initiation à Java et Eclipse

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Tp 1 correction. Structures de données (IF2)

Présentation du langage et premières fonctions

Langage et Concepts de Programmation Objet. 1 Attributs et Méthodes d instance ou de classe. Travaux Dirigés no2

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Héritage presque multiple en Java (1/2)

Cours 1: Java et les objets

RMI le langage Java XII-1 JMF

Informatique / Programmation

Remote Method Invocation (RMI)

Langage Java. Classe de première SI

Arbres binaires de recherche

Chapitre 2. Classes et objets

Solutions du chapitre 4

Page 1 sur 5 TP3. Thèmes du TP : l la classe Object. l Vector<T> l tutorial Interfaces. l Stack<T>

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Introduction à JDBC. Accès aux bases de données en Java

Lambda! Rémi Forax Univ Paris-Est Marne-la-Vallée

3. SPÉCIFICATIONS DU LOGICIEL. de l'expression des besoins à la conception. Spécifications fonctionnelles Analyse fonctionnelle et méthodes

Chapitre VI- La validation de la composition.

Package Java.util Classe générique

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

STAGE IREM 0- Premiers pas en Python

Synchro et Threads Java TM

Threads. Threads. USTL routier 1

Une introduction à Java

P r ob lé m a t iq u e d e la g é n é r icit é. Pr in cip e d e la g é n é r icit é e n Ja v a ( 1 /3 )

I. Introduction aux fonctions : les fonctions standards

Initiation à la programmation en Python

Gestion distribuée (par sockets) de banque en Java

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

TD/TP PAC - Programmation n 3

INF 321 : mémento de la syntaxe de Java

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

Plan. Exemple: Application bancaire. Introduction. OCL Object Constraint Language Le langage de contraintes d'uml

Programmation Objet Java Correction

Java DataBaseConnectivity

Génie Logiciel avec Ada. 4 février 2013

Chapitre I Notions de base et outils de travail

TD3: tableaux avancées, première classe et chaînes

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Machines virtuelles fonctionnelles (suite) Compilation ML Java

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

Auto-évaluation Programmation en Java

JAVA TD0. Prise en main du langage Environnement de base JAVA 1

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

Cours d initiation à la programmation en C++ Johann Cuenin

J2SE Threads, 1ère partie Principe Cycle de vie Création Synchronisation

Programme Compte bancaire (code)

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004


Cours de Programmation 2

Programmation Par Objets

Projet de programmation (IK3) : TP n 1 Correction

Cours de Génie Logiciel

Corrigé des exercices sur les références

Programmation avec des objets : Cours 7. Menu du jour

RMI. Remote Method Invocation: permet d'invoquer des méthodes d'objets distants.

INTRODUCTION AUX SYSTEMES D EXPLOITATION. TD2 Exclusion mutuelle / Sémaphores

Info0604 Programmation multi-threadée. Cours 5. Programmation multi-threadée en Java

TP, première séquence d exercices.

Programmation par les Objets en Java

Polymorphisme, la classe Object, les package et la visibilité en Java... 1

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

ALGORITHMIQUE ET PROGRAMMATION En C

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

as Architecture des Systèmes d Information

basée sur le cours de Bertrand Legal, maître de conférences à l ENSEIRB Olivier Augereau Formation UML

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

Généricité. en Java. (polymorphisme paramétrique) Philippe GENOUD UJF Janvier

Cours No 3 : Identificateurs, Fonctions, Premières Structures de contrôle.

Initiation à JAVA et à la programmation objet.

PROBLEMES D'ORDONNANCEMENT AVEC RESSOURCES

Le langage C++ est un langage de programmation puissant, polyvalent, on serait presque tenté de dire universel, massivement utilisé dans l'industrie

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

Corrigés des premiers exercices sur les classes

Étude de l interopérabilité de deux langages de programmation basée sur la machine virtuelle de Java

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

Transcription:

Informatique / Programmation Programmation orientée objet avec Java 04 : Méthodes Jacques Bapst jacques.bapst@hefr.ch

Pourquoi créer des méthodes La taille des problèmes à résoudre à l'aide d'un programme peut être très complexe, d'où la nécessité de : Subdiviser les problèmes en sous-problèmes (plus simples) que l'on traite indépendamment : [ approche Top / Down ] Abstraction, modularisation, raffinements successifs Réutiliser des parties de code existantes (exemple : entrée/sorties, fonctions mathématiques, graphiques, etc) : [ approche Bottom / Up ] Rapidité de développement, efficacité, fiabilité Une méthode permet de regrouper, sous un nom, une suite d'instructions exécutable à répétition. EIA-FR / Jacques Bapst PR1_04 2

Une méthode c'est On peut dire, en quelques mots, qu'une méthode c'est le regroupement d'une suite d'instructions auquel on attribue un nom (identificateur) peut être invoquée (appelée) par une instruction (dans une méthode appelante) permet la déclaration (optionnelle) de variables locales peut être optionnellement paramétrée au moyen d'une liste d'arguments (paramètres) peut optionnellement retourner une valeur (un résultat) à l'appelant peut être liée à l'existence d'un objet (méthode d'instance) ou à l'existence d'une classe (méthode statique) peut optionnellement générer une exception qui indique qu'un événement exceptionnel s'est produit durant son exécution (par exemple une erreur) EIA-FR / Jacques Bapst PR1_04 3

Méthodes [1] Une méthode est une séquence nommée d'instructions. Ces instructions peuvent être exécutées en invoquant (appelant) la méthode. Lorsqu'une méthode est invoquée, elle peut recevoir un certain nombre de valeurs appelées arguments (ou paramètres). Une méthode peut facultativement retourner une valeur d'un certain type (elle se comporte alors comme une expression complexe). On utilise également le terme fonction pour désigner une méthode qui retourne une valeur. Une invocation de méthode est une expression (avec effet de bord) qui peut être également utilisée en tant qu'instruction simple (sans exploitation d'une éventuelle de valeur de retour). Après l'exécution de la dernière instruction de la méthode, le contrôle retourne à l'instruction qui a invoqué la méthode. EIA-FR / Jacques Bapst PR1_04 4

Méthodes [2] Une méthode est caractérisée par sa signature (ou en-tête) qui comprend : le nom de la méthode le type et le nom de chacun des paramètres formels (arguments) le type de la valeur retournée par la méthode (ou sinon void) les types des exceptions que la méthode peut générer divers modificateurs de méthode qui fournissent des informations supplémentaires sur certaines propriétés de la méthode La signature d'une méthode définit tout ce qu'il est nécessaire de savoir pour l'utiliser (pour l'utiliser à bon escient, une description du comportement est naturellement indispensable). La signature constitue une partie importante de la spécification de la méthode appelée aussi API (Application Programming Interface) EIA-FR / Jacques Bapst PR1_04 5

Méthodes [3] Modificateurs Type de retour de la méthode Nom de la méthode Liste des paramètres formels Variable locale public static int max(int a, int b) { int r = a; if (b > a) r = b; return r; Valeur de retour (Expression) En-tête de la méthode (signature) Corps de la méthode... int v = max(k, 3);... Invocation (appel) de la méthode avec les paramètres effectifs EIA-FR / Jacques Bapst PR1_04 6

Déclaration de méthode En_tête_de_méthode { Corps_de_méthode L'en-tête de la méthode définit la signature de la méthode. Le corps de la méthode comprend les instructions qui seront exécutées lors de l'invocation de la méthode. Remarque : Contrairement à d'autres langages (Ada, C++,...) qui imposent ou permettent de placer dans des unités de compilation séparées les spécifications (en-têtes) et implémentations (corps), le langage Java groupe ces deux éléments dans une unique structure. EIA-FR / Jacques Bapst PR1_04 7

En-tête de méthode La syntaxe pour déclarer l'en-tête de la méthode est la suivante : [ modificateurs ] type nom ( liste_param ) [ throws exceptions ] modificateurs : Un ou plusieurs mots-clés séparés par des espaces. Ils définissent certaines propriétés de la méthode (visibilité, etc). Optionnel [public, private, protected, final, static, native, abstract, synchronized] type : nom : liste_param : exceptions : Définit le type de retour de la méthode (fonction). Si la méthode ne retourne pas de valeur, le type doit être void (vide) Nom de la méthode (même règles que pour les identificateurs). Liste de paramètres formels séparés par des virgules. Chaque paramètre est défini comme une variable locale (type nom). La liste de paramètres peut être vide (les parenthèses demeurent). Liste des types d'exceptions pouvant être générées par la méthode (les exceptions sont séparées par des virgules). Optionnel EIA-FR / Jacques Bapst PR1_04 8

Corps de méthode { Instructions Le corps de la méthode est constitué d'une séquence d'instructions délimitées par des accolades. Des variables locales peuvent être déclarées, leur portée sera limitée au corps de la méthode (à partir de la déclaration). Si la signature de la méthode déclare un type de retour (autre que void), le corps de la méthode doit comprendre une instruction return suivie d'une expression compatible avec le type de retour déclaré dans la signature. Cette expression définit la valeur de retour de la méthode (la valeur restituée). EIA-FR / Jacques Bapst PR1_04 9

Exemples de méthodes [1] //----------------------------------------------- // Method without parameter // Prints a separator line //----------------------------------------------- public static void separate() { System.out.println("------------------------"); //----------------------------------------------- // Returns the square of the parameter val //----------------------------------------------- public static double square(double val) { return val * val; EIA-FR / Jacques Bapst PR1_04 10

Exemples de méthodes [2] //----------------------------------------------- // Returns the max value between v1 and v2 //----------------------------------------------- public static int max(int v1, int v2) { if (v1 > v2) return v1; else return v2; //----------------------------------------------- // Method that calls other methods //----------------------------------------------- public static double fcta(double a, int b, int c) { int temp = max(b, c); return square(a) / temp; EIA-FR / Jacques Bapst PR1_04 11

Méthode main La méthode main() joue un rôle particulier. C'est le point d'entrée d'une application Java (ce n'est pas le cas pour les applets qui doivent disposer des méthodes init() et start()). Elle est invoquée par la machine virtuelle lors du lancement de l'application. La méthode reçoit en argument un tableau de String contenant les éventuelles valeurs des paramètres de lancement (pour plus de détail consulter le slide intitulé Arguments sur la ligne de commande du chapitre consacré aux Entrées/Sorties). Sa signature est imposée. //----------------------------------------------- // Main method (displays "Hello") //----------------------------------------------- public static void main(string[] args) { System.out.println("Hello"); EIA-FR / Jacques Bapst PR1_04 12

Utilité des méthodes En Java, c'est pratiquement la seule construction permettant d'exécuter des instructions. Permet le découpage d'un problème en sous-problèmes plus simples. Améliore la lisibilité du code source (si le nom des méthodes est bien choisi, leur invocation donnera déjà au lecteur du code des informations précieuses sur le rôle de ces méthodes). Favorise le principe d'abstraction et d'encapsulation : l'utilisateur d'une méthode n'a pas à connaître tous les détails de l'implémentation; seule la spécification est nécessaire (notion de "boîte noire"). Permet la réutilisation des instructions (évite de dupliquer le code avec tous les inconvénients que cela comporte). EIA-FR / Jacques Bapst PR1_04 13

Emplacement des méthodes En Java, toutes les méthodes doivent être déclarées au sein d'une classe. Il n'y a pas de méthodes globales. Contrairement à d'autres langages, Java n'autorise pas de créer directement une méthode à l'intérieur d'une autre méthode. Il n'y a pas d'imbrication de méthodes (à moins de créer une classe locale). Dans l'ordre des lignes du code source, les méthodes peuvent être invoquées (appelées) avant d'avoir été déclarées. Il est ainsi possible à deux méthodes de s'appeler mutuellement...... public static void f(int i) { System.out.println("f(" + i + ")"); if (i>0) g(--i);..... public static void g(int j) { System.out.println("g(" + j + ")"); f(j);..... EIA-FR / Jacques Bapst PR1_04 14

Invocation de méthode [1] L'invocation (l'appel) d'une méthode provoque l'exécution de ses instructions. Pour invoquer une méthode, on utilise son nom suivi de zéro, une ou plusieurs expressions séparées par des virgules et placées entre parenthèses. Les valeurs de ces expressions constituent les arguments (ou paramètres effectifs) de la méthode. Ils doivent correspondre en types (compatibilité) et en nombre à la liste définie dans la signature de la méthode. Syntaxe : Nom_de_la_méthode ( expr1, expr2,... ) Remarque : Les expressions constituant les paramètres effectifs sont évaluées de gauche à droite. C'est important dans des expressions du genre : f(f(a, f(b, c)), f(d, e)); EIA-FR / Jacques Bapst PR1_04 15

Invocation de méthode [2] Les méthodes définies sans type de retour (déclarées avec void) sont invoquées à la manière d'une instruction simple (donc suivies d'un point-virgule). separate(); // Les parenthèses sont obligatoires Les méthodes définies avec un type de retour sont généralement invoquées dans des expressions (affectation, paramètre effectif de méthode, ) mais peuvent également être invoquées comme des instructions simples (dans ce cas la valeur de retour n'est pas utilisée). double PI = 3.1416; double area, radius = 1.5; int error; String f = "config.ini"; area = PI * square(radius); error = readfile(f); readfile(f); // Invocation dans une expression // Invocation dans une expression // Invocation comme instruction simple EIA-FR / Jacques Bapst PR1_04 16

Séquencement Lors de l'invocation de méthodes, une pile d'appels est constituée de manière à pouvoir revenir au point d'invocation après l'exécution de la méthode (chemin de retour). public void p() { q(); public void q() { r(); public void r() { p(); q(); r(); EIA-FR / Jacques Bapst PR1_04 17

Passage de paramètres [1] Lors de la définition d'une méthode, on déclare une liste (éventuellement vide) de paramètres formels qui peuvent être considérés comme des variables locales dans le corps de la méthode. Lors de l'invocation d'une méthode, on doit transmettre, pour chaque paramètre formel, une expression dont le type est compatible avec celui qui est déclaré dans la signature de la méthode. Ces expressions constituent les paramètres effectifs. Le passage des valeurs des paramètres peut s'assimiler à une assignation entre les variables constituées par les paramètres formels et les expressions qui représentent les paramètres effectifs. Cette assignation a lieu à l'entrée de la méthode (avant l'exécution de la première instruction). Ce mécanisme est appelé "Passage par valeur" (ou également mode "Copy In"). EIA-FR / Jacques Bapst PR1_04 18

Passage de paramètres [2] La méthode agit donc sur des copies locales des valeurs des expressions transmises en paramètres lors de l'invocation. A la sortie de la méthode (après l'exécution de la dernière instruction), les variables contenant les copies locales ne sont pas réassignées en retour (pas de "Copy Out"). A chaque invocation de la méthode, de l'espace mémoire est alloué pour enregistrer les valeurs des paramètres effectifs (ainsi que pour les autres variables locales déclarées dans la méthode). Cet espace mémoire est libéré à la sortie de la méthode. Les variables contenant les copies locales des paramètres effectifs ainsi que les variables locales déclarées dans la méthode ne peuvent donc pas être utilisées en dehors du corps de la méthode. EIA-FR / Jacques Bapst PR1_04 19

Passage de paramètres [3] Illustration du mécanisme de passage de paramètres lors d'un appel de fonction. Dans l'exemple, le paramètre effectif (nb) est copié dans la variable locale représentant le paramètre formel (i) de la méthode triple(). public static void main(string[] args) { int nb = 4; nb 4 int r = triple(nb); r 12 System.out.println("> " + nb + ", " + r); i = nb; public static int triple(int i) { i 4 nb 4 return 3*i; i 4 nb 4 Console > 4, 12 EIA-FR / Jacques Bapst PR1_04 20

Passage de paramètres [4] Le mécanisme qui a été vu pour le passage de paramètres de types primitifs s'applique également si les paramètres passés sont de types référence (des objets ou des tableaux). Dans ce cas, on aura donc une copie locale de la référence mais pas des valeurs référencées (c'est efficace à l'exécution mais peut induire des effets de bord dont il faut être conscient). Le détail du passage de paramètres de type référence ainsi que les implications que peut induire ce mode de transfert seront décrits dans le chapitre suivant consacré aux tableaux. Il est possible de définir des méthodes comportant un nombre variable de paramètres. Comme cette syntaxe fait appel à des tableaux, elle sera décrite à la fin du chapitre suivant. EIA-FR / Jacques Bapst PR1_04 21

Surcharge de méthodes (Overloading) Le langage Java permet de définir plusieurs méthodes avec le même nom pour autant que la liste des paramètres soit différente. Deux listes de paramètres sont différentes si : le nombre de paramètres est différent ou alors la liste ordonnée des types des paramètres est différente (Remarque : la deuxième règle est suffisante) On remarquera que : le type de retour de la méthode n'entre pas en considération le nom des paramètres formels non plus Exemples : public static int triple(int i) { return (i*3); public static float triple(float f) { return (f*3); EIA-FR / Jacques Bapst PR1_04 22

Surcharge de méthodes [2] La technique consistant à définir plusieurs méthodes avec le même nom s'appelle la surcharge de méthode (Overloading). Lors de l'invocation d'une méthode surchargée, c'est le compilateur qui détermine (sur la base du profil des paramètres) la méthode qui doit être appelée. Conseil : Dans un contexte donné, plusieurs méthodes ne doivent porter le même nom que si les opérations effectuées ont une forte similitude sémantique. Remarque : Contrairement à d'autres langages (Ada, C++,...), Java ne permet pas de surcharger les opérateurs (+, -, *, /, ==, ). EIA-FR / Jacques Bapst PR1_04 23

C o m p l é m e n t Java / Méthodes Récursivité [1] Une méthode est dite récursive si elle s'invoque elle-même. public static long factorial(long x) { if (x<0) {... ; // Error if x is negative if (x==0) return 1; else return x * factorial(x-1); On parle de récursivité indirecte si la méthode m 1 en cours de déclaration invoque une autre méthode m 2 qui, elle, invoque m 1 dans ses instructions (directement ou indirectement). EIA-FR / Jacques Bapst PR1_04 24

C o m p l é m e n t Java / Méthodes Récursivité [2] Les méthodes récursives doivent toujours contenir une instruction d'arrêt (généralement sous la forme d'une instruction if ( ) ) correspondant à un cas de base qui termine la récursivité (sous peine d'épuiser les ressources du système, notamment la mémoire). L'algorithme doit d'autre part garantir (dans toutes les situations) une convergence vers le cas de base (c'est-à-dire se rapprocher de l'instruction d'arrêt de la récursivité). Certains algorithmes se prêtent particulièrement bien à l'écriture de code récursif (parcours d'arbres, de graphes, fonctions mathématiques récurrentes,...). EIA-FR / Jacques Bapst PR1_04 25