Les bases du langage Java

Décembre 2020

1 Programme bien formé

1.1 Constantes littérales

On considère les valeurs selon leur type.

1.1.1 Nombre entier

64 bits
long
32 bits
int
16 bits
short
8 bits
byte

1.1.2 Nombre à virgule flottante

32 bits
float 0.5f
64 bits
double 0.5

Attention aux erreurs de représentations !

1.1.3 Booléen

boolean
true ou false

1.1.4 Caractère

caractère (UTF-16) ou (UTF-8)
char

'a' , '\n'

1.1.5 Chaîne de caractères

String

"ceci est une chaîne"

"2"

1.2 Déclaration de variable

type nomDeVariable ;

par exemple int requiredNumberOfChars ;

ou type nomDeVariable= valeurInitiale ;

par exemple int currentNumberOfChars= 0;

1.3 Affectation

nomDeVariable= expression ;

Ce n'est pas une relation (d'égalité).

1.4 Opérateurs

1.4.1 Arithmétiques

+ - * / % << >>

1.4.2 Binaires

par exemple & | ^ ~ (bitwise en anglais et Tilde en français)

1.4.3 Booléens

&& || ^ ! Les opérateurs && et || court-circuitent : l'ordre peut être important.

par exemple pour (i !=0) && (10/i < 3)

1.5 Affectation modification

variable op= expression;

est un raccourci (syntactic sugar) pour

variable = variable op expression;

par exemple currentNumberOfChars += 2;

est équivalent à

currentNumberOfChars = currentNumberOfChars + 2;

1.6 [pre|post][inc|dec]rémentation

++variable est :

  • un raccourci pour l'instruction variable=variable + 1
  • une expression qui vaut la valeur après incrémentation

variable++ vaut la valeur avant incrémentation.

De même avec -- pour décrémenter.

1.7 Déclaration de fonction

public static  typeRetourné nomDeFonction( typeArg1 nomArg1, typeArg2 nomArg2){
    /*
     */
}

Par exemple :

  public static double power(double x, int n){
      double result= 1.;
      for(int i=0; i != n; ++i){
          result *= x;
      }
      return result;
  }
  //
public static void main(String[] args){
    System.out.println("1.5 ^ 3="+power(1.5, 3));
}

1.8 Exécution conditionnelle

Selon qu'une expression booléenne vaut true ou false , le bloc sera exécuté ou non (ou un autre bloc sera exécuté s'il y a une clause else.

if(booleanExpression){
    /*
     */
}
//
if(otherBooleanExpression){
    /*
     */
}else{
    /*
     */
}

1.9 Remarque sur les blocs d'instructions

Un bloc correspond à une portée de variables locales : les variables définies dans un bloc ne seront pas accessibles en dehors du bloc.

Une seule instruction peut tenir lieu de bloc implicite ! L'instruction vide ; est une instruction valide !!

Toujours mettre un bloc explicite.

1.10 Évaluation conditionnelle

booleanExpression ? valueIfTrue : valueIfFalse

Par exemple : (i % 2 == 0) ? "even" : "odd"

1.11 Boucles while

1.11.1 while(){}

while(booleanExpression){
    /*
     */
}

1.11.2 do{} while();

On exécute au moins une fois le bloc car le test est fait à la fin:

do{
/*
*/
}while(booleanExpression);

1.12 Boucles for

1.12.1 for(;;){}

for(initialisation; continuationCondition; postIterUpdate){
/*
*/
}

Équivalent à :

initialisation
while(continuationCondition){
    /*
     */
    postIterUpdate
}

1.12.2 for( : ){}

for(type element : collection){
    /*
     */
}

Plus ou moins ęquivalent à :

for(int i=0; i != collection.length; ++i){
    type element= collection[i];
    /*
     */
}

1.13 Sémantique

La nature des valeurs détermine le sens éventuel des opérations:

String two="2";
System.out.println(two + two);
int two= 2;
System.out.println(two + two);

1.14 Convention de nommage

Les noms composés sont écrits en camelCase : compositeNameWithManyWords. Sauf noms de classes, la première lettre est en minuscule.

Les noms de contantes sont écrits screaming snake case : SCREAMING_SNAKE_CASE.

2 "Enrobage"

Cf. Programmation Orientée Objet

public class Main { // file must have the same name + .java (i.e. Main.java)
  public static void main(String[] args){
  // function called when the progam runs (i.e. "java Main")
  }
}

3 Chaînes de caractères

Le type String est une classe particulière.

    public static void main(String[] args){
        String s1 = "toto";
        String s2 = "toto";
        System.out.println("s1:"+s1+", s2:"+s2+", s1 == s2 :" +(s1 == s2));
        String base = "tot";
        String s3= "tot" + "o";
        System.out.println("s1:"+s1+", s3:"+s3+", s1 == s3 :" +(s1 == s3));
            s3= base + "o";
        System.out.println("s1:"+s1+", s3:"+s3+", s1 == s3 :" +(s1 == s3));
    }
}

Quel seraient les résultats avec des types primitifs, par exemple int avec "toto"→4 , "tot"→3, "o"→1 ? Avec des valeurs > 256 ?

4 Tableaux

Déclaration type[] nomDuTabeau

Le type peut être lui-même un tableau → tableaux à N dimensions.

Tableau
séquence indexée (0 … ) d'éléments de même type
Tableau [de tableaux [de tableaux […] ] ]
N dimensions
  • L' implémentation dans des espaces mémoire consécutifs ne nous concerne pas.
  • Notion de ième élément, pas (encore d'élément suivant)
int[] initWithValue={2,3,5,7,11};
int[] initWithSize = new int[integralExpression];

4.1 Tableau de tableaux

int[][] tab = new int[3][];
for(int i=0;i<3;i++){
    tab[i] = new int[i+2];
}

tableau de tableau

5 Types "Wrapper"

Pour chaque type primitif, on a une classe correspondante : intInteger, doubleDouble,…

public class IntegerValue{
    public static void main(String[] args){
        Integer i1 = 512;
        Integer i2 = 512;
        System.out.println("i1:"+i1+", i2:"+i2+", i1 == i2 :" +(i1 == i2));
        Integer base = 384;
        Integer i3= 384 + 128 ;
        System.out.println("i1:"+i1+", i3:"+i3+", i1 == i3 :" +(i1 == i3));
        i3= base + 128;
        System.out.println("i1:"+i1+", i3:"+i3+", i1 == i3 :" +(i1 == i3));
    }
}

6 Entrées / Sorties

6.1 Sorties

System.out.print() ou System.out.println() si l'on veut passer à la ligne.

System.err pour la sortie d'erreurs standard.

6.2 Entrées

On crée un objet de la classe java.util.Scanner. Pour ne pas avoir à écrire le nom complet (qualifié) avec le nom de package, on peut importer le nom de classe en début de fichier :

import java.util.Scanner;

Ensuite :

Scanner sc= new Scanner(System.in);

System.in est l'entrée standard, c-à-d le clavier de la console (sauf redirection). On peut ensuite lire des valeur de différents types en appelant des méthodes de la classe java.util.Scanner sur l'objet créé :

int requestedSize= sc.nextInt();

7 Quizz

7.1 int

Le morceau de programme suivant se termine-t'il ?

int i;
for(int i = 0 ; i >= 0 ; i++ ) {
    /* on ne fait rien */
}

7.2 double

Le morceau de programme suivant se termine-t'il ?

for(double x = 1 ; x > 0. ; x/=2. ) {
    /* on ne fait rien */
}