:: Enseignements :: IMAC :: IMAC2 :: IMAC2 2011-2012 :: Programmation Java ::
[LOGO]

Premiers pas en Java


Nous réalisons quelques programmes simples et commençons à écrire des classes et à les instantier.

Préliminaires

Le code Java est organisé en classes. Il est conseillé de les nommer en notation dromadaire en commençant par une majuscule (ex: MaClasseJava et non ma_classe_java). Chaque classe est dans un fichier séparé portant le même nom avec pour suffixe .java (ex: MaClasseJava.java).

Pour pouvoir être exécuté, le code source d'une classe doit être transformé en bytecode. On utile pour cela le compilateur javac (ex: javac MaClasseJava.java). Le compilateur produit un fichier bytecode de suffixe .class.

La méthode statique main d'une classe en bytecode peut être exécutée par la machine virtuelle Java par la commande java.

Lorsque l'on utilise une classe inconnue de l'API, il est fortement conseillé de consulter la page de la Javadoc qui lui est consacrée. Des guides et tutoriaux plus ou moins intéressants sont également accessibles avec la documentation Java.

Exercice 1 - Un 1er programme Java : Hello Groland

Écrire avec un éditeur de texte de son choix la classe HelloGroland dont le code suit dans un fichier de nom HelloGroland.java :
public class HelloGroland {
	public static void main(String[] args) {
		System.out.println("Hello Groland");
	}
}
	
Compiler ensuite la classe avec javac HelloGroland.java : un fichier HelloGroland.class est produit. Executer ensuite le programme avec la commande java HelloGroland (pas besoin de spécifier le suffixe .class).

Exercice 2 - Affichage des arguments de la ligne de commande

La méthode de signature public static void main(String[] args) doit être présente dans toute classe que l'on souhaite exécuter. Elle utilise pour argument un tableau de chaînes de caractères. Comme pour tout tableau en Java, le 1er élément est indicé par 0 (args[0]) et il est possible d'obtenir la taille du tableau par le champ length (args.length).

On souhaite écrire programme PrintArgs écrivant chacun de ses arguments sur la sortie standard (System.out). Voici un exemple d'utilisation :
$ java PrintArgs bonjour le monde
bonjour
le
monde
		
  • Afficher dans un premier temps uniquement le 1er argument en faisant attention de gérer le cas où il n'existerait pas
  • Utiliser une boucle for avec incrémentation d'un entier pour l'affichage de tous les éléments
  • Utiliser une boucle foreach (for (String arg: args)) pour l'affichage des éléments

Exercice 3 - Une calculette simple avec un Scanner

On commence à écrire la calculatrice dont le code suit avec l'aide de la classe java.util.Scanner. Cette classe permet de découper un flux en éléments élementaires que l'on récupère un par un : ici on récupère des entiers avec la méthode nextInt().
import java.util.Scanner;

public class Calc {
	public static void main(String[] args) {
		Scanner scanner;
		scanner=new Scanner(System.in);
		int value;
		value=scanner.nextInt();
		// completer ici
	}
}
		

    >
  1. Indiquer dans le programme où sont les variables et quel est leur type associé.
  2. Recopier le programme précédent et le compléter pour qu'il affiche le nombre saisi par l'utilisateur.
  3. Modifier le programme pour déclarer et initialiser les variables en une seule ligne.
  4. Expliquer la ligne import java.util.Scanner
  5. Modifier le programme pour qu'il demande deux entiers et affiche la somme de ceux-ci.
  6. Afficher en plus de la somme, la différence, le produit, le quotien et le reste.

Exercice 4 - Un bonjour personnalisé

Écrire un programme demandant à l'utilisateur son nom et l'affichant en le préfixant par "Bonjour" (le tout sur une seule ligne). On propose deux versions :
  • En utilisant la méthode System.out.print(String)
  • En utilisant l'opérateur + de concaténation de caractères

Exercice 5 - Définition d'un livre

Le but de cet exercice est de définir des objets Book. Nous allons pour cela créer la classe Book avec les attributs suivants :
  • le titre (une chaîne de caractère);
  • l'auteur (une chaîne de caractère);
  • le numéro ISBN (une chaîne de caractère);
  • et le prix (un nombre réel).

Écrire une classe Book dont les attributs sont tout ce qui caractérise un livre. Dans la classe Book, mettre un constructeur public Book(String title, String author, String isbn, double price) servant à initialiser les attributs des instances de la classe Book. Comment faire pour construire un objet livre (une instance de la classe Book) ?

Exercice 6 - Affichage d'un livre

On aimerait pouvoir afficher les caractéristiques d'un livre, par le code Java suivant :
Book book=...
System.out.println(book);
		

Tester l'affichage d'un livre sur la sortie standard. A quoi correspondent les informations affichées ?

La méthode de signature public String toString() permet de retourner une chaîne personnalisée pour représenter un livre. Écrire cette méthode pour afficher le titre, l'auteur, l'ISBN et le prix d'un livre, par exemple sous cette forme :
Title : Concepts fondamentaux de l'informatique
Author : Alfred Aho
ISBN : 2-7117-8689-7
Price : 40.0

Exercice 7 - Égalité de livres

Pour tester l'égalité deux types primitifs, on peut utiliser == :
int a = 2;
int b = 2;
int c = 3;
System.out.println(a==b); //affiche true
System.out.println(a==c); //affiche false
		
Cependant, dès qu'on utilise des objets, des problèmes apparaissent. Qu'affiche le code suivant et pourquoi ?
Book b1 = new Book("L'écume des jours", "Boris Vian", "AEZD01", 9.99);
Book b2 = new Book("L'écume des jours", "Boris Vian", "AEZD01", 9.99);
Book b3 = b1;
System.out.println(b1==b2); 
System.out.println(b1==b3); 
		
Pour résoudre ce problème en Java, il suffit d'implanter une méthode de signature public boolean equals(Object o) dans la classe Book, qui retourne true ssi :
  • o est une instance de Book (utiliser instanceof)
  • les champs de o sont égaux (selon vos critères) à ceux de l'instance de Book appelant la méthode

Écrire cette méthode, afin que le code suivant n'affiche que des true :
Book b1 = new Book("L'écume des jours", "Boris Vian", "AEZD01", 9.99);
Book b2 = new Book("L'écume des jours", "Boris Vian", "AEZD01", 9.99);
Book b3 = b1;
System.out.println(b1.equals(b2)); 
System.out.println(b1.equals(b3)); 
		

Exercice 8 - Une bibliothèque

Une bibliothèque contient des livres. Nous représenterons les bibliothèques par des objets instances de la classe Library qu'il nous faudra écrire. On trouvera en attribut de la classe un tableau de références sur des instances de Book.
On définira dans la classe Library :
  • un attribut permettant de stocker un nombre maximum de livre ainsi qu'un constructeur, qui prend en paramètre le nombre maximum de livres que peut contenir la bibliothèque (sa capacité)
  • une méthode int capacity() retournant la capacité de la bibliothèque
  • une méthode void add(Book b) qui ajoute un livre dans la bibliothèque. Que doit-on faire si la bibliothèque est pleine ?
  • une méthode int size() retournant le nombre de livres contenus dans la bibliothèque
  • une méthode boolean contains(Book book), indiquant si un livre est contenu ou non dans la bibliothèque
  • une méthode String toString(), qui affiche l'ensemble des livres contenus dans la bibliothèque.

Regarder dans la javadoc la classe StringBuilder. L'utiliser dans les méthodes toString() de Book et Library.
A quoi sert l'annotation @java.lang.Override ? Comment peut-on l'utiliser sur la méthode toString() ?