Programmation Par Objets et Langage Java
Partie II. Introduction à Java

Najib Tounsi

Table des matières

  1. Table des matières
  2. Langage de programmation avec des TADs.
  3. Exemple de la classe Pile
    1. La classe Pile (source complet, documentation associée )
  4. Programme Java qui utilise la classe Pile
  5. A noter
  6. Spécificités de Java autres que la notion de classe.
  7. Hello World
  8. Un programme plus complet (avec E/S de données)
  9. Un programme plus complet (exécution)
  10. Conversions entre entiers et réels
  11. Typage fort
  12. Les types de données en Java
  13. Les types de données en Java (suite)
  14. Les types de données en Java (suite)
  15. Les types primitifs
  16. Les types primitifs (suite)
  17. Les constantes numériques
  18. Les constantes numériques (suites)
  19. Les constantes caractères
  20. Les constantes chaînes
  21. Conversions et promotions
  22. Conversions et promotions (suites)
  23. Conversions et promotions (suites)
  24. Conversions et promotions (suites)
  25. Les opérateurs Java
  26. Les tableaux en Java (déclaration)
  27. Les tableaux en Java (création et initialisation)
  28. Les tableaux en Java (création et initialisation)
  29. Copie de tableaux
  30. Tableaux d'objets non primitifs
  31. Création de tableau par new
  32. Les objets String ...
  33. Les objets String
  34. Opérations sur les chaînes: length(), charAt()
  35. Opérations sur les chaînes:  + et concat()
  36. Recherche dans une chaîne: indexOf()
  37. Extraction de sous chaîne: substring()
  38. Les classes StringBuffer et StringBuilder
  39. Conversions par Wrapper
  40. Utilitaires des Wrappers
  41. Les instructions de Java.
  42. Expressions Java
  43. Instructions Java
  44. Bloc d'instructions
  45. Structures de contrôle
  46. Instruction if-else
  47. Instruction  switch
  48. Instructions while et do-while
  49. Instructions while et do-while
  50. Instruction for
  51. Instructions de traitement d'exception try-catch-finally
  52. Rupture de contrôle (instructions de branchement)
  53. Instruction break
  54. Instruction break(suite)
  55. L'instruction continue
  56. L'instruction return
  57. Compilation et exécution d'un programme Java
  58. La machine virtuelle Java
  59. Write once run everywhere
  60. Environnement de développement intégrés Vs. mode commande
  61. Surcharge de fonction
  62. Paramètres de fonctions
  63. Gestion des exceptions
  64. Les APIs Java
  65. Les APIs Java
  66. Les APIs Java
  67. Exemples de packages (java.lang)
  68. Package java.util
  69. Package java.io
  70. Plateforme Java
  71. That's all folks... ;-)

Langage de programmation avec des TADs.

Le langage se prête bien à la programmation avec les types abstraits de données.

Exemple de la classe Pile

La classe Pile (source complet, documentation associée )

public class Pile {

//
// Déclarations des attributs de la pile
//
static final int MAX = 8;
char[] t;
int top;

//
// Programmation des opérations (méthodes) de la pile
//

public Pile(){
// Initialise une pile vide
t = new char[MAX];
top = -1;
}

public void empiler(char c){
// Empile le caractère donné
if (!estPleine())
t[++top] = c;
else
System.out.println("Pile pleine");
}

public char sommet(){
// Retourne le caractère au sommet de la pile
if (!estVide())
return t[top];
else {
System.out.println("Pile vide Sommet");
return '\0';
}
}

public void depiler(){
// décapite la pile (retire le sommet )
if (!estVide())
top--;
else
System.out.println("Pile vide Depiler");
}

public boolean estVide(){
// Teste si la pile est vide
return (top < 0);
}

public boolean estPleine()
{
// teste si la pile est pleine
return (top >= (MAX - 1));
}
}; // Fin class Pile

