:: Enseignements :: Licence :: L3 :: 2009-2010 :: Programmation Objet avec Java ::
[LOGO]

Objet, référence, égalité


Exercice 1 - Point

On cherche à écrire une classe Point stockant un point graphique en coordonnées cartésiennes (appelons les x et y).
  1. Déclarer une classe Point contenant les deux champs privés x et y.
    Puis essayer le code suivant dans une méthode main de la classe Point.
    	    Point p=new Point();
    	    System.out.println(p.x+" "+p.y);
          
    Expliquer.
  2. Créer une classe Main (dans un fichier Main.java) et déplacer le main de Point dans la classe Main.
    Quel est le problème ? Comment peut-on le corriger ?
  3. Pourquoi doit-on toujours déclarer les champs privés ?
  4. Qu'est ce qu'un accesseur ?
    Quels sont les acceseurs que l'on doit mettre ici ?
  5. Ajouter un constructeur initialisant les coordonnés du point avec deux paramètres (appelons les px et py).
  6. Modifier le constructeur précédent pour que les deux paramètres s'appellent x et y. Quel est le problème ? Quel est la solution ?
  7. Indiquer pourquoi il faut déclarer les champs x et y final.
    Quel est le problème avec le code de test.
  8. Ecrire un autre constructeur qui prend un point en paramètre et et utilise les coordonnées de celui-ci pour initialiser le point courant.
    Comment le compilateur fait-il pour savoir quel constructeur appeler ?

Exercice 2 - Test d'égalité

En utilisant la classe Point de l'exercise précédent.
      Point p1=new Point(1,2);
      Point p2=p1;
      Point p3=new Point(1,2);

      System.out.println(p1==p2);
      System.out.println(p1==p3);
     

  1. Qu'affiche le code ci-dessus ?
  2. Ecrire dans la classe Point une méthode isSameAs() (à vous de trouver la signature exacte de la méthode) qui renvoie true si deux points ont les mêmes coordonnées.
  3. La classe java.util.ArrayList correspond à un tableau qui s'agrandi dynamiquement.
    A quoi sert la méthode indexOf ?
  4. Executez le code suivant :
         public static void main(String[] args){
           Point p1=new Point(1,2);
           Point p2=p1;
           Point p3=new Point(1,2);
    
           ArrayList list = new ArrayList();
           list.add(p1);
           System.out.println(list.indexOf(p2));
           System.out.println(list.indexOf(p3));
         }
         
    Quel est le problème avec les résultats affiché sur la console.
    Note : ici, le compilateur génère un warning au niveau du add. Nous verrons dans les prochains TD comment l'éviter.
  5. Quel méthode de Point est appelée par ArrayList.indexOf ?
    Lire la doc !!!
  6. Modifier la classe Point pour que indexOf() teste suivant les coordonées des Points et pas suivant les références.
  7. Utiliser l'annotation @Override pour vérifier que vous avez bien écrit la signature de la méthode ajoutée à Point.
  8. A quoi sert l'annotation @Override ?

Exercice 3 - Comment afficher un Point ?

On aimerait pouvoir afficher les caractéristiques d'un point, par le code Java suivant :
      Point point=...
      System.out.println(point);
    
Java sait faire cela, à condition de mettre dans la classe Point une méthode public String toString() (la définition de cette méthode est dans la classe java.lang.Object) retournant une chaîne de caractères, qu'on construit typiquement à partir des attributs de l'objet.
Rappel: en Java on peut faire un '+' entre une String et n'importe quoi, le résultat est la concatenation entre la String et le n'importe quoi vu comme une suite de caractère.

  1. Ecrire cette méthode, pour obtenir par exemple l'affichage suivant :
          (x, y)
          
  2. Peut-on utiliser l'annotation @Override, ici ?

Exercice 4 - Tri à bulle [à la maison]

  1. Ecrire une méthode swap qui échange les valeurs de deux cases d'un tableau. void swap(int[] array,int index1,int index2)
  2. Ecrire une méthode indexOfMin qui renvoie l'index de la valeur minimale d'un tableau.
  3. Modifier la méthode indexOfMin en ajoutant deux index indiquant que l'on cherche l'index du minimum non pas sur tout le tableau mais sur la partie de tableau entre les deux index (le premier inclus, le deuxième exclus).
  4. Ecrire la méthode sort qui prend un tableau d'entier en paramètre et qui trie celui-ci en utilisant pour cela les méthodes indexOfMin et swap.