81
Les tableaux en java

Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Embed Size (px)

Citation preview

Page 1: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Les tableaux en java

Page 2: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Introduction

• Principe assez proche du C++

• Plus faciles à manipuler qu'en C

• Les tableaux peuvent être des ensembles ordonnées de :– types de bases (int, char, …)

– d'objets !

• Note : en Java, les tableaux sont des objets

Page 3: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Déclaration

• syntaxe : type [ ] nomDuTableau ;

• int [ ] tableau ;– la déclaration ne fait que déclarer le tableau mais ne crée pas le tableau

en mémoire. La variable déclarée permet de référence tout tableau de même type.

• L'opérateur new permet de créer le tableau– int [] tableau ;

tableau = new int[50] ;

• La taille donnée est fixe, elle ne peut plus être modifiée

Page 4: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Visualisation

Page 5: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Accès aux éléments

• principe : tableau[expression]– Comme en C, les éléments d'un tableau de taille n sont numérotés de 0

à n-1

– expression est une expression donnant une valeur entière bien sûr !

– Java vérifie dynamiquement que la valeur de l'élément existe sinon• erreur : ArrayIndexOutOfBoundsException

• beaucoup mieux que le C

Page 6: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Attribut du tableau

• tableau.length donne la taille du tableau– int [ ] monTableau = new int[10] ;

– monTableau.length → 10 taille du tableau

– monTableau.length – 1 → indice max du tableau

• cf Cours8.java utilisation du tableau args[ ]

Page 7: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Avantage du tableauJeu du Yahtzee

ancienne version :

public class Yahtzee{

int d1 , d2 , d3 , d4 , d5 ; //les 5 dés

...

}

nouvelle version :

public class Yahtzee{

int[] dice = new int[5];

...

}

Page 8: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Avantage du tableau

• Le code est plus compact et plus adaptable (marche avec un nombre quelconque de dés)

ancienne version :

d1 = getRandomDieValue();

d2 = getRandomDieValue();

d3 = getRandomDieValue();

d4 = getRandomDieValue();

d5 = getRandomDieValue();

}

nouvelle version :

public static void rollDice(){

for(int i=0; i < dice.length; i++){

dice[i] = getRandomDieValue();

}

}

Page 9: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Obtenir la valeur d'un dé

public static int getRandomDieValue(){

return Random.nextInt(6) + 1 ;

}

Cette Méthode retourne une valeur entre 1 et 6.

Nous reverrons les méthodes ultérieurement

Page 10: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Refactorisation du Yahtzeeles constantes

• Refactoriser signifie simplifier le programme sans changer son comportement ;

• Exemple:

class Yahtzee{

public static final int NUMBRE_DE_DES = 5;

int[] dice = new int[NOMBRE_DE_DES];

...

}

• 5 est un nombre magique. Il ne faut pas créer un tableau int[] dice = new int[5]

• Cela rend les changements difficiles si on utilise 10 dés

CONSTANTE

Page 11: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Réécriture de la méthode

Utilisation d'une boucle basée sur NOMBRE_DE_DES

for(int i = 0; i < NOMBRE_DE_DES; i++){

dice[i] = getRandomDieValue();

}

• Le code est plus général et fonctionne quel que soit le nombre de dés

• Le code est plus lisible

Page 12: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Autres possibilités de créer des tableaux

• comme en C, on peut donner explicitement la liste de ses éléments à la déclaration (liste de valeurs entre accolades)– int [ ] t = {17, 8, 9, 23, 17} ;

– char [ ] voyelles = { 'a', 'e', 'i', 'o', 'u', 'y' } ;

• L'allocation mémoire (équivalent de new) est réalisée implicitement

Page 13: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Synthèse

• Un tableau est une suite d’éléments du même type

• Le mot-clef new est utilisé pour allouer de l’espace mémoire

• Lors de l’allocation mémoire, il est nécessaire de préciser la taille du tableau