A noter:

  1. Aspects présentation
    • Une classe est un bloc dans lequel sont déclarée des données et des fonctions qui les utilisent. Les spécifications aussi, sous forme de commentaires ici.
    • C'est donc une implantation d'un TAD, i.e. choix de représentation (tableau t + indice sommet de pile top) de la pile et programmation des méthodes.
    • Une seule unité de compilation
    • La syntaxe des instructions est proche de C.
  2. Ici on a tout mis dans un même fichier. Avec les interfaces Java, on peut séparer en deux partie: Spécification abstraites  &  Représentation. (voir plus tard.)
    • Deux unités de compilation.


Remarque
: Dans ce dernier cas, il est possible de définir plusieurs implantations (représentations)  pour un même TAD  (spécification abstraite).

Programme Java qui utilise la classe Pile

Un programme principal (classe avec fonction main.)

Lire un mot et imprimer son image miroir.

public class TestPile { 
static public void main(String args[]){
// Imprime l'mage miroire d'un mot

char c;
Pile p = new Pile();

// On lit les lettres et on les empile
while ((c=Support.readChar()) != '#') {
p.empiler (c) ;
if( p.estPleine()) break;
}

// On depile les lettres et on les imprime
while (!p.estVide()) {
c = p.sommet();
System.out.println (c);
p.depiler();
}
}
}

A noter

Spécificités de Java autres que la notion de classe.

Programming in the small...

Dans la suite de ce chapitre, on va s'intéresser  à l'aspect programmation procédurale du langage Java

Hello World

Programme main dans une classe HelloWorld (fichier HelloWorld.java)

// Mon premier programme Java
class HelloWorld {
static public void main(String args[]){
System.out.println("Hello, World");
}
}

Un programme plus complet (avec E/S de données)

Programme qui lit un nom et une température en Celcius, convertit cette dernière en Fahrenait et affiche bonjour avec cette nouvelle valeur. (source Bonjour.java)

class Bonjour {
static public void main(String args[]) {
int c;
String nom;
double f;

// Partie lecture de données
System.out.print("Quelle est votre nom?: ");
nom = Support.readString();
System.out.print("Quelle t° fait-il aujourd'hui?: ");
c = Support.readInt();

// Partie calcul
f = 9./5 * c + 32;

// Partie sortie des résultats
System.out.println("Bonjour " + nom);
System.out.print("Il faut " + c + "° Celsius,");
System.out.println(" soit "+ f + "° Fahrenait.");
}
}

Un programme plus complet (exécution)

On compile et on exécute  (en mode ligne commande)

$ javac Bonjour.java
$ java Bonjour
Quelle est votre nom?: Ali
Quelle t° fait-il aujourd'hui?: 17
Bonjour Ali
Il faut 17° Celcius, soit 62.6° Fahrenait.
$ _

Conversions entre entiers et réels

  int i;
double d;
i = 1.23; // Erreur: Javac trouve un double là où il faut un
// int. En effet, 1.23 est un littéral réel double.
d = 2; // OK 2.0, conversion implicite
i = 3; // OK
d = 1.23; // OK
i = d; // Idem. Erreur: risque de perte de précision.
// d peut contenir un réel très précis.
d = i; // OK 3.0, conversion implicite aussi.
i = (int) -1.23; // OK valeur tronquée i = -1.
i = (int) d; // idem, conversion (troncature) forcée (cast)

Typage fort

Les types de données en Java

Il ne convient pas toujours de parler de type de données pour un langage de classes. Néanmoins, il convient de distinguer, pour des raisons de performance, le traitement des données élémentaires des autres objets.  Il y a deux genres de variables en Java:

Les types de données en Java (suite)

référence tableau

Les types de données en Java (suite)

Les types primitifs

Les types primitifs (suite)

Les constantes numériques


boolean result = true;
char capitalC = 'C';
byte b = 100;
short s = 10_000;
int i = 20;
long l = 5_000_000_000L;
int decVal = 26;
int hexVal = 0x1a;
int binVal = 0b11010;

Les constantes numériques (suites)

double d1 = 123.4
double d2 = 1.234e2; // même valeur en notation scientifique
float f1 = 123.4f;
float f = 1234;    // OK. Conversion de int vers float.
float f = 123.4; // erreur. Perte de précision.
//123.4 contstante double précision.

Les constantes caractères

