Arnaud Labourel
10 ou 12 septembre 2018
Un programme propre :
À partir de maintenant, vous devez écrire du code qui fonctionne et qui puisse être lu sans effort.
À l’examen, un code ne respectant pas ces conditions sera considéré comme faux.
#include<stdbool.h>
struct Rectangle {
int width, height;
}
typedef struct Rectangle Rectangle;
bool isSquare(Rectangle* rectangle){
return rectangle->width == rectangle->height;
}
int countSquare(Rectangle* rectangles[], int length){
int nbSquares = 0;
for(int index = 0; index < length; index++){
if (isSquare(rectangles[i])) nbSquares++;
}
return nbSquares;
}
Le langage Java :
Les objectifs de Java :
Le programme HelloWorld.java :
class HelloWorld {
public static void main(String args[]) {
System.out.println("Hello World !");
}
}
$ javac HelloWorld.java
$ ls
HelloWorld.java HelloWorld.class
$ java HelloWorld
Hello World !
javac
) génère du bytecode java\(\Rightarrow\) il suffit de compiler le code une seule fois.
Comme pour le langage C, on manipule en Java les données à l’aide de variables et d’expressions :
En java, en plus des objets que nous allons voir, il existe des types primitifs similaires voire identiques aux types du langage C :
type | catégorie | taille | valeurs possibles | affichage |
---|---|---|---|---|
byte | entier | 8 bits | -128 à 127 | 0 |
short | entier | 16 bits | -32768 à 32767 | 0 |
int | entier | 32 bits | \(-2^{31}\) à \(2^{31} - 1\) | 0 |
long | entier | 64 bits | \(-2^{63}\) à \(2^{63} - 1\) | 0 |
float | flottant | 32 bits | 0.0 | |
double | flottant | 64 bits | 0.0 | |
char | caractère | 16 bits | caractère unicode | ‘\000’ |
boolean | booléen | non définie | false ou true |
false |
On souhaite réaliser une application permettant d’affecter des étudiants à des cours d’options :
Chaque élément va être représenté par un objet.
En programmation objet :
Mais on réfléchit uniquement au niveau de l’objet :
Un étudiant possède:
Et il peut :
Un cours possède :
Et il peut :
Une liste de préférences de cours possède :
Et elle peut :
Étudiants, cours et listes de préférences ont donc :
Un objet est une entité composée de :
student
: si le nombre d’étudiants inscrits est égal à la capacité, rejeter la demande d’inscription. Sinon ajouter student
aux étudiants inscrits.student
: si le nombre d’étudiants inscrits est inférieur à la capacité, ajouter student
aux étudiants inscrits. Sinon, inscrire student
et désinscrire un étudiant choisi par tirage au sort.Student
Paul Calcul et Marie Lis ont les mêmes comportements et les mêmes Attributs, seules les valeurs de leurs Attributs sont différentes. Ils appartiennent à la même classe.
Course
“Modélisation algorithmique” et “Introduction à la vérification” ne se comportent pas de la même façon, ils ne sont donc pas dans la même classe. Cependant ils proposent la même liste de services, ils ont donc une interface commune.
Un objet :
Dans les langages orientés objet, une classe (d’objet) définit :
Le mot-clé class
permet de définir une classe :
Le mot-clé public
sert à indiquer que la classe est accessible depuis l’extérieur.
On peut définir une variable de type “référence vers un Counter
” :
Une classe définit également un “moule” (constructeur) pour fabriquer des objets. La création d’un objet s’effectue avec le mot-clé new
:
La variable counter
contient alors une référence vers une instance de la classe Counter
.
Un objet créé à partir d’une classe est une instance de cette classe et est du type de cette classe.
Les attributs décrivent la structure de données de la classe :
On accède aux attributs avec l’opérateur .
(point) :
Chaque instance possède son propre état et donc ces propres valeurs de attributs.
On peut copier les références vers des instances :
Counter counter1 = new Counter();
Counter counter2 = counter1;
counter1.position = 10;
System.out.println("Counter 1 : " + counter1.position);
// Counter 1 : 10
System.out.println("Counter 2 : " + counter2.position);
// Counter 2 : 10
Une référence contient soit null
soit la référence d’une instance compatible avec le type de la variable.
Méthodes permettant d’accéder à l’état de l’objet :
Exemple d’utilisation :
Méthodes permettant de modifier l’état de l’objet :
class Counter{
int position, step;
void getPosition(){ return position; }
void setPosition(int p){
position = p;
}
}
Exemple d’utilisation :
Méthode qui modifie l’état de l’objet et retourne une valeur :
Les constructeurs permettent d’allouer et d’initialiser des instances.
Exemple d’utilisation :
Il est possible de déclarer plusieurs constructeurs (avec paramètres différents).
class Counter{
int position, step;
Counter(int p, int s){ position = p; step = s; }
Counter(int p){ position = p; step = 1; }
}
Exemple d’utilisation :
Si aucun constructeur n’est défini, la classe a un constructeur par défaut.
Ce code est équivalent au code suivant :
this
Le mot-clé this
fait référence à l’instance en construction ou à l’instance sur laquelle la méthode est appelée.
this
pour appeler un constructeurLe mot-clé this
permet également d’appeler un constructeur dans un constructeur :
Il est possible de définir des méthodes directement associées à la classe avec le mot-clé static
. Ces méthodes ne sont pas associées à une instance mais à la classe.
On peut appeler ces méthodes sans utiliser d’instance.
public class test{
public static void main(String[] arg) {
Counter.setStep(3);
Counter c1 = new Counter(2);
Counter c2 = new Counter(3);
c1.count(); c2.count();
System.out.println(c1.position); // → 5
System.out.println(c1.position); // → 6
Counter.setStep(4); c1.count(); c2.count();
System.out.println(c1.position); // → 9
System.out.println(c1.position); // → 10
}
}
Une méthode statique ne peut utiliser que :
L’utilisation de this
n’a aucun sens dans une méthode statique.
Il est préférable de ne pas utiliser le mot clé static sauf pour :
main
Math.PI
public
ou private
indiquent si l’attribut ou la méthode est connue de tous les objets ou seulement ceux de la classe.final
indique que l’attribut ne change jamais de valeur après la construction de l’objet.En java, il existe des types primitifs qui ne sont pas des objets :
type | catégorie | taille | valeurs possibles | affichage |
---|---|---|---|---|
byte | entier | 8 bits | -128 à 127 | 0 |
short | entier | 16 bits | -32768 à 32767 | 0 |
int | entier | 32 bits | \(-2^{31}\) à \(2^{31} - 1\) | 0 |
long | entier | 64 bits | \(-2^{63}\) à \(2^{63} - 1\) | 0 |
float | flottant | 32 bits | 0.0 | |
double | flottant | 64 bits | 0.0 | |
char | caractère | 16 bits | caractère unicode | ‘\000’ |
boolean | booléen | non définie | false ou true |
false |
Lors d’un appel de méthode les arguments sont passés par valeur : une copie de la valeur de l’argument est créé lors de l’appel.
Pour les objets, cela signifie passer une copie de la référence : il est donc possible de modifier l’état de l’objet.
Pour les types primitifs, cela signifie que l’argument est un copie uniquement créée pour l’appel et toute modification de sa valeur n’aura pas d’impact en dehors de l’appel.
En Java, les tableaux sont des objets (et donc des références).
Déclaration d’une variable de type “référence vers un tableau” :
Allocation d’un tableau :
Utilisation d’un tableau :
Déclaration :
Allocation :
matrixOfInt = new int[10][];
for(int row = 0; row < matrixOfInt.length; row++)
matrixOfInt[row] = new int[5];
/* ou directement */
matrix = new int[10][5];
Matrices non rectangulaires :
Trois classes permettent de gérer des chaînes de caractères :
String
: chaîne invariable (immutable)StringBuilder
: chaîne modifiable (mono-thread)StringBuffer
: chaîne modifiable (multi-thread)Déclaration et création :
Concaténation :
Affichage :
System.out.print(helloWorld); // affiche "Hello World !"
System.out.println(helloWorld); // affiche "Hello World !"
// avec retour à la ligne
Comparaison :
Une classe (d’objet) définit des :
Comment programmer proprement ?
Pour programmer proprement dans un langage objet, il faut :
Guide de bonnes pratiques disponible en ligne.