Les bases du langage Java Les données Les primitives Les concepteurs de Java ont doté ce langage d’une série d’éléments particuliers appelés primitives. Ces éléments ressemble à des objets, mais ne sont pas des objets ! Ils sont créés de façon différente, et sont également manipulés en mémoire de façon différente. Cependant il peuvent être enveloppés dans des objets spécialement conçu à cet effet, et appelés enveloppeurs (wrappers). Table des primitives primitive étendue taille enveloppeur char 0 à 65 535 16 bits Character byte -128 à +127 8 bits Byte short -32 768 à +32 767 16 bits Short - 2 147 483 648 à +2 147 483 647 32 bits Integer long de –263 à +263-1 64 bits Long float de 1.4E-45 à 3.40282347E38 32 bits Float double de 4.9E-324 à 1.7976931348623157E308 64 bits Double boolean true ou false 1 bit Boolean 0 bit Void int void précision quelconque BigInteger précision quelconque BigDecimal Les classes BigInteger et BigDecimal sont utilisés pour représenter respectivement des valeurs entières et décimales de précision quelconque. Il n’existe pas de primitives équivalente. Le type char sert à représenter les caractères, conformément au standard UNICODE. Il est le seul type numérique non signé ! Remarquons que le type boolean n’est pas un type numérique. Initialisation des primitives Les primitives doivent être déclarées et initialisées avant d’être utilisées. Une primitive non initialisée produira une erreur à la compilation : « Variable may not have been initialized ». Remarquons que les primitives, lorsqu’elles sont employée comme membre de classe, possède des valeurs par défaut. Il n’est donc pas nécessaire de les initialiser ! primitive valeur par défaut false ‘\u0000’ (null) (byte)0 (short)0 0 0L 0.0f 0.0d boolean char byte short int long float double 1 Les valeurs littérales primitive char int long float double boolean syntaxe ‘x’ 5 (décimal), 05 (octal), 0x5 (hexadécimal) 5L, 05L, 0x5L 5.5f ou 5f ou 5.5E5f 5.5 ou 5.5d ou 5.5E5d ou 5.5E5 false ou true Casting sur les primitives Les constantes Java ne comporte pas de constantes à proprement parler. Il est cependant possible de simuler l’utilisation de constantes à l’aide du mot clé final. Une variable déclarée final ne peut plus être modifiée une fois qu’elle a été initialisée. Lorsqu’un élément est déclaré final, le compilateur est à même d’optimiser le code compilé afin d’améliorer sa vitesse d’exécution. Remarquons que les variables déclarées final peuvent être initialisées lors de l’exécution et non seulement lors de leur déclaration ! Les chaînes de caractères En Java, les chaînes de caractères sont des objets. Ce sont des instances de la classe String. Depuis les premiers langages de programmation, les chaînes de caractères ont posé des problèmes ! En effet, s’il est facile de définir différents types numériques de format fixe, les chaînes de caractères ne peuvent pas être représentées dans un format fixe car leur longueur peut varier de 0 à un nombre quelconque de caractères. Java utilise une approche particulière. Les chaînes de caractères peuvent être initialisées à une valeur quelconque. Leur longueur est choisie en fonction de leur valeur d’initialisation. En revanche, leur contenu ne peut plus être modifié. En effet, la longueur des chaînes étant assurée de ne jamais varier, leur utilisation est très efficace en termes de performances. Par ailleurs, il faut noter que Java dispose d’une autre classe, appelée StringBuffer, qui permet de gérer des chaînes dynamiques. Remarquons qu’il est également possible de traiter des instances de la classe String comme des chaînes dynamiques, sous certaines précautions. Chaînes littérales Les chaînes de caractères existent aussi sous forme littérale. Il suffit de placer la chaîne entre guillemets comme dans l’exemple suivant : "Bonjour maman !" Les chaînes littérales peuvent contenir des caractères spéciaux issues du type char : caractères spéciaux \b \f \n \r \t \\ \’ \" \012 \uxxxx description backspace saut de page saut de ligne retour chariot tabulation horizontale \ ‘ " caractère en code octal caractère en code héxadécimal (unicode) 2 Opérateur d’affectation opérateur d’affectation symbole = –= += description affectation soustraction et affectation addition et affectation arité 2 2 2 exemple x=2 x–= 2 x += 2 arité 2 2 2 2 exemple y–x 3*x 4/2 5%2 On dispose du raccourci : x = y = z = 2. Opérateurs arithmétiques à deux opérandes opérateurs arithmétiques à deux opérandes symbole – * / % description soustraction multiplication division modulo (reste de la division) Il n’existe pas en Java d’opérateur d’exponentiation. Pour effectuer une exponentiation, il convient d’utiliser la fonction pow(double a, double b) de la classe java.lang.Math. La division des entiers fournit un résultat tronqué et non arrondi. Opérateurs à un opérande opérateurs à un opérande description opposé pré-incrémentation post-incrémentation pré-décrémentation post-décrémentation arité 1 1 1 1 1 exemple –x ++x x++ --x x-- symbole == < > <= >= != description équivalent plus petit que plus grand que plus petit ou égal plus grand ou égal non équivalent arité 2 2 2 2 2 2 exemple x == 0 x<2 x>2 x <= 3 x >= 3 a != b symbole && || ! description et ou non arité 2 2 1 exemple a && b a || b !a Opérateurs relationnels opérateurs relationnels symbole – ++ ++ --- Opérateurs logiques opérateurs logiques L’évaluation des expressions logiques est stoppées dès lors que le résultat est déterminé. L’évaluation partielle optimise le code mais peut avoir des effets indésirables. Une manière de forcer l’évaluation consiste à utiliser les opérateurs d’arithmétique binaire. 3 Opérateurs d’arithmétique binaire Les opérateurs d’arithmétiques binaires agissent au niveau des bits de données, sans tenir comte de ce qu’ils représentent. opérateurs d’arithmétique binaire symbole & | ^ ~ << >> >>> description et ou ou exclusif non décalage à gauche décalage à droite décalage à droite sans extension du signe arité 2 2 2 1 2 2 exemple a&b a|b a^ b ~a a << 2 b >> 2 2 b >>> 2 Rappelons que le bit de signe (des types entiers) est le bit de poids fort. On peut utiliser les opérateurs d’arithmétique binaire avec des valeurs logiques, qui sont des valeurs sur 1 bit. L’intérêt de cette possibilité est que, s’agissant d’opérateurs arithmétiques, ils sont toujours évalués. L’opérateur à trois opérandes opérateur à trois opérandes symbole ?: description condition ? vrai : faux arité 3 exemple y<5?4*y:2*y Si condition est vrai, alors on retourne l’évaluation de l’expression vrai, sinon on retourne celle de faux. Priorité des opérateurs Les opérateurs par ordre de préséance décroissante sont les suivants : Ordre d’évaluation De gauche à droite Opérateurs Appel de méthode . [] () - + ++ -- ! ~ (cast) new */% +<< >> >>> < > <= >= == != & ^ | && || ?: = op= , 4 Fichier Lecture.java /* * Lecture.java (MODE CONSOLE) * Ce programme fait la lecture au clavier du nom et de l'âge de l'usager * pour ensuite afficher ces informations * Date : août 2003 Pour importer la librairie qui contient les classes */ nécessaires à la lecture import java.io.*; public class Lecture { public static void main (String args[]) throws IOException{ int age; String nom; String ageLu; Définition d’un tampon de lecture associé au clavier BufferedReader clavier = new BufferedReader( new InputStreamReader(System.in)); // LECTURE DES DONNÉES System.out.print("\nVotre nom : "); nom = clavier.readLine( ); Lire la ligne de type String et la placer dans la variable nom System.out.print("\nVotre age : "); ageLu = clavier.readLine( ); Extraire l’entier de la ligne lue de type String et le placer dans la variable age age = Integer.parseInt(ageLu); // AFFICHAGE DES MESSAGES System.out.println("\nBonjour! " + nom + ", vous êtes donc âgé(e) de "+ age + " ans "); } } System.out.println("Puissiez-vous vivre encore longtemps!"); Résultats obtenus : Votre nom : Marc_André Votre age : 19 Bonjour! Marc_André, vous êtes donc âgé(e) de 19 ans Puissiez-vous vivre encore longtemps! 5