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).
staticExempleStatic.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.langScanner se trouve dans le package java.utilTous 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.