/**
* The HelloWorldApp class implements an application that
* simply prints "Hello World!" to standard output.
*/
class HelloWorldApp {
public static void main(String[] args) {
System.out.println("Hello World!"); // Display the string.
}
}
Compilé en un langage intermédiaire unique (bytecode) puis interprété: “write once, run everywhere”.
int[] array_of_int; // équivalent à : int array_of_int[];
int rgb[][][];
array_of_int = new int[42];
array_of_int[0] = 3;
rgb = new int[256][256][256];
int[] primes = {1, 2, 3, 5, 7, 7 + 4};
int length = array_of_int.length;//length == 42
int integer = array_of_int[0];//integer == 3
Ecrivez une classe ArgumentsApp qui affiche à l’écran les arguments passés à l’exécutable. Si aucun argument n’est passé, un message avertit l’utilisateur.
Bien sûr, vous utiliserez le paramètre obligatoire args de main, qui est de type String[] (tableau de chaînes de caractères).
public static void main (String[] args) {
}
Tout ça ressemble au C. Mais en y regardant de plus près, certains détails laissent penser que Java génère un monde un peu différent, peuplé d’objets:
Dans ce petit exemple introductif, on comprend qu’on va décrire les tâches de la machine plus seulement comme une liste d’instructions, mais comme un système dynamique d’objets qui inter-agissent.
A l’exécution, sont crées en mémoire un ensemble d’objets. Chaque objet possède un état (qui peut changer) et des opérations qu’il sait réaliser. Les objets inter-agissent en s’adressant des requêtes les uns aux autres sur le mode “je te demande de faire telle opération”.
Le programmeur va définir les caractéristiques d’une famille d’objets en écrivant une classe.
La classe a
Copiez et compilez.
/** Classe modelisant un interrupteur à bascule. */
class Interrupteur {
/** booleen indiquant l'etat de l'interrupteur */
boolean estEnMarche = false;
/** Methode basculant l'état de l'interrupteur. */
void basculer() {
estEnMarche = (!estEnMarche);
}
}
Attention, cette classe n’est pas exécutable, car elle ne contient pas de main, point d’entrée obligatoire de toute classe exécutable.
Un objet est manipulé via une variable dont le type porte le nom de sa classe. Cette variable contient une référence vers la zone mémoire allouée pour l’objet.
//déclaration d'une référence (aucun objet n'est créé)
Interrupteur unInterrupteur;
Pour créer en mémoire un nouvel objet (= instance), on utilise l’opérateur new, suivi de l’appel à une méthode portant le nom de la classe et appelée constructeur. Si aucun constructeur n’est écrit par le programmeur, celui-ci est automatiquement créé à la compilation.
//création de l'objet, référencé par la variable unInterrupteur
unInterrupteur = new Interrupteur();
Les champs d’une classe ont tous une valeur par défaut:
NB: Seulement les champs, pas les variables locales.
La première fois que la classe Interrupteur est impliquée dans l’éxécution du programme (ex. un objet de type Interrupteur est créé), la machine virtuelle charge Interrupteur.class en mémoire.
Lorsque l’on crée un nouvel objet de type Interrupteur, suffisamment d’espace mémoire est alloué et mis à zéro (estEnMarche contient sa valeur par défaut: false).
Enfin, les champs sont initalisés dans l’ordre de déclaration (on affecte false à estEnMarche, ce qui est inutile, mais rend le code plus lisible), avant que le constructeur (ici, par défaut) soit appelé.
Une fois qu’un objet est créé, un objet tiers (= client) peut lui envoyer des requêtes (= message), c’est-à-dire
unInterrupteur.estEnMarche = true;
System.out.println( "est sur ON ?" + unInterrupteur.estEnMarche );
unInterrupteur.basculer(); //je lui demande de changer d'état
System.out.println( "est sur ON ?" + unInterrupteur.estEnMarche );
/** Classe testant l'interrupteur à bascule. */
class InterrupteurTest {
public static void main(String[] args) {
Interrupteur i = new Interrupteur();
//TODO
}
}
Comparez ce que font ces deux blocs (dans un fichier DemoAffectation.java).
boolean b1 = false;
boolean b2 = b1;
b2 = !b2;
System.out.println( b1 );
Interrupteur i1 = new Interrupteur();
Interrupteur i2 = i1;
i2.basculer();
System.out.println( i1.estEnMarche );