Document 2
Thèmes abordés
Document 2
Thèmes abordés
Introduction
1.1.1 Historique
Créé au début des années 1990 par une équipe dirigée par James Gosling
chez Sun Microsystems, Java a été initialement conçu pour les applications
de télévision interactive. Cependant, il s’est avéré être une solution idéale
pour le développement d’applications Internet, notamment avec l’essor du
World Wide Web.
1
— Performant : Bien que le code Java soit interprété, la JVM peut
exécuter le code compilé (bytecode) presque aussi rapidement que les
langages compilés comme C++.
— Syntaxe Familière : La syntaxe de Java est similaire à celle de C et
C++, ce qui facilite l’apprentissage pour les développeurs ayant une
expérience dans ces langages.
2
Chapitre 2
Architecture de Java
2.2.2 Portabilité
L’un des slogans de Java est "Write Once, Run Anywhere" (WORA), ce
qui signifie que le code Java, une fois écrit et compilé en bytecode, peut être
exécuté sur n’importe quelle machine équipée d’une JVM, indépendamment
du système d’exploitation ou de l’architecture matérielle.
3
2.3 Bytecode
Le bytecode est le langage intermédiaire dans lequel le code source Java
est compilé. Il est plus abstrait que le code machine, mais peut être rapide-
ment interprété ou compilé en code natif par la JVM.
2.5 Conclusion
L’architecture de Java est conçue pour permettre aux développeurs de
créer des applications sécurisées, performantes, et portables. La compréhen-
sion de cette architecture est essentielle pour exploiter pleinement les capa-
cités du langage Java.
4
Chapitre 3
3.1 Introduction
Comprendre la syntaxe de base de Java est la première étape essentielle
pour tout développeur débutant en Java. Ce chapitre explore les éléments
fondamentaux du langage, tels que les variables, les types de données, les
opérateurs, et les structures de contrôle.
int age;
String name;
5
3.2.3 Types de Variables
Les variables en Java peuvent être classées en trois catégories :
Variables Locales
Ce sont des variables déclarées dans le corps d’une méthode et sont ac-
cessibles uniquement à l’intérieur de cette méthode.
void maMethode() {
int x = 10; // Variable locale
}
Variables d’Instance
Ce sont des variables déclarées dans une classe mais en dehors de toute
méthode. Elles sont accessibles par toutes les méthodes d’instance de la
classe.
6
Types Référence
Les types référence sont utilisés pour stocker les adresses mémoire des
objets. Les classes, les interfaces, les tableaux, et les énumérations sont des
types de référence.
Conversion Implicite
Java convertit automatiquement le type de données de plus petite taille
au type de plus grande taille.
int i = 100;
long l = i; // Conversion implicite de int à long
double d = 100.04;
int i = (int) d; // Casting explicite de double à int
7
3.3.2 Types d’Opérateurs
Opérateurs Arithmétiques
Ces opérateurs sont utilisés pour effectuer des opérations arithmétiques.
Opérateurs de Comparaison
Ces opérateurs sont utilisés pour comparer deux valeurs.
Opérateurs Logiques
Ces opérateurs sont utilisés pour effectuer des opérations logiques sur des
variables booléennes.
Opérateurs d’Assignation
Ces opérateurs attribuent une valeur à une variable.
a = 10; // Assignation
a += 10; // Équivaut à a = a + 10
a -= 5; // Équivaut à a = a - 5
8
3.3.3 Priorité des Opérateurs
La priorité des opérateurs détermine l’ordre dans lequel les opérations
sont effectuées. Voici un tableau indiquant la priorité des opérateurs, du plus
élevé au plus bas.
9
La Structure if-else
La structure if-else permet d’exécuter un bloc de code si une condition
est vraie et un autre bloc si elle est fausse.
La Structure switch
La structure switch permet d’exécuter un bloc de code parmi plusieurs
possibles en fonction de la valeur d’une expression.
int jour = 2;
switch (jour) {
case 1:
[Link]("Lundi");
break;
case 2:
[Link]("Mardi");
break;
// ...
default:
[Link]("Jour invalide");
}
10
3.4.3 Boucles
La Boucle for
La boucle for est utilisée pour répéter un bloc de code un certain nombre
de fois.
La Boucle while
La boucle while répète un bloc de code tant qu’une condition est vraie.
int i = 0;
while (i < 5) {
[Link]("Iteration " + i);
i++;
}
La Boucle do-while
La boucle do-while est similaire à la boucle while, mais elle exécute le
bloc de code au moins une fois.
int i = 0;
do {
[Link]("Iteration " + i);
i++;
} while (i < 5);
3.5 Conclusion
La maîtrise de la syntaxe de base de Java, des opérateurs, et des struc-
tures de contrôle est essentielle pour écrire des programmes efficaces. Ce
chapitre constitue une introduction à ces concepts fondamentaux. Les cha-
pitres suivants approfondiront ces notions et introduiront des concepts plus
avancés.
11
Chapitre 4
Tableaux en Java
4.1 Introduction
Les tableaux en Java sont des objets qui stockent des éléments de même
type en mémoire continue. Ils sont utilisés pour stocker des collections de
données, et leur taille est définie lors de la création. Ce chapitre explore la
création, l’initialisation, et la manipulation des tableaux en Java.
4.2.2 Création
Après la déclaration, il est nécessaire de créer le tableau en spécifiant sa
taille.
myArray = new int[10];
12
4.3 Initialisation de Tableaux
4.3.1 Initialisation lors de la Création
On peut initialiser un tableau lors de sa création en spécifiant les valeurs
des éléments entre accolades.
myArray[0] = 1;
myArray[1] = 2;
// Avec for
for (int i = 0; i < [Link]; i++) {
[Link](myArray[i]);
}
// Avec foreach
for (int element : myArray) {
[Link](element);
}
13
4.5 Tableaux Multidimensionnels
Java supporte également les tableaux multidimensionnels. Un tableau bi-
dimensionnel, par exemple, peut être considéré comme une matrice.
4.6 Conclusion
Les tableaux sont un moyen efficace de stocker et de manipuler des col-
lections d’éléments. En comprenant comment créer, initialiser, et manipuler
des tableaux en Java, les étudiants peuvent gérer efficacement des ensembles
de données de taille fixe dans leurs programmes.
14
Chapitre 5
5.1 Introduction
En Java, les chaînes de caractères, représentées par la classe String, sont
une séquence immuable de caractères. Ce chapitre explore comment créer,
manipuler, et opérer sur les objets String en Java.
15
dification sur une chaîne de caractères entraîne la création d’une nouvelle
chaîne.
charAt(int index)
La méthode charAt() retourne le caractère à un index spécifique.
concat(String str)
La méthode concat() concatène la chaîne spécifiée à la fin de la chaîne
courante.
16
indexOf(String str) et lastIndexOf(String str)
Les méthodes indexOf() et lastIndexOf() retournent l’index de la pre-
mière ou dernière occurrence de la sous-chaîne spécifiée, respectivement.
equals(Object obj)
La méthode equals() compare deux chaînes pour vérifier si elles sont
identiques.
toLowerCase() et toUpperCase()
Les méthodes toLowerCase() et toUpperCase() convertissent respecti-
vement tous les caractères de la chaîne en minuscules ou en majuscules.
trim()
La méthode trim() supprime les espaces blancs au début et à la fin de
la chaîne.
17
5.5.1 StringBuffer
StringBuffer est une classe qui permet de manipuler des chaînes de
caractères de manière mutable. Elle est thread-safe, ce qui signifie que les
méthodes sont synchronisées pour être utilisées dans un environnement mul-
tithread.
Création et Manipulation
Un StringBuffer peut être créé et manipulé de la manière suivante :
StringBuffer buffer = new StringBuffer("Bonjour");
[Link](" le monde");
String resultat = [Link](); // "Bonjour le monde"
5.5.2 StringBuilder
StringBuilder est similaire à StringBuffer, mais sans garantie de syn-
chronisation. Il est donc plus rapide dans un environnement single-thread.
Création et Manipulation
Un StringBuilder peut être créé et manipulé de la manière suivante :
StringBuilder builder = new StringBuilder("Bonjour");
[Link](" le monde");
String resultat = [Link](); // "Bonjour le monde"
append(String str)
Ajoute une chaîne à la fin du contenu actuel.
[Link]("!");
[Link]("!");
18
delete(int start, int end)
Supprime une séquence de caractères.
[Link](0, 8);
[Link](0, 8);
reverse()
Inverse la séquence de caractères.
[Link]();
[Link]();
5.6 Conclusion
Les chaînes de caractères sont l’un des types de données les plus utilisés
en Java. La compréhension des concepts relatifs à la classe String, ainsi
que l’utilisation efficace de ses méthodes et des classes alternatives comme
StringBuilder, sont essentielles pour la manipulation efficace des données
textuelles en Java.
19
Chapitre 6
La Programmation Orientée
Objet en Java
6.1 Motivation
6.1.1 Pourquoi la POO ?
La POO permet de structurer le code en unités modulaires appelées
classes, qui peuvent être réutilisées et étendues dans différents projets. Cela
favorise le développement rapide, facilite la maintenance et rend le code plus
compréhensible.
20
public class Animal {
// Attributs et méthodes
}
6.2.2 Attributs
Les attributs, également appelés variables d’instance, définissent les pro-
priétés ou caractéristiques d’une classe. Ils sont déclarés à l’intérieur de la
classe mais en dehors de toute méthode.
6.2.3 Méthodes
Les méthodes définissent le comportement de la classe et spécifient ce
qu’un objet créé à partir de la classe peut faire.
void faireDuBruit() {
[Link]("L’animal fait du bruit.");
}
}
6.2.4 Constructeurs
Un constructeur est une méthode spéciale qui est utilisée pour initialiser
un objet lors de sa création. Le nom du constructeur doit être identique à celui
de la classe. Si aucun constructeur n’est défini, Java fournit un constructeur
par défaut.
// Constructeur
21
public Animal(String nom, int age) {
[Link] = nom;
[Link] = age;
}
}
6.2.5 Instanciation
L’instanciation est le processus de création d’un objet à partir d’une classe
en utilisant le mot-clé new et le constructeur de la classe.
22
public class Mammifere {
void respirer() {
[Link]("Respire avec des poumons.");
}
}
void respirerCommeMammifere() {
[Link](); // Appelle la méthode respirer de Mammifere
}
}
23
dans sa superclasse ou dans une interface qu’elle implémente. La méthode
dans la sous-classe doit avoir la même signature que celle dans la superclasse.
— Annotations : Il est recommandé d’utiliser l’annotation @Override
pour indiquer explicitement qu’une méthode est redéfinie. Cela permet
au compilateur de vérifier la méthode et d’assurer la cohérence.
— Accès : La visibilité de la méthode redéfinie dans la sous-classe ne peut
pas être plus restrictive que celle de la méthode dans la superclasse.
24
}
Comparaison
Bien que la surcharge et la redéfinition de méthodes impliquent toutes
deux d’avoir plusieurs méthodes avec le même nom, elles sont différentes
dans leur utilisation et leur but.
— Surcharge : Même classe, signatures différentes, indépendante de
l’héritage.
— Redéfinition : Classes parent-enfant, même signature, implique l’hé-
ritage.
La surcharge et la redéfinition de méthodes en Java permettent aux déve-
loppeurs de créer des systèmes plus flexibles et évolutifs. En comprenant ces
concepts, les programmeurs peuvent concevoir des classes qui sont faciles à
étendre et à maintenir.
25
}
Ordre d’Initialisation
L’ordre d’initialisation des constructeurs est important en Java. Lors-
qu’une sous-classe est instanciée, les éléments suivants sont appelés dans
l’ordre :
1. Les initialisateurs de variable de la superclasse
2. Le constructeur de la superclasse
3. Les initialisateurs de variable de la sous-classe
4. Le constructeur de la sous-classe
26
6.3.6 Masquage des Attributs de la Superclasse
Le masquage des attributs de la superclasse, également connu sous le nom
de "shadowing", se produit lorsque une sous-classe définit un attribut ayant
le même nom qu’un attribut dans sa superclasse. Dans ce cas, l’attribut de
la sous-classe masque l’attribut de la superclasse.
Comprendre le Masquage
Lorsque vous accédez à un attribut masqué à partir d’une méthode d’ins-
tance dans la sous-classe, c’est l’attribut de la sous-classe qui est utilisé et
non celui de la superclasse.
void afficherNom() {
[Link](nom); // Affiche "Chien spécifique"
}
}
void afficherNoms() {
[Link](nom); // Affiche "Chien spécifique"
[Link]([Link]); // Affiche "Animal générique"
}
}
27
héritée, tandis que le masquage concerne les attributs ayant le même nom
dans la hiérarchie de classes.
— Méthodes : Les méthodes sont liées dynamiquement au moment de
l’exécution, permettant le polymorphisme.
— Attributs : Les attributs sont liés statiquement au moment de la
compilation. L’attribut utilisé est déterminé par le type de référence
et non par le type de l’objet au moment de l’exécution.
void afficherNoms() {
[Link](nom); // Affiche "Chien spécifique"
[Link]([Link]); // Affiche "Animal générique"
}
}
— Accéder aux Méthodes Masquées : De manière similaire, super
peut être utilisé pour appeler une méthode de la superclasse qui a été
redéfinie dans la sous-classe.
— Appeler le Constructeur de la Superclasse : super peut égale-
ment être utilisé pour appeler le constructeur de la superclasse depuis
le constructeur de la sous-classe.
Bien que les constructeurs ne soient pas hérités dans le sens tradition-
nel, comprendre comment et quand les constructeurs de la superclasse sont
appelés est essentiel pour créer des classes bien conçues et éviter les erreurs
courantes en Java.
28
6.3.7 Limitations de l’Héritage
Bien que l’héritage soit un outil puissant pour la réutilisation du code et
la modélisation des relations entre les objets, il présente certaines limitations
et restrictions en Java.
Héritage Simple
Java ne supporte pas l’héritage multiple, ce qui signifie qu’une classe ne
peut hériter que d’une seule superclasse. Cette restriction évite la complexité
et les ambiguïtés liées à l’héritage de plusieurs classes.
Accès Privé
Les membres déclarés comme private dans une superclasse ne sont pas
accessibles directement dans les sous-classes. Ils ne sont pas hérités dans le
sens traditionnel.
public class A {
private int x;
}
29
Constructeurs
Les constructeurs ne sont pas hérités dans les sous-classes. Cependant, le
constructeur de la superclasse est appelé lors de l’instanciation d’un objet de
la sous-classe.
30
6.4.2 Méthodes Abstraites
Les méthodes abstraites sont déclarées sans corps dans une classe abs-
traite. Les classes concrètes qui héritent d’une classe abstraite doivent fournir
une implémentation pour toutes ses méthodes abstraites.
Héritage Multiple
Contrairement aux interfaces, Java ne permet pas l’héritage multiple avec
les classes, y compris les classes abstraites. Une classe ne peut hériter que
d’une seule classe abstraite.
31
— Une classe abstraite peut avoir des variables d’instance et des mé-
thodes avec des implémentations, tandis qu’une interface ne peut
contenir que des constantes et des méthodes abstraites.
Les classes abstraites permettent de définir un modèle pour des classes
apparentées tout en empêchant l’instanciation directe. Elles sont particuliè-
rement utiles pour partager du code tout en obligeant les classes dérivées à
suivre un certain contrat.
6.4.6 Polymorphisme
Le polymorphisme est un concept fondamental de la programmation orien-
tée objet qui permet à des objets de types différents d’être traités comme des
objets d’un type commun. En Java, le polymorphisme se manifeste principa-
lement sous deux formes : le polymorphisme de compile (ou surcharge) et le
polymorphisme de runtime (ou substitution).
Dans cet exemple, la méthode somme est surchargée pour accepter soit
deux entiers, soit deux doubles.
32
public class Animal {
public void faireDuBruit() {
[Link]("Un animal fait du bruit");
}
}
Dans cet exemple, bien que la référence a soit de type Animal, elle pointe
vers une instance de Chien, et la méthode faireDuBruit de la classe Chien
est appelée.
Upcasting et Downcasting
Le polymorphisme permet également le casting entre types. L’upcasting
convertit un objet de sous-classe en objet de superclasse, tandis que le down-
casting convertit un objet de superclasse en objet de sous-classe.
— Upcasting : Il est toujours sûr et est effectué implicitement.
— Downcasting : Il doit être effectué explicitement et peut générer une
exception ClassCastException s’il est incorrect.
Le polymorphisme augmente la flexibilité et le maintien du code en per-
mettant l’utilisation de types génériques. Cela facilite l’extension des sys-
tèmes existants et encourage la réutilisation du code.
6.4.7 Interfaces
Les interfaces sont un moyen de spécifier un contrat pour les classes sans
imposer une hiérarchie de classes. En Java, une interface est une collection de
méthodes abstraites (sans corps) et de constantes. Les interfaces permettent
33
à Java d’approcher la notion d’héritage multiple, car une classe peut implé-
menter plusieurs interfaces.
Définition et Implémentation
Une interface est définie en utilisant le mot-clé interface, et une classe
implémente une interface en utilisant le mot-clé implements.
@Override
public void nager() {
[Link]("Le canard nage");
}
}
34
Méthodes par Défaut et Méthodes Statiques
Depuis Java 8, les interfaces peuvent avoir des méthodes par défaut (avec
une implémentation) et des méthodes statiques.
// Méthode statique
static void respirer() {
[Link]("Tous les animaux respirent");
}
}
Interfaces Fonctionnelles
Une interface fonctionnelle est une interface qui a une seule méthode
abstraite. Elle peut avoir plusieurs méthodes par défaut ou statiques. Les in-
terfaces fonctionnelles sont utilisées comme base pour les expressions lambda
en Java 8 et ultérieur.
@FunctionalInterface
public interface Calculateur {
int operation(int a, int b);
}
35