• Une fois que le tableau est créé, sa taille ne peut être modifiée

Page 14: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Tableaux et boucles

• affecter un tableau aux valeurs : {2,4,...,100}

• nous pouvons affecter directement chaque élément, mais cela représente trop de travail

• on utilise plutôt une boucle !

int[] a = new int[500];

for(int i=2, j=0; i<=1000; i+=2, j++){

a[j] = i;

}

• Les boucles sont très pratiques pour le parcours dans un tableau

Page 15: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

La classe Arrays

• Java dispose d'une classe Arrays qui propose des méthodes pour trier et rechercher des éléments dans des tableaux

• import java.util.Arrays ; pour l'utiliser

• cf Cours9.java que fait ce code ?

• Exercice :

A partir d'un tableau trié de 100 éléments (cf Cours9.java) demander à l'utilisateur de rentrer une valeur entre 0 et 1000 et afficher si cette valeur est trouvée dans le tableau et si oui à quelle position

• cf Cours10.java recherche dans un tableau

Page 16: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Méthodes

Méthodes statiques

Page 17: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Méthodes

• 2 types de méthodes en java– Opérations sur les objets :

• String str = "coucou" ;

• str.toUpperCase() ; // mise en majuscules

– Opérations statiques (méthodes de classe)• Math.sin(double a) // méthode sin de la classe Math

• Math.max(int a, int b) // méthode max de la classe Math

• Files.delete(c:\temp\toto.txt") // méthode delete

– Pour le moment, nous nous intéressons aux méthodes statiques qui sont des outils

Page 18: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Méthodes statiques

• En java, les méthodes dites « statiques » doivent être vues comme des outils offerts par une classe

• Une méthode statique ne s’applique pas sur un objet à la différente des méthodes d'objets

• Les méthodes statiques s'appliquent en dehors des objets

• C'est ce qui se rapproche le plus des fonctions des langages impératifs (C, Ada, ...)

Page 19: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Exemple

import java.util.*;

public class Remodel {

public static void main(String[] args) {

callBob();

callPeter();

}

public static void callBob() {

System.out.println("Paint room");

}

public static void callPeter() {

System.out.println("Install hardwood floor");

}

}

Page 20: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Déclaration

• public static <typeRetour> nomMethode ( <liste de paramètres>) {<corps de la méthode>}

• <typeRetour>

– quand la méthode renvoie une valeur, indique le type de valeur retournée

• static int max3(int a, int b, int c) // retourne un entier

• static int [ ] fibonacci(int n) // retourne un tableau d'entiers

– void si la méthode ne retourne pas de valeur

• static void dessinerCercle(Point p, int rayon)

Page 21: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Déclaration

• public static <typeRetour> nomMethode ( <liste de paramètres>) {<corps de la méthode>}

• <corps de la méthode>– suite de déclaration de variables (types primitifs ou objets) et

d'instructions

– si la méthode retourne une valeur, le corps de la méthode doit contenir l'instruction return expression ; où expression délivre une valeur du type attendu en retour public static int abs(int a) {

if (a < 0) return -a ;else return a ;}

Page 22: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Déclaration

• public static <typeRetour> nomMethode ( <liste de paramètres>) {<corps de la méthode>}

• <corps de la méthode>– return est indispensable lorsque la méthode retourne une valeur

– return est facultatif si la méthode ne retourne pas de valeur (void), toutes les instructions suivant le return sont ignorées. Quitte le bloc et retourne ) la fonction appelante

public static void sauteLignes(int a) {if (a <= 0) return ;int i ;for (i = 0 ; i < a ; i++) System.out.println("") ;}

Page 23: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Notes sur les variables

• public static <typeRetour> nomMethode ( <liste de paramètres>) {<corps de la méthode>}

• <corps de la méthode>– elles conservent les données qui sont manipulées par la méthode

