You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: docs/cours/java/2-quelques-classes-utiles.md
+91Lines changed: 91 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -44,3 +44,94 @@ Lire ce que l’utilisateur saisit, c’est le rôle de la classe `Scanner` (du
44
44
```
45
45
46
46
Grâce à ces classes, vous disposez déjà d’un arsenal pour interagir avec le monde extérieur. Prêt à écrire vos premiers programmes dynamiques ?
47
+
## Nouveauté Java 25 : la classe `IO`
48
+
49
+
::: tip Java 25
50
+
Depuis Java 25, une nouvelle classe `java.lang.IO` simplifie considérablement les entrées/sorties console. Comme elle fait partie du package `java.lang`, elle est disponible sans aucun import dans tous vos programmes.
51
+
:::
52
+
53
+
La classe `IO` propose cinq méthodes statiques pour les opérations de base :
54
+
55
+
```java
56
+
// Afficher du texte (équivalent de System.out.println)
57
+
IO.println("Hello, World!");
58
+
IO.print("Texte sans retour à la ligne");
59
+
IO.println(); // Ligne vide
60
+
61
+
// Lire une saisie utilisateur (équivalent de Scanner)
62
+
String nom =IO.readln("Entrez votre nom : ");
63
+
String ligne =IO.readln(); // Sans message d'invite
64
+
```
65
+
66
+
### Comparaison avec l'approche classique
67
+
68
+
```java
69
+
// Avant Java 25 : affichage + lecture
70
+
importjava.util.Scanner;
71
+
72
+
publicclassDemo {
73
+
publicstaticvoidmain(String[] args) {
74
+
System.out.println("Hello, World!");
75
+
Scanner scanner =newScanner(System.in);
76
+
System.out.print("Entrez votre nom : ");
77
+
String nom = scanner.next();
78
+
System.out.println("Bonjour "+ nom);
79
+
scanner.close();
80
+
}
81
+
}
82
+
83
+
// Depuis Java 25 : même programme, simplifié
84
+
void main() {
85
+
IO.println("Hello, World!");
86
+
String nom =IO.readln("Entrez votre nom : ");
87
+
IO.println("Bonjour "+ nom);
88
+
}
89
+
```
90
+
91
+
::: info
92
+
La classe `IO` ne remplace pas `System.out` ni `Scanner` : ces classes restent disponibles et nécessaires pour des cas plus complexes (lecture de nombres, flux de fichiers, etc.). `IO` est conçue pour simplifier les cas d'usage les plus courants, notamment pour les débutants.
93
+
:::
94
+
95
+
## Nouveauté Java 25 : les imports de modules (`import module`)
96
+
97
+
::: tip Java 25
98
+
Depuis Java 25, il est possible d'importer d'un coup toutes les classes publiques exportées par un module, grâce à la syntaxe `import module`.
99
+
:::
100
+
101
+
Plutôt que d'écrire de multiples imports, on peut écrire une seule ligne :
102
+
103
+
```java
104
+
// Avant Java 25 : imports classiques
105
+
importjava.util.List;
106
+
importjava.util.Map;
107
+
importjava.util.stream.Collectors;
108
+
importjava.util.stream.Stream;
109
+
110
+
// Depuis Java 25 : un seul import de module
111
+
importmodulejava.base;
112
+
```
113
+
114
+
L'instruction `import module java.base;` rend disponibles toutes les classes de `java.util`, `java.io`, `java.math`, `java.time`, `java.util.stream`, etc. — soit les 54 packages exportés par le module `java.base`.
115
+
116
+
::: info
117
+
Dans un fichier source compact (sans déclaration de classe), `import module java.base;` est automatiquement présent. Vous n'avez même pas besoin de l'écrire !
118
+
:::
119
+
120
+
```java
121
+
// Exemple avec import module
122
+
importmodulejava.base;
123
+
124
+
classDemo {
125
+
voidmain() {
126
+
var noms =List.of("Alice", "Bob", "Charlie");
127
+
var majuscules = noms.stream()
128
+
.map(String::toUpperCase)
129
+
.collect(Collectors.toList());
130
+
IO.println(majuscules);
131
+
}
132
+
}
133
+
```
134
+
135
+
::: warning Attention
136
+
Si deux modules exportent des classes avec le même nom (ex : `java.util.List` et `java.awt.List`), il faudra résoudre l'ambiguïté avec un import spécifique classique.
Copy file name to clipboardExpand all lines: docs/cours/java/3-methode-main.md
+66Lines changed: 66 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -43,3 +43,69 @@ Argument 2 : test
43
43
```
44
44
45
45
Ainsi, la méthode `main` est la porte d’entrée universelle de vos aventures Java. C’est ici que tout commence !
46
+
## Nouveauté Java 25 : simplification de la méthode `main`
47
+
48
+
::: tip Java 25
49
+
Depuis Java 25, la signature de la méthode `main` a été considérablement simplifiée. Cette évolution vise à rendre le langage plus accessible aux débutants, en supprimant les éléments « cérémoniels » inutiles pour les petits programmes.
50
+
:::
51
+
52
+
### Instance `main` methods
53
+
54
+
Les mots-clés `public`, `static` et le paramètre `String[] args` ne sont plus obligatoires. Java 25 permet d'écrire une méthode `main` d'instance, sans paramètre :
55
+
56
+
```java
57
+
// Avant Java 25 (toujours valide)
58
+
publicclassHelloWorld {
59
+
publicstaticvoidmain(String[] args) {
60
+
System.out.println("Hello, World!");
61
+
}
62
+
}
63
+
64
+
// Depuis Java 25 : signature simplifiée
65
+
classHelloWorld {
66
+
voidmain() {
67
+
System.out.println("Hello, World!");
68
+
}
69
+
}
70
+
```
71
+
72
+
Le lanceur Java choisit la méthode `main` selon cette priorité :
73
+
1. S'il existe une méthode `main(String[] args)` (statique ou non), elle est choisie.
74
+
2. Sinon, s'il existe une méthode `main()` sans paramètre, elle est choisie.
75
+
3. Si la méthode choisie n'est pas `static`, Java instancie la classe (qui doit avoir un constructeur sans argument) puis appelle `main()` sur l'objet créé.
76
+
77
+
::: info
78
+
La version classique `public static void main(String[] args)` reste parfaitement valide. La nouvelle syntaxe est simplement une alternative plus concise, idéale pour les petits programmes et l'apprentissage.
Java 25 va encore plus loin : il est possible d'écrire un programme sans même déclarer de classe ! On écrit directement les méthodes et champs dans le fichier source. Le compilateur crée automatiquement une classe implicite.
84
+
85
+
```java
86
+
// Fichier HelloWorld.java — pas de déclaration de classe !
87
+
void main() {
88
+
System.out.println("Hello, World!");
89
+
}
90
+
```
91
+
92
+
On peut même y déclarer des méthodes auxiliaires et des champs :
93
+
94
+
```java
95
+
// Fichier Greeting.java
96
+
String greeting() { return"Hello, World!"; }
97
+
98
+
void main() {
99
+
System.out.println(greeting());
100
+
}
101
+
```
102
+
103
+
::: warning Attention
104
+
Un fichier source compact doit obligatoirement contenir une méthode `main` exécutable. La classe implicite créée par le compilateur n'a pas de nom utilisable dans le code source (on ne peut pas l'instancier avec `new`).
105
+
:::
106
+
107
+
::: info Imports automatiques
108
+
Dans un fichier source compact, toutes les classes publiques du module `java.base` sont automatiquement importées (comme si `import module java.base;` était présent en haut du fichier). Cela inclut `java.util.List`, `java.io.File`, `java.util.stream.Stream`, etc.
109
+
:::
110
+
111
+
Cette approche progressive (compact → classe explicite → projet structuré) permet aux débutants de se concentrer sur la logique avant de découvrir les concepts d'encapsulation et de modularité.
Copy file name to clipboardExpand all lines: docs/cours/java/8-classes.md
+56-1Lines changed: 56 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -64,7 +64,7 @@ Si vous ne définissez pas de constructeur, Java en crée un par défaut (sans a
64
64
65
65
Parfois, on souhaite proposer plusieurs façons de créer un objet, avec plus ou moins d’informations. Pour éviter de répéter du code, on peut faire appel à la délégation de constructeurs : un constructeur peut en appeler un autre de la même classe, en passant des valeurs par défaut.
66
66
67
-
**Attention: l’appel à un autre constructeur (`this(...)`) doit toujours être la première instruction du constructeur.**
67
+
**Attention (avant Java 25) : l'appel à un autre constructeur (`this(...)`) doit toujours être la première instruction du constructeur.**_(Voir la section [Nouveauté Java 25](#nouveauté-java-25--corps-de-constructeurs-flexibles-flexible-constructor-bodies) pour l'évolution de cette règle.)_
68
68
69
69
Exemple :
70
70
@@ -93,7 +93,62 @@ public class Personne{
93
93
::: tip Pourquoi déléguer ?
94
94
Cela permet d’éviter la duplication de code et de centraliser la logique d’initialisation.
95
95
:::
96
+
### Nouveauté Java 25 : corps de constructeurs flexibles (Flexible Constructor Bodies)
96
97
98
+
Avant Java 25, l'appel à `this(...)` ou `super(...)`**devait obligatoirement** être la première instruction d'un constructeur. Cela empêchait toute validation ou transformation des arguments avant la délégation.
99
+
100
+
**Problème avant Java 25 :**
101
+
102
+
```java
103
+
publicclassPersonne {
104
+
privateString nom;
105
+
106
+
publicPersonne(Stringnom) {
107
+
// ❌ Impossible de valider `nom` avant d'appeler this(...) ou super(...)
108
+
// if (nom == null) throw new IllegalArgumentException("Le nom ne peut pas être null");
109
+
this.nom = nom;
110
+
}
111
+
}
112
+
```
113
+
114
+
Avec Java 25 (JEP 513), on peut désormais écrire du code **avant** l'appel à `this(...)` ou `super(...)`, dans ce qu'on appelle le **prologue** du constructeur :
115
+
116
+
```java
117
+
publicclassPersonne {
118
+
privateString nom;
119
+
privateString prenom;
120
+
121
+
publicPersonne(Stringnom) {
122
+
// ✅ Java 25 : on peut valider et transformer AVANT la délégation
123
+
if (nom ==null) {
124
+
thrownewIllegalArgumentException("Le nom ne peut pas être null");
125
+
}
126
+
String nomMajuscule = nom.toUpperCase();
127
+
this(nomMajuscule, "Inconnu"); // délégation après le prologue
128
+
}
129
+
130
+
publicPersonne(Stringnom, Stringprenom) {
131
+
this.nom = nom;
132
+
this.prenom = prenom;
133
+
}
134
+
}
135
+
```
136
+
137
+
::: warning Restrictions dans le prologue
138
+
Dans le prologue (avant `this(...)` ou `super(...)`), vous **ne pouvez pas** :
139
+
- accéder à `this` (ni lire ni écrire les champs de l'instance en cours de construction)
140
+
- appeler des méthodes d'instance
141
+
142
+
Vous pouvez uniquement travailler avec les paramètres du constructeur et des variables locales.
| Validation des arguments | Après la délégation uniquement | Avant la délégation |
150
+
| Accès à `this` dans le prologue | — | ❌ Interdit |
151
+
:::
97
152
## Redéfinition (surcharge) de constructeur
98
153
99
154
Il est possible de définir plusieurs constructeurs dans une même classe, à condition qu’ils aient des signatures différentes (nombre ou type des arguments). C’est ce qu’on appelle la **surcharge**.
0 commit comments