:: Enseignements :: ESIPE :: E3INFO :: 2014-2015 :: Programmation Objet avec Java ::
[LOGO]

String, StringBuilder, égalité [en autonomie]


Exercice 1 - Egalité, Redéfinition, Polymorphisme, Liaison tardive (late binding).

  1. Qu'affiche le code suivant :
           String s1="toto";
           String s2=s1;
           String s3=new String(s1);
    
           System.out.println(s1==s2);
           System.out.println(s1==s3);
         
    Expliquer
  2. Quelle est la méthode à utiliser pour tester le contenu des chaînes de caractères ?
  3. Qu'affiche le code suivant :
          String s1="toto";
          String s2="toto";
    
          System.out.println(s1==s2);
         
    Expliquer.
  4. Expliquer pourquoi il est important que java.lang.String soit non mutable.
  5. Qu'affiche le code suivant :
          String s="hello";
          s.toUpperCase();
          System.out.println(s);
         
    Expliquer.

Exercice 2 - En morse. Stop.

Ecrire une classe fr.umlv.morse.Morse qui permet lors de son exécution d'afficher les chaînes de caractères passées en argument séparées par des "Stop.".
      $ java Morse ceci est drole
      ceci Stop. est Stop. drole Stop.
    
  1. Utiliser dans un premier temps, l'opérateur + qui permet la concaténation de chaînes de caractères.
  2. A quoi sert un objet de la classe java.lang.StringBuilder
    Pouquoi sa méthode append(String) renvoie un objet de type StringBuilder ?
  3. Ré-écire la classe fr.umlv.morse.Morse en utilisant un StringBuilder.
    Quel est l'avantage par rapport à la solution précédente ?
  4. Recopier le code suivant dans une classe de Test :
           public static void main(String[] args) {
             if(args.length < 3) {
               System.out.println("At least 3 arguments expected on command line");
               return; 
             }
             String first=args[0];
             String second=args[1];
             String last=args[2];
             System.out.println(first+' '+second+' '+last);
           }
          
    Indication: pour exécuter une classe en lui passant des arguments sur la ligne de commande, il y a deux manières de faire:
    - soit on spécifie les arguments de la ligne de commande depuis eclipse. Menu Run -> Run configurations... et ensuite dans l'onglet "Arguments"
    - soit on exécute depuis un terminal, et pour cela on doit être dans répertoire "bin" ou "classes" du projet, à la racine de l'arborescence de package, et spécifier le nom de classe complet (i.e. préfixé par son package d'appartenance).
    Un utilisant cette deuxième technique, utiliser la commande javap pour afficher le bytecode généré
           javap -c Test
          
    Que pouvez vous en déduire ?
    Dans quel cas doit-on utiliser StringBuilder.append() plutôt que le + ?

Exercice 3 - Redéfinition

  1. Quelles sont les valeurs affichées par le main de la classe Test ? Expliquer pourquoi.
  2. En se plaçant dans B, à combien de méthodes x une méthode de B a t-elle accès ? S'il y en a plusieurs, donner pour chacune un moyen d'accès.
  3. Mêmes questions, mais en se plaçant dans Test.
  4. Modifier les méthodes x() de A et de B pour qu'elles soient static. Qu'est ce que cela change aux réponses des deux questions précédentes? Que penser des warnings indiqués à la compilation?
  5. Modifier maintenant le code des classes pour que les x dans A et B ne soient plus des méthodes mais des champs (valant toujours respectivement 3 et 4). Qu'est ce que cela change aux réponses des questions précédentes?

Exercice 4 - Surcharge, redéfinition, appel de méthode

Dans les exemples de classes suivantes, et si possible sans l'aide d'eclipse ni du compilateur, au moins dans un premier temps :
  • Dire où se trouvent les erreurs de compilation.
  • Expliquer ces erreurs.
  • Retirer les méthodes qui provoquent ces erreurs.
  • Indiquer où se trouvent les surcharges et les redéfinitions.
  • Indiquer les méthodes appellées.