– elles ne sont accessibles que dans le bloc dans lequel elles ont été déclarées, et leur valeur est perdue lorsque la méthode termine son exécution public static int methode1(...)

{ double x ; int [ ] t = new int[10] ; double a ;…}

public static int methode2(...){ double y ; int [ ] t = new int[10] ; double a ;…}

on peut utiliser le

même identificateur

dans 2 méthodes distinctes.Variables locales

Page 24: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Appel des méthodes statiques

• Déclaration

• Appel– <liste des paramètres effectifs>

– liste d'expressions séparées par des virgules et dont le nombre et le type correspond au nombre et au type des paramètres de la méthode

nomMethode( <liste des paramètres effectifs>)

public static <typeRetour> nomMethode ( <liste de paramètres>) {<corps de la méthode>}

déclaration Appel

public static void sauteLignes(int a) {}

sauteLignes(10) ;

public static int abs(int a){}

n = abs(-5) ;b = abs(x) ;

public static int [ ] fibonacci(int n){}

int [ ] t = new int[10] ;t = fibonacci(6) ;

Page 25: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Passage de paramètres

• Comme en C, le passage de paramètres se fait par valeur– seule une copie des variables est transmise aux méthodes statiques

– ces paramètres sont considérées comme des variables locales à l'intérieur de la méthode

– cf Cours11.java et Cours12.java

Page 26: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Notes

• Pour nous, tous les méthodes seront public et static

• L’appel à la méthode provoque une interruption du flot de contrôle. Une fois que la méthode est exécutée, le contrôle repart à la méthode appelante

• Les noms de méthode commencent toujours par une minuscule

• Il faut toujours utiliser les parenthèses lors de l’appel de méthodes method_name( ... ) ceci indique à Java que l’on appelle une méthode et qu’on n’utilise pas une variable

• Une méthode soit toujours retourner un type. Si aucune valeur n’est retournée on utilise void

Page 27: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Notes

• Il y a deux manières d’appeler une méthode :

– m(...) à utiliser si la méthode ne retourne rien (méthode void)

– a = m(...) à utiliser si la méthode retourne une valeur

• Lorsque la méthode retourne une valeur cette dernière doit être sauvegardée ou utilisée (par un System.out.print par exempel)

• Une erreur très classique est d’utiliser une méthode qui retourne une valeur et ne pas la mettre dans une variable. Cela ne provoque pas d’erreur mais est totalement inutile

Page 28: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

public class Remodel { public static void main(String[] args) { double prixBob = callBob(8, 12); double prixPierre = callPeter(8, 12); double prixTotal = prixBob +prixPierre; System.out.println("prix total du projet : "

prixTotal + "€"); }

public static double callBob(int larg, int long) { System.out.println("Peinture"); double prixM2 = 0.80; return prixM2 * larg * long; }

public static double callPeter(int larg, int long) { System.out.println("Installation matériel électrique"); double prixM2 = 3.20; return prixM2 * larg * long; }}

Page 29: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Qu’est ce qui sera affiché ?

public class Example{

public static void inc(int i){

i++;

}

public static void main(String[] args) {

int i = 3;

inc(i);

System.out.println(i);

}

}

Page 30: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Exercice

• Modifier la méthode inc de manière à obtenir la valeur 4 en sortie de la méthode

Page 31: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Le jeu du marché

• Nous pouvons échanger des pommes et des poires

• Le jeu dure 10 jours

• Les prix changent aléatoirement tous les jours

• Le but étant bien évidemment de gagner le plus de €€€

• Chaque journée, il est possible de vendre ou d’acheter des pommes ou des poires

• Le jeu débute avec 100 €

• Il y a des restrictions– on ne peut acheter plus que ce que l’on peut offrir

– il n’est pas possible de vendre si on n’a pas le produit

Page 32: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Le marché (suite)

• on dispose des méthodes calculePrix(PRIX_DE_BASE, VARIATION) qui calculent le prix pour chaque jour

