Your browser doesn't support the features required by impress.js, so you are presented with a simplified version of this presentation.
For the best experience please use the latest Chrome, Safari or Firefox browser.
public class HelloWorld
{
public static void main(String[] args)
{
System.out.println("Hello World");
}
}
HelloWorld.java
HelloWorld.class
.java
/*
* Première classe d'exemple
* pour le cours Java 210
*/
public class HelloWorld
{
/**
* Point d'entrée du programme
*
* @param args Tableau des arguments passés au programme
*/
public static void main(String[] args)
{
//Affiche Hello World dans la console
System.out.println("Hello World");
}
}
int short long bytes
float double
char
boolean
Type | Occupation en mémoire | Intervalle (limites incluses) |
---|---|---|
byte |
1 octet | -128 à 127 |
short |
2 octets | -37 768 à 32767 |
int |
4 octets | -2 147 489 648 à 2 147 483 647 |
long |
8 octets | -9 223 372 036 854 775 808 à 9 223 372 036 854 775 807 |
Type | Occupation en mémoire | Intervalle (limites incluses) | |
---|---|---|---|
float |
4 octets | +- 3.40282347 x 1038 | 6 ou 7 décimales significatives |
double |
8 octets | +- 1.79769313486231570 x 10308 | 15 décimales significatives |
double
(pour double précision) sera souvent préféré au type float
(plus rapide mais moins précis).
char
permet de représenter une unité de code en codage UTF-16 (sur 2 octets).
char
dans les programmes. Préfere le type String
.
boolean
peut avoir deux valeurs, true
(vrai) ou false
(faux). Il est utilisé pour évaluer des conditions logiques.
//Définition du type énuméré Taille
enum Taille {SMALL, MEDIUM, LARGE, EXTRA_LARGE};
//L'ordre de définition des constantes SMALL, MEDIUM... est important !
boolean enConge;//Déclaration de la variable enConge
enConge = false;//Initialisation de la variable en affectant la valeur false
int joursVacances = 25;//Déclaration et initialisation de la variable joursVacances en une ligne.
double salaire, prime;//Déclaration de deux variables en une ligne. Non recommandé.
System.out.println(salaire);//Erreur de compilation
Taille s = Taille.SMALL;//Déclaration d'une variable du type énuméré Taille
int a, var1, monEntier;// Déconseillé car non pertinent
double Salaire, primeFinAnnée; //Déconseillé car majuscule et accents
short mon Age, m@x;//Erreur car espaces ou caractères non alpha-numériques
boolean estPresent;//OK
int age,Age,AGE;//Trois variables différentes car sensible à la casse.
boolean public;//Interdit car public est un mot réservé de java
final
. Par convention, les noms des constantes sont en majuscules et les mots sont séparés par des _
public class ExempleConstantes {
//Visible dans toute la classe
public static final short NOMBRE_MOIS_ANNEE = 12;
public static final short NOMBRE_TRIMESTRE_ANNEE = NOMBRE_MOIS_ANNEE / 3;
public static void main(String[] args){
final short NOMBRE_JOURS_SEMAINE = 7;//Visible uniquement dans main
System.out.println("Nombre de mois dans l'année : " + NOMBRE_MOIS_ANNEE);
NOMBRE_JOURS_SEMAINE = 9;//Interdit ! Erreur de compilation
}
}
static
permet de définir une constante de classe qui sera accessible en dehors de la classe : ExempleConstantes.NOMBRE_MOIS_ANNEE
int auCarre(int x)
{
//Multiplie l'argument x par
//lui-même et retourne du résultat
return x * x;
}
//Appel de la méthode
System.out.println(auCarre(4));
//Affiche 16
public void afficheBonjour()
{
//Cette méthode ne fait qu'afficher
//Pas de return
System.out.println("Bonjour !");
}
afficheBonjour(); //Affiche "Bonjour !"
int quinze = 3 * 5; int deux = quinze - 13;
int sept = quinze / deux; //Division entière car les variables sont des entiers
int un = 15 % 2; //Reste de la division entière de 15 par 2 (modulo)
double quinzeDouble = 15.0;
double septVirguleCinq = quinzeDouble / 2;//Division entre un double et un entier
int x = 5; x++;//équivalent à x = x + 1; x vaut 6
int y = 2 * --x;//y vaut 10, x vaut 5
int z = 2 * x++;//z vaut 10, x vaut 6
x -= 2;//équivalent à x = x - 2; x vaut 4
Test | Signe | Exemple |
---|---|---|
Egalité | == |
|
Différence | != |
|
"ET" logique | && |
|
"OU" logique | || |
|
"NON" logique | ! |
|
Infériorité | < et <= |
|
Supériorité | > et >= |
|
Opérateur ternaire | ? et : |
|
Opération | Signe | Exemple |
---|---|---|
"ET" logique | & |
|
"OU" logique | | |
|
"OU" exclusif | ^ |
|
"NON" logique | ~ |
|
Décalage de bits | << ou >> |
|
&
et |
donnent une valeur boolean
lorsqu'ils sont appliqués à des boolean
mais évaluent les deux arguments de chaque côté de l'opérateur, contrairement à &&
et ||
.
Expression | Equivalent |
---|---|
a + b * c ou a || b && c |
a + (b * c) ou a || (b && c) |
a * b + c * d ou a && b || c && d |
(a * b) + (c * d) ou (a && b) || (c && d) |
-c * d ou !c && d |
(-c) * d ou (!c) && d |
-a * -b + c ou !a && !b || c |
( (-a) * (-b) ) + c ou ( (!a) && (!b) ) || c |
Exemple de perte de précision :
int n = 987654321;
float f = n;// f vaut 9.8765434E8
Règles de conversions automatiques lors d'opérations arithmétiques :
double
, l'autre sera converti en double
float
, l'autre sera converti en float
long
, l'autre sera converti en long
int
short s = 56;
int i = (int) s
Exemples de transtypage :
//Transtypage double -> int
double d = 4.567;
int n = (int)d;// d vaut 4 (la partie décimale est perdue)
//Transtypage int -> short
int i = 55000;
short s = (short)i; //s vaut -10536...
Math.round(x)
.
new
pour l'initialiser.
//Déclaration d'un tableau d'entier
int[] tableauEntier, tableauEntier2; //Le tableau est déclaré mais non initialisé
//Initialisation du tableau
tableauEntier = new int[50]; //Le tableau est vide et peut contenir jusqu'à 50 valeurs
tableauEntier2 = new int[] {5, 4, 3, 8, 5}; //Déclare, initialise et remplit le tableau
//Insertion d'un élément dans le tableau
tableauEntier[0] = 5; //Met l'entier 5 dans le premier élément du tableau.
tableauEntier[50] = 10; //Exception, on essaye d'insérer au 51e élément du tableau.
//Accès à un élément dans un tableau
int premierElement = tableauEntier[0];
//Obtenir la taille du tableau
int tailleTableau = tableauEntier.length;
//Copie de tableaux
//Attention, ceci n'est pas une copie !
tableauEntier = tableauEntier2;// tableauEntier2 et tableauEntier font maintenant référence au même tableau
//Pour copier on utilise Arrays.copyOf(tableauCible, nbElementsACopier) ou Arrays.copyOfRange(tableauCible, indexDepart, indexFin);
tableauEntier = Arrays.copyOf(tableauEntier2, tableauEntier2.length);
tableauEntier = Arrays.copyOfRange(tableauEntier2, 0, tableauEntier2.length);
//Tri d'un tableau
Arrays.sort(tableauEntier);
//Recherche dans un tableau trié
int i = Arrays.binarySearch(tableauEntier, 5); //Renvoie l'indice de la valeur 5 si elle est trouvée ou une valeur négative sinon
//Comparaison de tableau
boolean egal = Arrays.equals(tableanEntier, tableauEntier2); //Renvoie true si les tableaux ont la même longueur et le même contenu
//Remplissage d'un tableau
Arrays.fill(tableanEntier, 6); //Remplie tous les éléments du tableau avec la valeur 6
//Déclaration d'un tableau bidimensionnel
char[][] tableau2D;// [][] pour deux dimensions, [][][] pour trois dimensions...
//Initialisation d'un tableau bidimensionnel
tableau2D = new char[3][4];//Equivalent à un tableau de 3 colonnes et 4 lignes
char [][] sudoku = {
{'2', '1', '9'},
{'8', '4', '3'},
{'6', '7', '?'}
}; // Il n'est pas nécessaire de définir les limites du tableau lorsqu'on connait tous ses éléments
//Accès à un élément du tableau bidimensionnel
char i = sudoku[0][1];//i vaut '1'
//Affectation d'un élément du tableau bidimensionnel
sudoku[2][2] = '5';//La valeur '?' est remplacée par '5'
{ }
.
public static void main(String[] args)
{
int entierGlobalMethode = 5;
{
System.out.println(entierGlobalMethode); //entierGlobalMethode est accessible ici
int entierLocalBloc = 4;
{
System.out.println(entierGlobalMethode); //entierGlobalMethode est accessible ici
}
int entierGlobalMethode = 5; //Exception : entierGlobalMethode est déjà défini
}
System.out.println(entierLocalBloc); //Exception : entierLocalBloc n'est plus accessible ici
int entierLocalBloc = 4; //entierLocalBloc n'est plus accessible, il peut être de nouveau défini
}
if
et else
.
boolean estStrictementPositif = false; int monEntier = 5;
if(monEntier > 0)
estStrictementPositif = true;
System.out.println(monEntier + " est supérieur ou inférieur à 0"); //Attention, exécuté systématiquement !
if(estStrictementPositif) // équivalent à if(estStrictementPositif == true)
{
System.out.println(monEntier + " est strictement supérieur à 0");
appelMethode1(monEntier); //Deux instructions, donc nécessité d'utiliser un bloc { }
}
else if (monEntier < 0) //Plusieurs else if peuvent être enchaînés pour tester plusieurs cas
{
System.out.println(monEntier + " est strictement inférieur à 0");
appelMethode2(monEntier);
}
else { //Si aucune des conditions précédentes n'est remplie
System.out.println(monEntier + " est égal à 0");
appelMethode3(monEntier);
}
{ }
même lorsqu'il n'y a qu'une instruction, afin d'éviter des erreurs lors d'ajout d'instructions.
if else
peut être assez lourde. On peut alors utiliser l'instruction switch
si les tests portent sur des types entiers (et depuis Java 7, les chaînes de caractère).
int position = 1;
switch (position) {
case 1:
case 2:
case 3:
System.out.println("Sur le podium, bien joué !");
break;
case 4:
System.out.println("Quatrième, aux portes du podium !");
break;
case 5:
System.out.print("Pas si mal, cinquième ou ");
case 6:
System.out.println("sixième... Bel effort !");
break;
default:
System.out.println("Loin derrière, merci d'avoir participé !");
break;
}
switch
peut être piégeuse en cas d'oubli de break
dans chaque case
.
while
while
.
int[] tableauFibonacci = {0, 0, 1, 2, 3, 5, 8, 13, 21, 34, 55};
int index = 0; int limite = 5; int taille = tableauFibonacci.length;
System.out.println("Affichage des " + limite + " premiers éléments de la suite de Fibonacci :");
while(index < limite && index < taille)
{
System.out.println(tableauFibonacci[index++]);
}
// Si la condition n'est pas vérifiée d'entrée
// rien n'est affiché
do
{
System.out.println(tableauFibonacci[index++]);
}
while(index < limite && index < taille);
//Le premier élément de la suite sera affiché
//même si la condition n'est pas vérifiée
do while
, ne pas oublier le ;
à la fin du while !
for
for
.
int[] tableauFibonacci = {0, 0, 1, 2, 3, 5, 8, 13, 21, 34, 55};
System.out.println("Affichage de tous les éléments de la suite de Fibonacci :");
//for(inialisation ; condition ; incrémentation)
for(int i = 0; i < tableauFibonacci.length; i++)
{
//A chaque itération, l'index i est
//incrémenté tant qu'il ne dépasse
//pas la taille du tableau
System.out.println(tableauFibonacci[i]);
}
//for(element : collection)
for(int element : tableauFibonacci)
{
//A chaque itération, element contient
//l'élément suivant du tableau jusqu'à
//la fin
System.out.println(element);
}
Arrays.stream(tableauFibonacci).forEach(System.out::println);
break
.
int[] tableauFibonacci = {0, 0, 1, 2, 3, 5, 8, 13, 21, 34, 55};
//On sort dès qu'une valeur est supérieur à 4
for(int element : tableauFibonacci)
{
if(element > 4){
break;
}
//La portion de code ci-dessous ne sera pas exécutée
//lorsque la variable element vaudra 5
System.out.print(element + ", ");
}//Affichage 0, 0, 1, 2, 3,
break
dans la deuxième boucle, on ne sort que de la remière.
char [][] sudoku = {
{'2', '9', '?'}, {'8', '4', '3'}, {'6', '7', '1'}
};
parcours_boucle: //Etiquette parcours_boucle
for(int i = 0; i < 3; i++){
for(int j = 0; j < 3; j++){
if(sudoku[i][j] == '?'){
break parcours_boucle; //On sort des deux boucles
}
System.out.print(sudoku[i][j] + ", ");
}
}//Affichage 2, 9,
:
. C'est l'étiquette. Pour sortir de cette boucle, on appelle break nom_etiquette;
continue
.
int[] tableauFibonacci = {0, 0, 1, 2, 3, 5, 8, 13, 21, 34, 55};
//On passe au tour de boucle suivant dès qu'une valeur paire
for(int element : tableauFibonacci)
{
if(element % 2 == 0){
continue;
}
//La portion de code ci-dessous ne sera pas exécutée
//lorsque la variable element est paire
System.out.print(element + ", ");
}//Affichage 1, 3, 5, 13, 21, 55
Error
qui correspond aux erreur internes au système d'exécution Java et qui ne sont pas vraiment gérables par le programmeur, et la branche Exception
, qui se sépare elle-même en plusieurs branches, dont notamment les RuntimeException
.
RuntimeExceptions
RuntimeException
survient systématiquement à cause d'une erreur de programmation. Les autres correspondent à des erreurs externes au programme.
int[] tableauFibonacci = {0, 0, 1, 2, 3};
for(int i = 0; i < 6; i++){
//Lorsque i va valoir 5, une exception va être levée
//et va interrompre le traitement
System.out.print(tableauFibonacci[i] + ", ");
}//Affichage : 0, 0, 1, 2, 3
int[] tableau = {5, 1, 0, 3};
for(int i = 0; i < tableau.length; i++){
System.out.print(15 / tableau[i] + ", ");if (tableau[i] != 0) {
System.out.print(15 / tableau[i] + ", ");
} else {
System.out.print("Erreur");
}
}
RuntimeException
, on parle d'exceptions hors-contrôle. Le programeur doit faire en sorte qu'elles ne surviennent pas.
RuntimeException
(et de celles qui en héritent). Celles-ci doivent être gérées par le programmeur.
methodeRuntimeException() throws RuntimeException {
...
throw new RuntimeException("Erreur...");
}
//On ne gère pas les RuntimeException
methodeRuntimeException();
//On signale au programmeur que cette méthode peut lancer des
//exceptions de type IOException ou EOFException qu'il faudra gérer
methodeAutreException() throws IOException, EOFException{
...
throw new IOException("Erreur...");
...
throw new EOFException("Erreur...");
}
try {
methodeAutreException();
} catch(IOException exception) {
//Gérer l'exception IOException
...
} catch(EOFException exception) {
//Gérer l'exception EOFException
...
} finally() {
//Dans tous les cas (exception ou pas), effectuer ce traitement
...
}
char
. Une chaîne de caractère peut dont être représentée par un tableau de caractères char[]
.
char
est contraignant à utiliser et peu pratique, on préférera utiliser la classe standard String
.
String
qui est implicitement utilisée par Java lorsqu'on écrit une constante chaîne comme "Hello"
.
String
String
est en fait une classe. Ce sont des références à des objets qui sont manipulées, pas les valeurs elles-mêmes. On utilise donc l'instruction new
pour créer une référence vers un objet.
//Déclaration d'un objet de type String
String chaine; //chaine sera destinée à contenir une référence à un objet de type String
//Déclaration et initialisation d'un objet de type String
String chaine1 = ""; //référence à une chaîne vide
String chaine2 = new String(); //référence à une nouvelle chaîne vide
String chaine3 = new String("Hello"); //référence à une chaîne contenant "Hello"
String chaine4 = "Hello";// Le compilateur crée automatiquement un objet de type String contenant "Hello"
Opération | Méthode retour | Exemple |
---|---|---|
Longueur | length() int |
|
Concaténation | concat(String chaineAConcatener) String |
|
Egalité | equals(String chaineAComparer) boolean |
|
Sous-chaînes | substring(int indexDebut, int indexFin) String |
|
Suppression des espaces de début et fin | trim() String |
|
Remplacement | replace(String recherche, String remplacement) String |
|
Opération | Méthode retour | Exemple |
---|---|---|
Début/Fin | startsWith(String) et endsWith(String) boolean |
|
Rercherche | contains(String chaineARechercher) boolean |
|
Casse | toUpperCase() ou toLowerCase() String |
|
Expression régulière | matches(String regex) boolean |
|
Séparation | split(String regex) String[] |
|
Recherche index | indexOf(String recherche) ou lastIndexOf(String recherche) int |
|
System.out.print("Hello ");
System.out.println("World !");
System.out.print("How are you ?");
//Hello World !
//How are you ?
System.out.println("Quel est votre nom ?");
Scanner scanner = new Scanner(System.in);
String ligneSaisie = scanner.nextLine();
//Je tape John suivi de entrée
System.out.println("Hello " + ligneSaisie);
//Hello John
scanner.close();//Appeler lorsque les saisies sont terminées
System.out.print
est à éviter...
static int factorielle(int nombre) {
if (nombre == 1) {
return 1;
} else {
return (nombre * factorielle(nombre - 1));
}
}
factorielle
, un espace mémoire est alloué permettant de stocker les variables locales, le paramètre nombre
et la valeur de retour. Les appels s'empilent jusqu'à arriver au return 1
qui va dépiler les appels et compiler la valeur de retour.
void affiche(String... textes) {
for(String texte : textes){
System.out.println(texte);
}
}
affiche("Hello");
affiche("Hello", "World");
void afficheObjectXFois(int nbFois, Object... objects) {
for (int i = 0; i < nbFois, i++){
separeMotEspaces(objects);
}
}
afficheObjectXFois(5, "Hello");//Affiche 5 fois Hello
afficheObjectXFois(1, "Hello", 50, true);//Affiche Hello 50 true
textes
est en fait de type String[]
. Une variable ellipse doit être systématiquement le dernier paramètre dans la signature de la méthode.