Cours 2 : Premiers objets, API Java et Collections
Viviane Pons
Master BIBS Université Paris-Saclay
Question
Réponse : OUI, quand vous utilisez un Scanner
, une chaîne de caractère String
ou encore System.out
, vous utilisez des objets !
Mais un objet, c’est quoi ?
public class Rational {
public final int n;
public final int d;
Rational(int n, int d) {
if(d == 0) {
throw new IllegalArgumentException();
}
int div = gcd(n, d);
n = n / div;
d = d / div;
this.n = n;
this.d = d;
}
public Rational add(Rational r2) {
return new Rational(n*r2.d + r2.n * d, d * r2.d);
}
...
}
Un objet est une instance de la classe. Ici, il y a une seule classe Rational
et 3 instances r1
, r2
et r3
.
Chaque objet a accès à ses propres champs (ici n
et d
) et à ses propres méthodes (ici la méthode add
).
static
ExempleStatic.temperature = 300;
System.out.print("Constante Kelvin : ");
System.out.println(ExempleStatic.kelvin);
System.out.print("Température en deg C : ");
System.out.println(ExempleStatic.temperatureC());
System.out.print("Température en deg F : ");
System.out.println(ExempleStatic.temperatureF());
Le mot clé static
pour les champs / méthodes signale les paramètres associés à la classe et non pas aux objets (ou instances).
Dans l’exemple, vous voyez qu’on ne crée pas d’objets. Les variables et méthodes statiques peuvent être considérées comme des variables globales qui sont “rangées” à l’intérieur d’une classe.
Exemples :
main
est toujours static
.System
ne peut pas être instanciée mais on utilise la variable statique System.out
(ce sont des types simples)
Mais où sont les classes String
et Scanner
? dans l’API Java
Ce sont l’ensemble des classes qui sont fournies avec Java (plus précisément, avec JRE). Environ 4400 classes organisées en 220 “packages” dans 21 “modules”.
Par exemple :
String
et System
se trouvent dans le package java.lang
Scanner
se trouve dans le package java.util
Tous les éléments de java.lang
sont importés par défaut. Pas ceux de java.util
! C’est pour ça qu’on écrit :
Comment connaître ces classes et savoir comment les utiliser ? Réponse : la Javadoc !
Avez vous remarqué ces petits blocs de commentaire ?
/**
* Teste si une personne est majeure
* @param age l'age de la personne
* @return true si la personne est majeure, false sinon
*/
Ce sont des blocs de documentation. Ils suivent un formalisme particulier (par exemple @param
@return
) et peuvent être utilisés pour générer des pages automatique de documentation, c’est le format Javadoc.
La documentation Javadoc de l’API Java est disponible sur le site d’Oracle
On peut aussi y accéder directement depuis l’IDE. Tout comme on peut accéder à sa propre javadoc.
Problème courant : gérer un “grand nombre” d’objets
Première solution : les tableaux à taille fixe
La taille est fixée et ne peut plus être modifiée après la création.
System.out.println(monTableau.length);
System.out.println(monTableau2.length);
for(int i = 0; i < monTableau2.length; i++) {
System.out.println(monTableau2[i]);
}
for(int val : monTableau2) {
System.out.println(val);
}
System.out.println(Arrays.toString(monTableau2));
La classe Arrays : contient plein de méthodes statiques pour utiliser les tableaux
int[][] maMatrice = new int[20][20];
int[][] maMatrice2 = {{1,2,3},{4,5,6}};
for(int i = 0; i < maMatrice2.length; i++) {
for(int j = 0; j < maMatrice2[i].length; j++ ) {
System.out.print(maMatrice2[i][j] + " ");
}
System.out.println();
}
Mais comment faire quand on veut pouvoir ajouter / supprimer des éléments ?
C’est un contrat que doit remplir une classe : une liste de méthode à implanter. On dit qu’une classe implémente une interface.
Quelques méthodes :
add
: pour ajouter un élémentaddAll
: pour ajouter une collection d’élémentsremove
: pour supprimer un élémentcontains
: est-ce que ma collection contient cet élément ?size
: le nombre d’élémentsL’interface List
contient les méthodes de Collection + d’autres. Utilisée pour réprésenter une liste ordonnée d’objets identifiés par un indice comme pour les tableaux.
Quelques méthodes :
get
: récupérer un objet à un indice donnéset
: mettre un objet à un indice donnéindexOf
: renvoie l’indice d’un objet donnéremove(indice)
: pour supprimer un élément à un indice donnéCollection
et List
sont des interfaces, La Javadoc nous indique les classes qui les implémentent. Par exemple ArrayList
.
Création d’une liste avec ArrayList
:
Que remarquez vous ?
<...>
Integer
? Pourquoi pas int
? Parce que int
n’est pas un objet, on utilise un type wrapperAjouts d’éléments :
Affichage :
On privilégiera la deuxième boucle (foreach) qui fonctionne sur les objets de type Collection
et tableaux : en effet, les deux implémentent l’interface Iterable
.
Integer[] monTableau = {1, 2, 3};
List<Integer> maListe2 = Arrays.asList(monTableau);
List<Integer> maListe3 = Arrays.asList(1, 2, 3);
Attention, le code suivant ne marche pas !
Mais on peut faire :
En Java, les variables stockent non pas les objets mais la référence à l’objet – i.e. l’adresse mémoire.
Qu’affiche ce code ?
Qu’affiche ce code ?
Que se passe-t-il quand on ne crée pas l’objet ?
Par défaut, maListe
est une “référence vide”, c’est un pointeur vers rien du tout qui en Java prend la valeur null
. Si vous essayez de l’utiliser, une erreur NullPointerException
apparaîtra.
Set
et SortedSet
(sous-interfaces de Collection
) implantées par exemple avec HashSet
et TreeSet
: les ensembles contenants les objets une unique fois.Map<K,V>
souvent implémentée par HashMap
: pour stocker des “dictionnaires” clés – valeurs.