• PRIX_DE_BASE et VARIATION sont des constantes fourniesprixPomme = calculePrix(PRIX_DE_BASE, VARIATION)

• écrire la méthode main

Page 33: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Classes et Objets

Page 34: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Les concepts de l'OO

• L'OO en quelques mots– Une boite noire

– Un objet sans classe n'a pas de classe

– Les objets parlent aux objets

– Héritage

– Le modèle devient la référence → UML

– Avantages de l'OO

Page 35: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Aux origines de l'informatique

• Programmation dictée par le fonctionnement des processeurs

• Programme = succession d'instructions

• Organisation du programme et nature des instructions le plus proche possible de la façon dont le processeur les exécute

➔ Modification des données mémorisées➔ Déplacement des données d'un emplacement à un autre➔ Opérations arithmétiques et de logique élémentaires

● Programmation en langage « machine »● Exemple : « c = a + b » se programme

➔ LD A, REG1➔ LD B, REG2➔ ADD REG3, REG1, REG2➔ MV c, REG3

Page 36: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Langages procéduraux

• Mise au point d'algorithmes plus complexes

• Nécessité de simplifier la programmation– Distance par rapport au fonctionnement des processeurs

• Apparition des langages procéduraux– Cobol, Fortran, C, etc...

• Le raisonnement reste néanmoins conditionné par la conception des traitements et leur succession

➔ Éloigné de la manière humaine de poser et résoudre les problèmes➔ Mal adapté à des problèmes de plus en plus complexes (sauf pour les

étudiants très brillants!)

Page 37: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Avènement de l'objet

• Libérer la programmation des contraintes liées au fonctionnement des processeurs

• Rapprocher la programmation du mode cognitif de résolution des problèmes

• Mise au point d'un nouveau style de langage de programmation– Simula, Smalltalk, C++, EIffel, Java, C#, Delphi

• Idée centrale :– Placer les entités, objets ou acteurs du problème à la base de la

conception

– Étudier les traitements comme des interactions entre les entités

– Penser aux données AVANT de penser aux traitements

Page 38: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Une boite noire

• Un objet est une boite noire qui reçoit et envoie des messages

Page 39: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Classe

• Une classe est constituée de descriptions de :– données : que l'on nomme attributs

– procédures et fonctions : que l'on nomme méthodes

• Une classe est uniquement un modèle de représentation d'objets– ayant même structure (même ensemble d'attributs)

– ayant même comportement (même ensemble de méthodes)

• Les objets sont des représentations, on parle d'instances du modèle défini dans les classes– une classe permet d'instancier (créer) plusieurs objets

– en général, un objet est instance d'une classe

Page 40: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Exemple de classe

La classe Étudiant

Etudiant

nom : Stringprenom : StringanneNaissance : intNbNotes: intnotes : [] int

nom de la classe

attributs

méthodes

Page 41: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Syntaxe java

Les attributs sont des variables dites « d'instances » qui serontdisponibles dans toutes les instances de la classe Etudiant.Attention, ces variables seront très certainement différentesd'une instance de Etudiant à une autre.Les attributs peuvent être utilisés dans toutes les méthodesdéfinies par la classe.

attributs

Page 42: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Attributs de classeattribut non initialisé

• La déclaration d'un attribut se fait grâce à la syntaxe suivante :– type nomAttribut ;

ou

– type attribut = expression ;

• type peut soit être un type primitif (char, int, byte, …) soit être un type structuré (un objet)

attribut automatiquement initialisé

public class Vecteur2d{float x ;float y ;}

Page 43: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Déclaration des méthodes

• Une méthode définit du code exécutable qui peut être invoqué par les objets

• On distingue 3 types de méthodes:– Les constructeurs : méthodes servant à créer des objets

– Les accesseurs : méthodes servant à accéder aux données de nos objets

– Les méthodes de classe : méthodes servant à la gestion des objets

Page 44: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Constructeurs

