Notions de base de programmation et Objets Semaine 1 Jian-Yun Nie
Notions de base Chaque Variable, Constante (valeur) est typée Types de bases: int, byte, float, boolean, etc. String, … Casting entre types compatibles double balance = 13.75; int dollars = balance; // Error int dollars = (int) balance; // OK long rounded = Math.round(balance); // 13.75 ->14
Comprendre comment ça fonctionne int:a int a; a = 10; int b = a; a++; int:a 10 int:a int:b 10 10 int:a int:b 11 10
Classe comme type (plus de détails plus tard) Type objet défini par le programmeur Définir une classe (type) Référence de ce type E.g. public class Circle {…} public class Rectangle {…} Circle soleil; //déclaration de la var. Rectangle box; soleil = new Circle(); //créer une instance box = soleil; // Erreur: types incompatibles box = new Circle(); //Erreur
Contrôle du programme if condition then statement else statement ; non if condition then statement else statement ; while condition statement ; do statement while (condition); //fait au moins une fois for (Initialization; condition; update) statement ; e.g. for (i=1; i<n; i++) { double interest = balance * rate / 100; balance = balance + interest; } condition oui
boolean et test Combinaison de conditions (test booléens) || OU ! NON e.g. if (0 < amount && amount < 1000) . . . Tester la condition la plus exigeante d’abord, ne pas faire des tests redondants if (amount > 10000000000 || amount < 5000) … if ((0 < amount && amount < 1000) && amount > 100) …
Structure de données de base Tableau (Array) E.g. double [ ] a = new double[10]; for (i=0; i<10; i++) a[i] = i; a 0 9 String [ ] [ ] board = new String [3] [4]; éléments: board[0] [0] board[2] [3]
String comme une classe spéciale String s; s = “Hello world!”; Méthodes Length(), substring(début, longueur) substring(début, fin+1), compareTo(t) < 0 , equalsIgnoreCase("Y") … référence corps s … null H e l o w r d !
Array Array: Séquence de valeurs du même type Construire un Array: new double[10] Stocker des valeurs double[] data = new double[10]; À la création, les valeurs d’éléments sont initialisée: nombre: 0 Boolean: false Référence à Object: null (Attention: Array et String sont aussi des classes d’objet)
Array double[] data = new double[10];
Array data[2] = 29.95;
Traverser un Array Traverser tous les éléments: for (Type variable : collection) statement E.g. double[] data = . . .; double sum = 0; for (double e : data) { sum = sum + e; } Équivalent à : double[] data = . . .; double sum = 0; for (int i = 0; i < data.length; i++) { double e = data[i]; sum = sum + e; }
Copier un Array double[] data = new double[10]; // fill array . . . double[] prices = data; // Copier la référence
Copier un Array double[] prices = (double[]) data.clone();
Copier les éléments de Array System.arraycopy (from, fromStart, to, toStart, count);
Ajouter un élément dans Array System.arraycopy(data, i, data, i + 1, data.length - i - 1); data[i] = x;
Enlever un élément de Array System.arraycopy(data, i + 1, data, i, data.length - i - 1);
Agrandir un Array Si un Array (data) n’est pas asez grand: Créer un nouveau Array plus grand: double[] newData = new double[2 * data.length]; Copier les éléments dans le nouveau Array: System.arraycopy(data, 0, newData, 0, data.length); Réaffecter la référence (data) au nouveau Array: data = newData;
ArrayList – une structure de données plus flexible The ArrayList class manages a sequence of objects Can grow and shrink as needed ArrayList class supplies methods for many common tasks, such as inserting and removing elements The ArrayList class is a generic class: ArrayList<T> collects objects of type T: ArrayList<BankAccount> accounts = new ArrayList<BankAccount>(); accounts.add(new BankAccount(1001)); accounts.add(new BankAccount(1015)); accounts.add(new BankAccount(1022)); size method yields number of elements
Obtenir un élément de ArrayList Use get method Index starts at 0 BankAccount anAccount = accounts.get(2); // gets the third element of the array list Bounds error if index is out of range Most common bounds error: int i = accounts.size(); anAccount = accounts.get(i); // Error // legal index values are 0. . .i-1
Ajouter un élément Remplacer un élément existant: BankAccount anAccount = new BankAccount(1729); accounts.set(2, anAccount); Ajouter (insérer) un nouvel élément à l’indexe i: accounts.add(i, a)
Enlever un élément accounts.remove(i)
Traverser un ArrayList Similare à Array: ArrayList<BankAccount> accounts = . . . ; double sum = 0; for (BankAccount a : accounts) { sum = sum + a.getBalance(); } Equivalent à: double sum = 0; for (int i = 0; i < accounts.size(); i++) { BankAccount a = accounts.get(i); sum = sum + a.getBalance(); }
Différences sur la taille Array: length (attribut) ArrayList: size() (méthode) String: length() (méthode)
Attention length = nombre maximal d’éléments que Array peut contenir, même si ces places ne sont pas remplies.
Attention Éviter de créer deux Array séparés pour la même série de données (mise à jour difficile)
Classe Classe = modèle (moule) à objet Définition d’une nouvelle classe Identificateur (nom de classe) Attributs (ou variables) Méthodes (dont constructeur) E.g. public class Rectangle { public Rectangle(int x, int y, int width, int height) this.x=x; this.y=y; this.width=width; this.height=height; } int x, y, width, height; public int getWidth() {return width; } Note: this.x = x Nom de classe constructeur attributs méthodes
Créer des objets d’une classe Rectangle box, box1, box2; box = new Rectangle(5, 10, 20, 30); box1 = new Rectangle(35, 30, 20, 20); box2 = new Rectangle(45, 0, 30, 20);
Manipulations des objets Référer à un attribut (accessible) d’objet box.x box.y box.width box.height e.g. box.x = box.x + 1
Manipulations Différentes références peuvent référer au même objet: box2 = box; box2.y ++; box.y =?
Rectangle box = new Rectangle(5, 10, 20, 30); Rectangle box2 = box; box2.translate(15, 25); (Supposons que la méthode translate(15, 25) change X et y par +15 et +25.) Changements faits sur l’objet Et non sur la référence.
Comparaison d’objet Comparer les références box == box2: les 2 références réfèrent au même objet? box != box2: elles réfèrent aux objets différents? Comparer le contenu des objets définir equals dans la classe public class Rectangle { public Rectangle(int x, int y, int width, int height) this.x=x; this.y=y; this.width=width; this.height=height; } int x, y, width, height; public int getWidth() {return width; } public boolean equals(Rectabgle r) {return this.x==r.x && this.y==r.y && this.width==r.width && this.height==r.height; } box.equals(box2)
Comparaison d’objet Des méthodes de comparaisons prédéfinies dans String String input; … if (input.equals(“You are right")) … if (input.equalsIgnoreCase("You are right")) …
Plus sur classe Forme générale d’une déclaration de classe: accessSpecifier class ClassName { constructors methods fields } E.g. public class BankAccount { public BankAccount(double initialBalance) { . . . } public void deposit(double amount) { . . . } . . . }
Constructeurs Constructeur implicite D’autres constructeurs explicits public NomClasse (); Retourne un objet (instance) du type de la classe Aucun paramètre Défini si aucun autre constructeur est défini par le programmeur E.g. public class BankAccount { } implicitement: public BankAccount(); D’autres constructeurs explicits Ne doit pas spécifier le type de retour Différents constructeurs doivent prendre différents paramètres (différents types ou différents nombres - signature) Ne doivent pas avoir de conflit sur la signature (nom + suite des types de paramètres) E.g. public BankAccount(String name) {…} public BankAccount(float amount) {…}; Un constructeur peut utiliser un autre: public BankAccount(String name) {this(); this.owner = name; …}
Exemples public class A { int a; } public class A { new A()? new A(1)? public class A { public A(int a) {this.a=a;} int a;}
Attributs (variables) Les attributs composent la partie « physique » d’un objet Il y a une place créée dans un objet pour stocker leur valeur Type d’attribut (int, String, … ou une classe) Protection (public, private, …) Plus de détails plus tard Syntaxe: accessSpecifier class ClassName { . . . accessSpecifier fieldType fieldName; . . . }
Méthodes Une méthode = une procédure, une action, … définie dans la classe Un objet (instance) a une référence vers cette procédure, ce qui lui permet de l’appeler (exécuter) Syntaxe: accessSpecifier returnType methodName (parameterType parameterName, . . .) { method body } e.g. public void deposit(double amount) { . . . }
this Cette référence spéciale permet de référer au même objet à partir duquel la méthode est appelée (objet courant) E.g. public class BankAccount { … public void withdraw(double amount) { double newBalance = balance - amount; balance = newBalance; } … public double balance; } BankAccount moreSavings = new BankAccount (1000); int balance; moreSavings.withdraw(500); this.balance
This: résoudre le conflit public class Rectangle { public Rectangle(int x, int y, int width, int height) this.x=x; this.y=y; this.width=width; this.height=height; } int x, y, width, height; public int getWidth() {return width; }
Protection public: permet un accès de n’importe qui private: accessible seulement par une méthode de la même classe Sans spécification: accessible du même package (à étudier plus tard) protected (package, plus tard) Conseils: Protéger le plus possible les attributs d’un objet Créer des méthodes d’accès de l’extérieur Lire la valeur (accessor) Modifier la valeur Accessibilité des méthodes public: permet à l’utiliser de l’extérieur private: ne peut être utilisée que par une méthode définie dans la même classe Q: Peut-on créer un constructeur private?
Conversion automatique de types Widening byte shortintlongfloatdouble char Narrowing (casting) doublefloatlongintcharshort byte
Signature et matching de méthode int min(int a, int b) {…} float min(int x, int y) {…} //même signature en Java - conflit float min(float x, float y) {…} //diff. signatures Matching: min(1, 2): min(int a, int b) min(1, 0.2): min(float x, float y) Ambiguité (erreur de compilation) boolean inf(float x, int y) {return x<y} boolean inf(int x, float y) {return x<y} inf(1,2)?