révision des notions oo et java semaine 1 jian-yun nie
TRANSCRIPT
Révision des notionsOO et Java
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 compatiblesdouble 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;
a = 10;
int b = a;
a++;
0
int:a
10
int:a
10
int:a
10
int:b
11
int:a
10
int:b
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 {…}
Circle soleil;Rectangle box;
• soleil = new Circle(); //Correct• box = soleil; // Erreur• box = new Circle(); //Erreur
Contrôle du programme
• 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
non
boolean et test
• Combinaison de conditions (test booléens)– && ET– || OU– ! NONe.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];
board[0] [0] board[2] [3]
String comme une classe spécialeString s;s = “Hello world!”;
• Méthodes– Length(), – substring(début, longueur), substring(début, fin+1), – compareTo(t) < 0 , equalsIgnoreCase("Y")– …
H e l l o w o r l d !
s
…
null
référence corps
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; }
}
Créer des objets d’une classeRectangle 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’objetbox.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érencesbox == 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 – box.equals(box2)
• Des méthodes de comparaisons prédéfinies dans StringString input; …if (input.equals(“You are wright")) …if (input.equalsIgnoreCase("You are wright")) …
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
– 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; }– new A()?– new A(1)?
• public class A {
public A(int a) {this.a=a;}
int a;}– new A()?– new A(1)?
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
• Wideningbyte 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)?
Plus sur 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)
Plus sur Array
• double[] data = new double[10];
0
0
0
0
0
0
0
0
0
0
Plus sur 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)