• Méthode appelée automatiquement lors de la création d'une instance de classe (mot-clef new)

• Une classe permet de créer un nombre quelconque d'objets (instance)

• Chaque instance est engendrée par une classe– Pour notre classe Etudiant

• Un constructeur générique (nom inconnu, …)

• Un constructeur explicite. On fournit dans ce cas le nom de l'étudiant, son prénom, sa date de naissance, ...

Page 45: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Accesseurs

• Permet d'accéder aux différents attributs d'une classe

• Récupération des attributs d'une classe

• Modification des attributs d'une classe– Pour la classe Etudiant :

• Récupération du nom

• Modification de la date de naissance en cas d'erreur de saisie

Page 46: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

CommentairesL'outil javadoc permet de récupérer automatiquement les commentaires des méthodes Il faut donc OBLIGATOIREMENT commenter les méthodes

paramètres

javadoc

Cours13.java

Page 47: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Méthodes de classe

• Permet de travailler directement sur les instances de classe

• Gestion, édition, affichage, calcul sur les objets

• Pour notre classe Etudiant :– Calcul de la moyenne

– Ajout d'une note dans un examen

• Pour la classe String– toUpper() mise en majuscules

– subString() récupération d'une sous-chaîne

Page 48: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Les constructeurs

• Un constructeur est une méthode qui va se charger de créer un objet et, le cas échéant d'initialiser ses variables de classe

• Un constructeur n'est pas obligatoire, car il existe un constructeur par défaut qui créera l'objet

• Il peut y avoir plusieurs constructeurs pour une même classe (cf plus loin)mais

• Le (les) constructeur(s) doit (doivent) toujours porter le même nom que la classe sans valeur de retour

Page 49: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Méthode de classes

• Déclaration d'une méthode<typeRetour> nomMethode ( <liste de paramètres> ) {

<corps de la méthode>}

• Le principe est très semblable à celui des méthodes statiques

Page 50: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Paramètres de classes

• Déclaration d'une méthode<typeRetour> nomMethode ( <liste de paramètres> ) {

<corps de la méthode>}

• <liste de paramètres>– Vide si la méthode n'a pas de paramètres

• int nextInt() de la classe Scanner

• String nextLine() de la classe Scanner

– Une suite de couples type identificateur séparés par des virgules• int max3(int a, int b, int c)

• Int sort(int [] t) de la classe Arrays

Page 51: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Corps de la méthode

• Déclaration d'une méthode<typeRetour> nomMethode ( <liste de paramètres> ) {

<corps de la méthode>}

• <corps de la méthode>– Même principe que pour les méthodes statiques

– Si la méthode a un type de retour, le corps de la méthode doit contenir au moins une instruction return expression où expression délivre une valeur du type retourné

Page 52: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Corps de la méthode

• Déclaration d'une méthode<typeRetour> nomMethode ( <liste de paramètres> ) {

<corps de la méthode>}

• <corps de la méthode>– Suite de déclaration de variables locales et d'instructions (cf méthodes

statiques)

– Les variables déclarées à l'intérieur de la méthode sont des variables locales

– Elles ne sont accessibles que dans la méthode où elles sont déclarées

Page 53: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Visibilité des variables

Page 54: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Méthodes

• 2 types de méthodes en java– Opérations sur les objets :

• String str = "coucou" ;

• str.toUpperCase() ; // mise en majuscules

– Opérations statiques (méthodes de classe)• Math.sin(double a) // méthode sin de la classe Math

• Math.max(int a, int b) // méthode max de la classe Math

