Manipulation 1

Dans cette séance nous allons découvrir comment compiler et exécuter un fichier de code Java, et effectuer des manipulations basiques sur les objets. Tout d’abord veuillez recopier le code source suivant dans un fichier nommé Main.java. Placez ce fichier dans un répertoire vide créé pour l’occasion (exemple: pg220/m1).

// Définition de classe, obligatoire dans chaque fichier Java.
// Le nom de la classe doit être égal au nom du fichier.
class Main {

	// Point d'entrée des programmes Java. Le tableau de String args correspond
	// aux paramètres par la ligne de commande.
	public static void main(String[] args) {
		//Déclaration d'un objet s de type String.
		String s;
		// Création de l'objet s (abordé dans la prochaine séance).
		s = new String("Hello World!");
		// Affichage de l'objet s.
		System.out.println(s);
	}

}

Pour compiler ce fichier il faut faire appel au compilateur Java : javac. Vous pouvez compiler le fichier avec la commande suivante : javac Main.java. Si tout se passe bien, vous devriez obtenir un fichier nommé Main.class. Il contient le code source précédent sous forme de bytecode. Pour lancer le fichier, il faut cette fois passer par l’intermédiaire de la machine virtuelle Java, avec la commande suivante java Main. Normalement, l’exécution du programme devrait afficher la chaîne Hello World! sur votre console.

Utilisation de méthodes

Cherchez dans la javadoc de la classe String la méthode qui permet de mettre une chaîne en majuscules. Comment fonctionne cette méthode? Modifiez le programme précédent pour construire une chaîne en majuscule à partir de s. De la même manière, trouvez les méthodes qui permettent de:

  • Convertir une chaîne en minuscule
  • Extraire une sous-chaîne à partir d’un chaîne
  • Vérifier si une chaîne commence par une chaîne bien particulière
  • Calculer la longueur d’une chaîne
  • Concaténer deux chaînes

Testez toutes ces méthodes. Les méthodes qui renvoient des String modifient elles l’objet sur lequel on les appelle ou travaillent elles sur des copies?

  • toUpperCase()
  • toLowerCase()
  • substring(int) et substring(int, int)
  • startsWith(String) et startsWith(String, int)
  • length()
  • concat(String)

Les méthodes qui renvoient des String travaillent en général sur des copies comme le montre le code suivant :

String s1 = new String("test");
String s2 = s1.toUpperCase();
System.out.println(s1);
System.out.println(s2);

Identité et égalité

Comme nous l’avons vu, toutes les variables en Java ne sont pas forcément des objets, elles peuvent aussi être des valeurs primitives (comme int ou boolean). L’opérateur == permet de tester si :

  • deux valeurs primitives sont égales
  • deux objets ont la même identité

Testez le code suivant:

int i1 = 12;
int i2 = 12;
System.out.println(i1 == i2);

Que se passe t’il?

Le programme affiche true car les deux variables sont de type primitif et qu’elles ont la même valeur.

Testez cette fois l’opérateur == avec deux valeurs qui ne sont pas primitives, comme dans le code suivant.

String s1 = new String("test");
String s2 = new String("test");
System.out.println(s1 == s2);

Que se passe t’il? Est-ce que cela vous paraît normal? Trouvez la méthode qui permet de savoir si les deux chaînes sont égales.

Le programme affiche d’abord false car les deux variables sont des objets et ils n’ont pas la même identité. La méthode equals() permet de savoir si les deux chaînes sont égales comme le montre le code suivant:

String s1 = new String("test");
String s2 = new String("test");
System.out.println(s1.equals(s2));

Création d’une classe

Essayez maintenant de faire une classe class Point qui comporte deux attributs int x et int y, ainsi qu’un constructeur et des accesseurs/mutateurs pour tous les attributs. Ajouter dans cette classe un point d’entrée qui crée un point et affiche ses coordonnées.

class Point {
		int x;
		int y;

		Point(int x, int y) {
			this.x = x;
			this.y = y;
		}

		int getX() { return x; }
		void setX(int x)  { this.x = x; }
		int getY() { return y; }
		void setY(int y)  { this.y = y; }

		public static void main(String[] args) {
			Point p = new Point(5, 5);
			System.out.println(p.getX());
			System.out.println(p.getY());
		}
}

Question bonus

Au fait maintenant que vous maitrisez les classes et les objets, à votre avis, quels types d’éléments Java sont out et println dans System.out.println()

System est une classe. De ce fait out est un attribut statique et println() une méthode normale de la classe de out (en l’occurence PrintStream).