Programmation Orientée Objet – Java Les tableaux Les tableaux
Transcription
Programmation Orientée Objet – Java Les tableaux Les tableaux
Java Classes et instances Les tableaux Déclaration d’une variable de type “référence vers un tableau” : int[] arrayOfInt; double[] arrayOfDouble; Programmation Orientée Objet – Java Allocation d’un tableau : Bertrand Estellon arrayOfInt = new int[10]; arrayOfDouble = new double[3]; Département Informatique et Interactions Aix-Marseille Université Utilisation d’un tableau : 21 septembre 2016 arrayOfInt[0] = 5; arrayOfInt[9] = 10; arrayOfInt[2] = arrayOfInt[0] + 3*arrayOfInt[9]; arrayOfDouble[2] = arrayOfInt[2] + 3.5; Bertrand Estellon (DII – AMU) Programmation Orientée Objet – Java Java 21 septembre 2016 1 / 171 Bertrand Estellon (DII – AMU) Classes et instances Programmation Orientée Objet – Java Java Les tableaux Références et Garbage Collector L’expression new int[10] retourne une “référence vers un tableau” : Une variable de type “référence” peut valoir null : int[] array = new int[10]; int[] array2 = array; // Allocation d'un tableau // Copie de la référence 21 septembre 2016 28 / 171 Classes et instances int[] array = null; // La variable "array" contient la référence "null". // Elle pointe vers aucune instance. Seule la référence est copiée, il n’y a qu’un seul tableau : array[4] = 2; // Affectation d'une valeur à la 5ème case System.out.println(array2[4]); // "5" Important : Une référence contient soit null soit la référence d’un tableau ou d’un objet compatible avec le type de la variable. Le Garbage collector peut supprimer les éléments devenus innaccessibles : Taille du tableau : int[] array = new int[10]; array[3] = 6; ... array = null; // La mémoire utilisée pour le tableau peut être libérée int[] array = new int[10]; // Allocation d'un tableau int length = array.length; // Récupération de la taille System.out.println(length); /* ou directement */ System.out.println(array.length); Bertrand Estellon (DII – AMU) Programmation Orientée Objet – Java 21 septembre 2016 29 / 171 Bertrand Estellon (DII – AMU) Programmation Orientée Objet – Java 21 septembre 2016 30 / 171 Java Classes et instances Java Des tableaux aux objets Classes et instances Les objets Un objet : Un tableau : ▶ peut être alloué (ou construit) : array = new int[5] ▶ est structuré : il est constitué d’un ensemble de cases ▶ possède un état : la valeur de ses cases ▶ possède une interface L’interface d’un tableau : ▶ peut être construit ▶ est structuré : il est constitué d’un ensemble de propriétés ▶ possède un état : la valeur de ses propriétés ▶ possède une interface : l’ensemble des méthodes et propriétés accessibles par les utilisateurs de l’objet Dans les langages orientés objet, une classe (d’objets) définit : ▶ affecter une valeur à une case : array[index] = value ; ▶ une façon de construire des objets (constructeur) ▶ consulter la valeur d’une case : array[index] ; ▶ la structure des objets de la classe (propriétés) ▶ récupérer sa longueur : array.length ; ▶ le comportement des objets de la classe (méthodes) ▶ l’interface des objets de la classe (méth. et prop. non-privées) ▶ un type “référence vers des objets de cette classe” Les types “référence vers des tableaux” sont définis dans le langage Bertrand Estellon (DII – AMU) Programmation Orientée Objet – Java Java 21 septembre 2016 31 / 171 Bertrand Estellon (DII – AMU) Classes et instances Programmation Orientée Objet – Java Java 21 septembre 2016 Classes et instances Les propriétés Le mot clé class permet de définir une classe : Les propriétés décrivent la structure de données de la classe : class Counter { int position; int step; } class Counter { /* Définition des propriétés et des méthodes */ } On accède aux propriétés avec l’opérateur “.” (point) : On peut ensuite définir une variable de type “référence vers un Counter” : Counter counter; La création d’une instance s’effectue avec le mot clé new : Counter counter = new Counter(); La variable counter contient alors une référence vers une instance de la classe Counter. Programmation Orientée Objet – Java 21 septembre 2016 Counter counter = new Counter(); counter.position = 12; counter.step = 2; counter.position += counter.step; Chaque instance possède son propre état : Une classe définit également un “moule” pour fabriquer des objets. Bertrand Estellon (DII – AMU) 32 / 171 Classes et instances 33 / 171 Counter counter1 = new Counter(); Counter counter2 = new Counter(); counter1.position = 10; counter2.position = 20; if (counter1.position!=counter2.position) System.out.println("différent"); Bertrand Estellon (DII – AMU) Programmation Orientée Objet – Java 21 septembre 2016 34 / 171 Java Classes et instances Java Références et Garbage Collector Les méthodes Méthodes qui modifient l’objet : Comme pour les tableaux, on peut copier les références : class Counter { int position, step; Counter counter1 = new Counter(); Counter counter2 = counter1; counter1.position = 10; if (counter1.position==counter2.position) System.out.println("égalité"); void init(int initPos, int s) { position = initPos; step = s; } Important : Une référence contient soit null soit la référence d’un objet compatible avec le type de la variable. Le Garbage collector peut supprimer les objets devenus innaccessibles : Counter c = new Counter(); ...; c = null; // La mémoire utilisée pour l'objet peut être libérée Bertrand Estellon (DII – AMU) Programmation Orientée Objet – Java Java Classes et instances 21 septembre 2016 void count() { position += step; } } On invoque les méthodes avec l’opérateur “.” (point) : Counter counter = new Counter(); counter.init(4, 8+12); counter.count(); counter.count(); System.out.println(counter.position); 35 / 171 Bertrand Estellon (DII – AMU) Classes et instances Programmation Orientée Objet – Java Java Les méthodes Les méthodes Méthode permettant de consulter l’état de l’objet : Méthode qui modifie et retourne une valeur : 36 / 171 class Counter { class Counter { /* Code de la méthode init. */ /* Code du slide précédent. */ int count() { position += step; return position; } int getPosition() { return position; } } } Exemple d’utilisation : Exemple d’utilisation : Counter counter = new Counter(); counter.init(4, 8+12); counter.count(); counter.count(); System.out.println(counter.getPosition()); Bertrand Estellon (DII – AMU) 21 septembre 2016 Classes et instances Programmation Orientée Objet – Java 21 septembre 2016 37 / 171 Counter counter = new Counter(); counter.init(4, 8+12); System.out.println(counter.count()); System.out.println(counter.count()); Bertrand Estellon (DII – AMU) Programmation Orientée Objet – Java 21 septembre 2016 38 / 171 Java Classes et instances Java Classes et instances Comparaison de références Déclaration d’un constructeur Il est possible de comparer deux références : Les constructeurs permettent d’agréger l’allocation et l’initialisation : class Counter { int position, step; public class Test { public static void main(String arg[]) { Counter counter1 = new Counter(); Counter counter2 = counter1; Counter(int p, int s) { position = p; step = s; } Counter(int p) { position = p; step = 1; } if (counter1==counter2) System.out.println("=="); /* Méthodes count() et getPosition() */ } Counter counter3 = new Counter(); if (counter1!=counter3) System.out.println("!="); if (counter2!=counter3) System.out.println("!="); Exemple d’utilisation : } Counter c1 = new Counter(2,10); Counter c2 = new Counter(22); } Bertrand Estellon (DII – AMU) Programmation Orientée Objet – Java Java 21 septembre 2016 39 / 171 Bertrand Estellon (DII – AMU) Classes et instances Programmation Orientée Objet – Java Java 21 septembre 2016 40 / 171 Classes et instances Constructeur par défaut Le mot-clé this Si aucun constructeur n’est défini, la classe a un constructeur par défaut : Le mot-clé this fait référence à l’instance en construction ou à l’instance qui a permis d’invoquer la méthode en cours d’exécution : public class Counter { int position = 10, step = 1; } class Counter { int position, step; Counter(int position, int step) { this.position = position; this.step = step; } Ce code est équivalent à celui-ci : public class Counter { int position, step; void count() { int position = this.position; position += step; this.position = position; } } public Counter() { position = 10; step = 1; } } Bertrand Estellon (DII – AMU) Programmation Orientée Objet – Java 21 septembre 2016 41 / 171 Bertrand Estellon (DII – AMU) Programmation Orientée Objet – Java 21 septembre 2016 42 / 171 Java Classes et instances Java Classes et instances Le mot-clé this Surcharge de méthode Le mot-clé this permet également d’appeler un constructeur dans un constructeur de façon à ne dupliquer du code : Dans une classe, deux méthodes peuvent avoir le même nom. Java doit pouvoir décider de la méthode à exécuter en fonction des paramètres : class Value { int value = 0; class Counter { int position, step; void set() { value = 0; } void set(int value) { this.value = value; } void set(double vallue) { this.value = (int)value; } Counter(int position, int step) { this.position = position; this.step = step; } } Counter(int position) { this(position, 1); } Exemple d’utilisation : Value value = new Value(); value.set(); // Première méthode value.set(2); // Deuxième méthode value.set(2.5); // Troisième méthode /* Autres méthodes. */ } Bertrand Estellon (DII – AMU) Programmation Orientée Objet – Java Java 21 septembre 2016 43 / 171 Bertrand Estellon (DII – AMU) Classes et instances Programmation Orientée Objet – Java Java 21 septembre 2016 44 / 171 Classes et instances Propriétés et méthodes statiques Données et méthodes statiques Les propriétés et des méthodes statiques sont directement associées à la classe et non aux instances de la classe : Comme les propriétés et méthodes statiques sont associées à la classe, il n’est pas nécessaire de posséder une instance pour les utiliser : public class Test { public static void main(String[] arg) { Counter.setStep(3); Counter counter1 = new Counter(2); Counter counter2 = new Counter(3); counter1.count(); counter2.count(); System.out.println(counter1.position); // → 5 System.out.println(counter2.position); // → 6 Counter.setStep(4); counter1.count(); counter2.count(); System.out.println(counter1.position); // → 9 System.out.println(counter2.position); // → 10 } } class Counter { static int step; int position; Counter(int position) { this.position = position; } static void setStep(int step) { Counter.step = step; } void count() { position += step; } } Bertrand Estellon (DII – AMU) Programmation Orientée Objet – Java 21 septembre 2016 45 / 171 Bertrand Estellon (DII – AMU) Programmation Orientée Objet – Java 21 septembre 2016 46 / 171 Java Classes et instances Java Classes et instances Données et méthodes statiques Chaînes de caractères Une méthode statique ne peut utiliser que : Trois classes permettent de gérer les chaînes de caractères : ▶ des propriétés statiques à la classe ; ▶ des méthodes statiques à la classe ; afin de garantir par transitivité l’utilisation exclusive de données statiques. Java la classe StringBuffer : chaîne modifiable (multi-thread). ▶ la classe StringBuilder : chaîne modifiable (mono-thread). Concaténation : String helloWorld = hello + " "+ world + " ! "; int integer = 13; String helloWorld1213 = hello + " " + world + " " + 12 + " " + integer; 21 septembre 2016 47 / 171 Bertrand Estellon (DII – AMU) Programmation Orientée Objet – Java Classes et instances Java Chaînes de caractères 21 septembre 2016 48 / 171 21 septembre 2016 50 / 171 Classes et instances Point d’entrée et arguments Le programme Echo.java : Affichage : System.out.print(helloWorld); // affiche "Hello World !" System.out.println(helloWorld); // affiche "Hello World !" // avec retour à la ligne Comparaison : String a1 = "a"; String a2 = "a"; String a3 = new String("a"); System.out.println(a1==a2); // affiche "true" System.out.println(a1==a3); // affiche "false" System.out.println(a1.equals(a3)); // affiche "true" Bertrand Estellon (DII – AMU) ▶ String hello = "Hello"; String world = "World"; class Counter { /* ... */ static void setStep(int step) { Counter.step = step; } /* ... */ } Programmation Orientée Objet – Java la classe String : chaîne invariable (immutable) ; Déclaration et création : L’utilisation de this n’a aucun sens dans une méthode statique : Bertrand Estellon (DII – AMU) ▶ Programmation Orientée Objet – Java 21 septembre 2016 public class Echo { public static void main(String[] args) { for (int i = 0; i < args.length; i++) System.out.println(args[i]); } } $ javac Echo.java $ ls Echo.java Echo.class $ java Echo toto aaa toto aaa 49 / 171 Bertrand Estellon (DII – AMU) Programmation Orientée Objet – Java Java Classes et instances Java Programmer “proprement” : nommage Classes et instances Programmer “proprement” : nommage Un nommage correct des méthodes et variables améliore grandement la lisibilité et la maintenabilité d’un code. Êtes-vous capable de dire rapidement ce que fait cette classe ? Le nommage des variables, attributs, classes et méthodes est important : class Stack { private int stack[] = new int[100]; private int size = 0; public void push(int i) { stack[size] = i; size++; } class Structure { private int s[] = new int[100]; private int t = 0; public int pop() { size--; return stack[size]; } public void end(int i) { s[t] = i; t++; } public int top() { t--; return s[t]; } public bool isEmpty() { return size == 0; } public bool test() { return t == 0; } } } Bertrand Estellon (DII – AMU) Programmation Orientée Objet – Java Java 21 septembre 2016 51 / 171 Classes et instances Conventions de nommage en Java Conventions officielles de nommage en Java : ▶ Première lettre en majuscule pour les noms des classes ; ▶ Première lettre en minuscule pour les noms des membres ; ▶ Premières lettres de chaque mot en majuscule ; ▶ Noms simples et descriptifs ; ▶ N’utiliser que des lettres et des chiffres. class Stack { private int stack[] = new int[100]; private int size = 0; public void pushInteger(int i) { stack[size] = i; size++; } public int popInteger() { size--; return stack[size]; } } Bertrand Estellon (DII – AMU) Programmation Orientée Objet – Java 21 septembre 2016 53 / 171 Bertrand Estellon (DII – AMU) Programmation Orientée Objet – Java 21 septembre 2016 52 / 171