• Files.delete(c:\temp\toto.txt") // méthode delete

– Intéressons nous maintenant aux méthodes statiques qui sont des outils

Page 55: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Objets

• Un objet est une instance d'une seule classe :– Chaque attribut déclaré dans la classe de l'objet admet une valeur

propre dans chaque instance

– Ces valeurs caractérisent l'état de l'objet

– Les méthodes de classes agissent sur les instances. Attention, les méthodes statiques sont indépendantes des objets. Ce sont en général des boites à outils

Page 56: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Objets: Etudiant

• Chaque instance de la classe Etudiant possédera ses propres attributs (nom, prénom, ...)

Etudiant

e2 : Etudiante1 : Etudiant e3 : Etudiant

Nom : alfred Nom : paul Nom : jean

Page 57: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Décomposition d'un objet

• Un objet est en général constitué d'une partie dynamique et d'une partie statique– La partie statique est :

• commune à toutes les instances

• Un seul exemplaire pour l'ensemble des classes

– La partie dynamique est :• Propre à chaque instance

• Varie durant la vie d'un objet

nom : alfred nom : paul

prénom : prénom :

Partie statique

double calculerMoyenne()

Page 58: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Création d'objets en java

• Le mot a déjà été utilisé de nombreuses fois. La création d'un objet java à partir de son modèle (sa classe) s'appelle instanciation

• L'instanciation en java comporte trois parties :– Création de l'espace mémoire nécessaire pour la nouvelle instance

– Appel à une méthode ou à des méthodes particulières appelées constructeurs

– Renvoi d'une référence sur l'objet créé

Page 59: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Instanciation en java

• new constructeur (< liste de paramètres>)

• Les constructeurs ont le même nom que la classe

• Il existe toujours un constructeur par défaut qui ne fait que l'action 1 du processus d'instanciation, c'est-à-dire allocation de la mémoire pour l'objet– Sans paramètre

Etudiant e1 ;e1 = new Etudiant()Etudiant e2, e3 ;e2 = new Etudiant() ;e3 = e2 ;

Page 60: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Gestion de la mémoire

• L'instanciation provoque une allocation dynamique de la mémoire

• En Java, le programmeur n'a pas à se soucier de la gestion de la mémoire– Si un objet n'est plus référence (n'est plus utilisé par aucune référence),

la mémoire allouée est libérée automatiquement. Ce processus de libération de la mémoire est appelé « garbage collector » ou « ramasse-miettes »

Page 61: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Constructeur par défaut

RIEN ! Mais ça marche

Page 62: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Références en Java

• Déclarations de références

• Par défaut à la déclaration une référence vaut null– Etudiant e1; ↔ Etudiant e1 = null;

Etudiant e1;Etudiant e2, e3;

Nom de la classe

Identificateur(références)

Page 63: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Créer une instance de Ville

• Utilisation du mot-clef new– rappel String toto = new String() ;

– création d'une instance de l'objet String appelé toto

• Même principe que pour String

public class Test1{ public static void main(String[] args){ Ville v = new Ville(); } }

v est de type Ville

cf Cours14.java

Page 64: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Un constructeur plus élaboré

constructeur de laclasse Etudiant

Page 65: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Plusieurs constructeurs

• Une classe peut avoir plusieurs constructeurs

• C'est le principe dit de la surcharge, le constructeur sera choisi suivant les paramètres

• Cf Cours15.java

Page 66: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Les méthodes des objets

• Pour exécuter une méthode d'un objet, on parle dans le cadre de la POO d'envoi de messages

• Un message est composé de 3 parties :– Une référence (nom de l'instance) qui permet de déterminer l'objet à qui

le message est envoyé

– Le nom de la méthode à exécuter (cette méthode doit bien entendue être décrite dans la classe de l'objet)

– Les éventuels paramètres de la méthode

• Envoi de message est similaire à l'exécution d'une fonction mais les méthodes ne sont disponibles que pour un objet donné

Page 67: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

syntaxe

• nomObjet.nomMéthode(< liste de paramètres>)

Page 68: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Paramètre des méthodes

• Un paramètre d'une méthode peut être– Une variable de type simple, type primitif, déjà vu

– Une référence à une classe (par exemple String, mais également Dossier qui peut être le dossier d'un étudiant)

/** * teste si un étudiant est plus vieux que l'étudiant courant * * @param e étudiant * * @return vrai si l'étudiant courant est plus agé que celui passé en paramètre */ boolean plusVieux(Etudiant e){

if (anneeNaissance < e.anneeNaissance) return true;else return false;

}

Comment utiliser cetteméthode ?

Page 69: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

L'objet « this »

• En java, l'accent est mis sur l'objet (et non pas sur l'appel de fonction)– e1.ajouterNote(17)

– e1.plusVieux(e2)

• L'objet qui reçoit un message est implicitement passé comme argument à la méthode invoquée

• Cet argument implicite défini par le mot-clef this– Désigne l'objet courant (objet récepteur du message)

– Peut être utilisé pour rendre explicite l'accès aux propres attributs et méthodes définis dans la classe

– Est en général facultatif

Page 70: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Réécriture de Etudiant

Cf classe EtudiantThis

Page 71: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Accès aux attributs d'un objet

• Pour accéder aux attributs d'un objet, on utilise la notation :– nomObjet.nomAttribut

Etudiant e1;e1 = new Etudiant();Etudiant e2 = new Etudiant;Etudiant e3 = e2;e1.nom = "toto";e2.nom = "alfred";e3.anneeNaissance = 2000;

e1

e2

e3

toto

alfred

Page 72: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Encapsulation

• Accès direct aux variables d'un objet possible en java

• Mais... n'est pas recommandé car contraire aux principes des langages orientés-objets– Les données d'un objet doivent être privées (c'est-à-dire protégées et

accessibles qu'au travers de méthodes prévues à cet effet)

• En Java, on peut définir de manière assez précise la visibilité des membres (attributs et méthodes) d'une classe vis-à-vis d'une autre– private

– public

– protected

Page 73: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Encapsulation

• public/private

La classe peut être utilisée dans n'importe quelle classe

Attribut accessible depuis n'importe quelle classeClasse.attribut

Attribut accessible uniquement dans la classe où il est défini

Méthode pouvant être invoquée depuis n'importe quelle classeClasse.methode(...)

Méthode utilisable uniquement dans la classe où elle est définie

public private

classe

attribut

méthode

Page 74: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Exemple d'attributs private

Page 75: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

private (suite)

Ne foncti

onne plus

Car anneNaiss

ance est

Maintenant un attri

but

private

Page 76: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Intérêt

• On accède aux données seulement à travers des méthodes définies dans le code de la classe. On obtient ainsi un code robuste

• Cela maque l'implémentation et facilite l'évolution du logiciel

• Les méthodes qui accèdent aux attributs sont appelées accesseurs

• Les méthodes qui modifient les attributs sont appelées modificateurs

Page 77: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Accesseurs

• Les accesseurs sont conventionnellement préfixés par get

Page 78: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Modificateurs

Page 79: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Rap

pels

classe

attributs

méthodes

constructeur

Page 80: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Questions

• Inutile d'aller plus loin– Quelle est la différence entre une classe et une instance ?

– Qu'est-ce qu'un constructeur ?

– Qu'est-ce qu'une méthode ?

– Un constructeur est-il une méthode ?

– Qu'est-ce qu'un attribut ?

• Construire une classe Voiture– Année (millésime)

– Marque

– Couleur

– Neuve (booléen)

Page 81: Les tableaux en java - fonlupt/Enseignement/2015/java/cp 2... · Déclaration • syntaxe : type ... • int [ ] tableau ; – la déclaration ne fait que déclarer le tableau mais

Questions

• Inutile d'aller plus loin– Quelle est la différence entre une classe et une instance ?

– Qu'est-ce qu'un constructeur ?

– Qu'est-ce qu'une méthode ?

– Un constructeur est-il une méthode ?

– Qu'est-ce qu'un attribut ?

• Construire une classe Voiture– Année (millésime)

– Marque

– Couleur

– Neuve (booléen)