'a', '%', '\t', '\\', '\'', '\u03a9', '\uFFFF', '\177', 'Ω', '', 'é', 'ج'

Les constantes chaînes

""                      // chaîne vide
"\"" // chaîne avec un seul car. "
"This is a string" // chaîne avec 16 caractères
"This is a " + // une expression constante String,
"two-line string" // formée de deux littéraux

Conversions et promotions

Conversions et promotions (suites)

long i = 25;    // int vers long OK
int i = 1234567890;
float f = i;          // int vers float OK.
  // ici f vaut 1.23456794E9 et (int)f vaut 1234567936

Conversions et promotions (suites)

String s1 = "Douze = " + 12; // s1 = "Douze = 12"
String s2 = "" + 12;     // s2 = "12"

String s2 = String.valueOf(i);

int i;
double d;
String s3 = Integer.toString(i);
String s4 = Double.toString(d);

Conversions et promotions (suites)

Integer I = new Integer(45);  // I = 45  // Boxing de 45
int i = I.intValue (); // i est aussi 45 // Unboxing de I

Les opérateurs Java


(Extraits de Java Tutorial http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op1.html)
=       Simple assignment operator
+       Additive operator (also used for String concatenation)
- Subtraction operator
* Multiplication operator
/ Division operator
% Remainder operator
+       Unary plus operator; indicates positive value
(numbers are positive without this, however)
- Unary minus operator; negates an expression
++ Increment operator; increments a value by 1
-- Decrement operator; decrements a value by 1
! Logical complement operator; inverts the value of a boolean
==      Equal to
!= Not equal to
> Greater than
>= Greater than or equal to
< Less than
<= Less than or equal to
&&      Conditional-AND
|| Conditional-OR
?: Ternary (shorthand for if-then-else statement)
instanceof      Compares an object to a specified type
~       Unary bitwise complement
<< Signed left shift
>> Signed right shift
>>> Unsigned right shift
& Bitwise AND
^ Bitwise exclusive OR
| Bitwise inclusive

Les tableaux en Java (déclaration)


Un tableau Java

(extrait de http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html)
int ai[];         // tableau d'entiers. (Vecteur)
short[] as, ab; // 2 tableau de short.
short[][] matrice;     // tableau deux dimension de short.
int[][][] cube; // tableau trois dimension de int.
int[] ai, mi [];     // Notation mixte. Equivalent à
int ai[], mi [][];
// Equivalent aussi à
int [] ai;
int [][] mi;

Les tableaux en Java (création et initialisation)

int[] ai = new int[5];   // ai tableau de 5 entiers. 
int[] ai;          //  ai est ici juste une référence
ai = new int[5]; // ai désigne un tableau de 5 entiers.

Reference tebleau null
reference tableau crée
Référence tableau avant et après new

ai[0] = 2;   // premier élément est 2
ai[1] = 3; // deuxième élément est 3
ai[2] = -1; // etc.
System.out.println(ai.length);   // imprime 5
 int m[][] = new int [2][3];  // 2 lignes et 3 colonnes 
m[0][0] = 11;
m[1][2] = 23;
//etc.
System.out.println(m.length); // 2 (nombre de lignes)
System.out.println(m[1].length); // 3 (nombre de colonnes)

Les tableaux en Java (création et initialisation)

int[] factorial = { 1, 1, 2, 6, 24, 120, 720, 5040 };

char aoc[] = { 'c', 'e', ' ', 'n', '\'', 'e', 's', 't',
  ' ', 'p', 'a', 's', ' ', 'u', 'n', 'e',
' ', 'c', 'h', 'a', 'i', 'n', 'e'};

String[] aos = { "array", "of", "String", };
int[][] m = {
{1, 2, 3)},
{4, 5, 6}
}; // matrice à deux lignes et 3 colonnes.

String[][] noms = {
{"M. ", "Mme ", "Mlle"},
{"BenAhmed", "BenAli"}
}; // ici il y a 2 lignes, mais de longueur différentes

Copie de tableaux


String [] noms = {"Ali", "Amina"};
String [] mesNoms = new String [3];
mesNoms = noms;
public static void arraycopy( Object src, int srcPos,
Object dest, int destPos, int length)
copie de tableau

Tableaux d'objets non primitifs

tableau de références
 int[][] m = new int[2][];  // Creation deux références lignes	
// m[0] et m[1].
m[0] = new int[3]; // Création trois éléments entiers en ligne 1
m[1] = new int[2]; // Création deux éléments entiers en ligne 2
// Tous initialisés à nulles
String[] s = new String[3];  // trois éléments tous egaux à null.
s[1] = new String("toto"); // le deuxième éléments est une
// référence à "toto"
Point [] p = new Point [10];    // vecteur p de 10 Point
for (int i=0; i<10; i++)
p[i] = new Point(); // instanciation de chaque Point

Création de tableau par new

new Type [] {liste d'objets};

String s [] = new String [] {"abc", "def"};
String s[] = new String[2];
s[0] = "abc";
s[1] = "def";
int t [] = new int[] { 11, 23, 45 };
Point p [] = {new Point(1,2), new Point(2,3)}

Les objets String ...

String salut = "Bonjour";
 String salut = new String ("Bonjour");
char [] bonjour = {'b', 'o', 'n', 'j', 'o', 'u', 'r'};
String salut = bonjour; // erreur compilation: incompatible types
char [] bonjour = {'b', 'o', 'n', 'j', 'o', 'u', 'r'};
String salut = new String (bonjour); // :-)

Les objets String

String s = "Bonjour";
s = s + " Ali"; // nouvelle chaîne "Bonjour Ali" désignée par s.

Opérations sur les chaînes: length(), charAt()

String palindrome = "Dot saw I was Tod";
int len = palindrome.length();             // len vaut  17.
char c;
String salut ="Bonjour";
c = salut.charAt(2); // c devient 'n'

Opérations sur les chaînes:  + et concat()

String nom = " Ali";
String s = salut.concat(nom). // s est "Bonjour Ali"
"bon".concat("jour") // retourne la chaîne "bonjour"
salut + " Ali"
salut + " " + "Ali"
"La racine de 2 est " + Math.sqrt(2)
// donne "La racine de 2 est 1.4142135623730951"
3 + 4 + " chats"               // est la chaîne "7 chats"
"chats " + 4 + 3 // est la chaine "chats 43"

Recherche dans une chaîne: indexOf()

Méthodes indexOf() et lastIndexOf(). Recherche de caractère ou sous-chaîne dans une chaîne.

 "alibaba".indexOf('b')         // retourne 3
"alibaba".indexOf('b', 4) // retourne 5
"alibaba".lastIndexOf('a') // retourne 6
"alibaba".lastIndexOf('a', 5) // retourne 4
indexOf()

Extraction de sous chaîne: substring()

Méthode substring().

 String s ="/users/me/hello.java";
int dot = s.lastIndexOf('.');
int sep = s.lastIndexOf('/');
System.out.println (s.substring(dot+1)); // donne java
System.out.println (s.substring(sep+1,dot)); // donne hello

Les classes StringBuffer et StringBuilder

 StringBuffer sb = new StringBuffer("Chat");
System.out.println(sb.append("on")); // Chaton
System.out.println(sb.insert(3,"rles")); // Charleston
System.out.println(sb.append(3.4567)); // Charleston3.4567
StringBuffer sb = new StringBuffer("Salut!");
System.out.println(sb.length() + " " + sb.capacity()); // 6 22
sb.append(" Comment ça va ?");
System.out.println(sb.length() + " " + sb.capacity()); // 23 46

Les Wrappers Java

On va donner des exemple pour la classe des entiers Integer. Les autres cas sont analogues.

Integer I = new Integer (2);
Integer J = new Integer ("23");
 System.out.println(Integer.MAX_VALUE) ;   // 2147483647
System.out.println(Integer.MIN_VALUE) ; // -2147483648 System.out.println(Integer.SIZE) ; // 32
System.out.println(Integer.TYPE) ; // int

Conversions par Wrapper

Integer I = new Integer (34);      // Integer à partir de 34
I = Integer.valueOf(34); // idem mais sans new
int i = I.intValue(); // retrouve le 34 int
Integer I;
I = new Integer ("123"); // Par constructeur
I = Integer.valueOf("123"); // ou comme ceci

int i;
i = Integer.parseInt("456"); // de String vers int
Integer I = 345;
String s = I.toString(); // s devient "345"

int i = 34;
s = String.valueOf(i); // s devient "34"
 I = 3;            // Autoboxing                   
i = I; // Unboxing

Utilitaires des Wrappers


Character.isLetter('!')		// false
Character.isLetter('ج') // true
Character.isDigit('5') // true
Character c = 'e';
c.hashCode() // vaut 101
Character.toUpperCase('e') // E

Les instructions de Java.


Expressions Java

Instructions Java


Bloc d'instructions

if (a > b) {
b++;
} else {
a--;
}
{
int i;
// ... i visible dans ce bloc
}

Structures de contrôle

Type d'instruction Mots clés
Boucle while, do-while , for
Choix d'exécution if-else, switch-case
Gestion d'Exception try-catch-finally, throw
Branchement break, continue, label:, return

Instruction if-else

 if (moyenne >= 16){
System.out.println ("Admis(e) avec félicitations");
}
System.out.println ("Admis(e)");
    moyenne = 16.5;
if (moyenne >= 17){
mention = "TB";
} else if (moyenne >= 15) {
mention = "B";
} else if (moyenne >= 13) {
mention = "AB";
} else {
mention = "P";
}
System.out.println ("Admis(e) avec mention: " + mention);
max = (a > b ? a : b);      // si (a > b)  alors a  sinon  b

Instruction  switch


switch (note) {
case 20 : case 19 : case 18 : case 17 :
System.out.println ("Mention Très Bien");
break; case 16 : case 15 :
System.out.println ("Mention Bien");
break;
case 14 : case 13 :
System.out.println ("Mention Assez Bien");
break; case 12 : default :
System.out.println (" Mention Passable\n");
break;
}
enum Taille { S, M, L, XL, XXL };
...
public static void f(Taille t) {
switch (t) {
case S:
System.out.println("Small = 1 ou 2");
break;
case M:
System.out.println("Medium = 3");
break;
case L:
System.out.println("Large = 4");
break;
case XL: case XXL:
System.out.println("eXtra Large = 5 ou 6");
break;
}
}

Instructions while et do-while

public class WhileDemo {
public static void main(String[] args) {
String copyFromMe = "Copy this string until you " +
"encounter the letter 'g', not included";
StringBuffer copyToMe = new StringBuffer();
int i = 0;
char c = copyFromMe.charAt(i);
while (c != 'g') {
copyToMe.append(c);
c = copyFromMe.charAt(++i);
}
System.out.println(copyToMe);
}
}

Instructions while et do-while

public class DoWhileDemo {
public static void main(String[] args) {
String copyFromMe = "Copy this string until you " +
"encounter the letter 'g', included.";
StringBuffer copyToMe = new StringBuffer();
int i = 0;
char c;
do {
c = copyFromMe.charAt(i++);
copyToMe.append(c);
} while (c != 'g');
System.out.println(copyToMe);
}
}

Instruction for

 int[] t = { 32, 87, 3, 589, 12, 1076, 8, 622, 127 };
for (int i = 0; i < t.length; i++) {
System.out.print(t[i] + " ");
}
System.out.println();
 for (int element : t){
System.out.print(element + " ");
}
System.out.println();

Instructions de traitement d'exception try-catch-finally

Rupture de contrôle (instructions de branchement)

Instruction break


class BreakDemo {
public static void main(String[] args) {

int[] arrayOfInts =
{ 32, 87, 3, 589, 12, 1076, 2000, 8, 622, 127 };
int searchfor = 12;

int i;
boolean foundIt = false;

for (i = 0; i < arrayOfInts.length; i++) {
if (arrayOfInts[i] == searchfor) {
foundIt = true;
break;
}
}

if (foundIt) {
System.out.println("Found " + searchfor + " at index " + i);
} else {
System.out.println(searchfor + " not in the array");
}
}
}

Instruction break(suite)

class BreakWithLabelDemo {
    public static void main(String[] args) {

        int[][] arrayOfInts = { 
            { 32, 87, 3, 589 },
            { 12, 1076, 2000, 8 },
            { 622, 127, 77, 955 }
        };
        int searchfor = 12;

        int i;
        int j = 0;
        boolean foundIt = false;

    search:
        for (i = 0; i < arrayOfInts.length; i++) {
            for (j = 0; j < arrayOfInts[i].length;
                 j++) {
                if (arrayOfInts[i][j] == searchfor) {
                    foundIt = true;
                    break search;
                }
            }
        }

        if (foundIt) {
            System.out.println("Found " + searchfor +
                               " at " + i + ", " + j);
        } else {
            System.out.println(searchfor +
                               " not in the array");
        }
    }
}

L'instruction continue


class ContinueDemo {
public static void main(String[] args) {

String searchMe
= "peter piper picked a " +
"peck of pickled peppers";
int max = searchMe.length();
int numPs = 0;

for (int i = 0; i < max; i++) {
// interested only in p's
if (searchMe.charAt(i) != 'p')
continue;

// process p's
numPs++;
}
System.out.println("Found " +
numPs + " p's in the string.");
}
}

L'instruction return

Compilation et exécution d'un programme Java

public class HelloWorld {
static public void main(String args[]){
System.out.println("Hello World!");
}
}
$ ls
HelloWorld.java
$ javac HelloWorld.java
$ ls
HelloWorld.class
HelloWorld.java
$ java HelloWorld
Hello, World

La machine virtuelle Java

Cycle de développement Java

Write once run everywhere


Machine virtuelle Java sur plusieurs platesformes

Java Plateforme

(Figures extraites de http://docs.oracle.com/javase/tutorial/getStarted/intro/definition.html)

Environnement de développement intégrés Vs. mode commande

Surcharge de fonction

 class DataArtist {
static void draw(String s) {
System.out.println("Ceci est une chaîne: "+s);
}
static void draw(int i) {
System.out.println("Ceci est un entier: "+i);
}
static void draw(double f) {
System.out.println("Maintenant un double: "+f);
}
static void draw(int i, double f) {
System.out.format("Une entier %d et un double %f %n",i,f);
}
}
 DataArtist.draw ("Picasso");      // 1ère méthode, draw(String)
DataArtist.draw (1); // 2e méthode, draw(Int)
DataArtist.draw (3.1459); // 3e méthode, draw(double)
DataArtist.draw (2, 1.68); // 4e méthode, draw (int, double)

Paramètres de fonctions


public static void modifObj(int p[]) {
p[0] = p[0] + 200; // Objet référencé par p est modifié
}

public static void modifVal(int x) {
x = x + 200; // paramètre x modifié
}
int x = 2;
modifVal (x);
// ici, x vaut toujours = 2

int [] t = {2, 3};
modifObj (t); // t[0] a changé en 202

public static void modifObj(int p[]) {
int t[]={200,300};
p = t; // p[0] = 200
}

int [] t = {2, 3};
modifObj (t); // t[0] vaut toujours = 2

Gestion des exceptions

 try {
int n = fact(5);
}
catch (ExceptionFactNegatif e) {
System.out.println("Valeur negative pour factorielle");
}

 static public int fact(int x) throws ExceptionFactNegatif {
if( x < 0 )
 throw new ExceptionFactNegatif();
else
 // calcul factorielle f ...
return f;
}

class ExceptionFactNegatif extends Throwable {};

Les APIs Java

Les APIs Java

 

API Java

Les APIs Java

Ancien style. Jusqu'à Java 6.

API Java

Exemples de packages (java.lang)

Package java.util


Package java.io

Plateforme Java

Java component technologies

That's all folks... ;-)

Voir quand même :

http://www.java-tips.org/java-se-tips/java.lang/

qui contient quelques bon exemples de programmes et astuces Java

ou en general http://www.java-tips.org/java-se-tips/  et http://www.java-tips.org/

Note: Dommage que ce site n'existe plus :-( Taper "java tips and tricks" dans google pour trouver quelques exemples et bonnes pratiques en Java ;-)