0% ont trouvé ce document utile (0 vote)
12 vues10 pages

Java Moyen

Ce document est un examen de Java pour l'année 2025, comprenant plusieurs exercices sur des concepts tels que l'encapsulation, l'héritage, la surcharge de méthodes, et la correction de code erroné. Les étudiants doivent répondre à des questions théoriques, corriger des erreurs de code, et écrire des programmes utilisant des collections, des expressions lambda, et Swing. Chaque exercice est noté et nécessite des justifications claires pour les réponses fournies.

Transféré par

mouadfekkak2002
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
12 vues10 pages

Java Moyen

Ce document est un examen de Java pour l'année 2025, comprenant plusieurs exercices sur des concepts tels que l'encapsulation, l'héritage, la surcharge de méthodes, et la correction de code erroné. Les étudiants doivent répondre à des questions théoriques, corriger des erreurs de code, et écrire des programmes utilisant des collections, des expressions lambda, et Swing. Chaque exercice est noté et nécessite des justifications claires pour les réponses fournies.

Transféré par

mouadfekkak2002
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Examen Java – Moyen

2025

Instructions :
— Indiquez clairement vos nom, prénom et groupe.
— Les réponses doivent être rédigées de façon claire.
— Justifiez vos réponses quand c’est nécessaire.
— Tout document interdit.

Exercice 1 : Questions de cours (4 pts)


1. Qu’est-ce que l’encapsulation en Java ? Donnez un exemple simple de code.
2. Donnez la définition de l’héritage en Java.
3. Expliquez la surcharge (overloading) des méthodes. Donnez un exemple simple.
4. Que signifie le mot-clé final utilisé avec une classe ou une méthode ?
5. Qu’est-ce qu’un constructeur ? Expliquez son rôle.

1
Exercice 2 : Correction d’un code erroné (4 pts)
Le code ci-dessous contient plusieurs erreurs. Relevez et corrigez chaque erreur :
1 import java . util .*;
2 public class Main {
3 public static void main ( String [] args ) {
4 ArrayList < Integer > liste = null ;
5 liste . add (10) ;
6 liste . add (15) ;
7 for ( int i =0; i <= liste . size () ; i ++) {
8 System . out . println ( liste . get ( i ) ) ;
9 }
10 Fichier f = new Fichier ( " notes . txt " ) ;
11 System . out . println ( f . lireContenu () ) ;
12 }
13 }
14

15 class Fichier {
16 private String nom ;
17 public Fichier ( String nom ) { nom = nom ; }
18 public String lireContenu () throws IOException {
19 FileReader fr = new FileReader ( nom ) ;
20 return " contenu " ;
21 }
22 }

Exercice 3 : Exécution d’un code (4 pts)


Voici un code Java. Expliquez ce qu’il affiche et pourquoi.
1 ArrayList < String > noms = new ArrayList < >() ;
2 noms . add ( " Ali " ) ;
3 noms . add ( " Samir " ) ;
4 noms . add ( " Anas " ) ;
5 for ( int i = 0; i < noms . size () ; i ++) {
6 if ( noms . get ( i ) . startsWith ( " A " ) ) {
7 noms . remove ( i ) ;
8 }
9 }
10 System . out . println ( noms ) ;

a) Quel est le résultat affiché ? Expliquez ligne par ligne.


b) Que se passe-t-il si on remplace ArrayList par LinkedList ?
c) Proposez une version correcte du code pour supprimer tous les noms commençant
par « A ».

2
Exercice 4 : Collections (ArrayList ou LinkedList) (4 pts)
a) (ArrayList) Écrivez un code Java pour :
— Créer une ArrayList d’entiers
— Ajouter : 5, 8, 12, 16, 20
— Remplacer 12 par 24
— Supprimer 8
— Afficher chaque élément de la liste sur une ligne différente
b) (LinkedList) Écrivez un code Java pour :
— Créer une LinkedList de chaînes
— Ajouter : "orange", "banana", "apple"
— Ajouter "lemon" au début, "peach" à la fin
— Supprimer le premier élément
— Afficher chaque élément de la liste

Exercice 5 : Lambda (2 pts)


a) Écrivez une expression lambda pour calculer le carré d’un entier et affichez le
résultat pour 7.
b) Utilisez une interface fonctionnelle prédéfinie de Java (Function, Predicate, Consumer
ou Supplier) pour afficher si un nombre est pair.

Exercice 6 : Swing (2 pts)


Réalisez une fenêtre de connexion simple avec deux zones de texte (login et mot de
passe) et un bouton « Connexion ». Quand on clique sur le bouton, affichez un message
de bienvenue si le login vaut « admin » et le mot de passe « 1234 », sinon affichez « Échec
de connexion ».

3
CORRECTION DÉTAILLÉE
Exercice 1 : Questions de cours
1. Encapsulation en Java : L’encapsulation est un principe fondamental de la pro-
grammation orientée objet qui consiste à cacher les détails internes d’une classe
(les attributs) et à n’y accéder que via des méthodes appelées getters (pour lire
la valeur) et setters (pour modifier la valeur). Ceci protège les données contre des
modifications imprévues et facilite la maintenance du code.
Exemple :
1 public class Personne {
2 private String nom ; // attribut prive
3

4 // Getter pour acceder a l ’ attribut


5 public String getNom () {
6 return nom ;
7 }
8

9 // Setter pour modifier l ’ attribut


10 public void setNom ( String nom ) {
11 this . nom = nom ;
12 }
13 }

Ici, l’attribut nom ne peut être lu/modifié que par les méthodes publiques.
2. Définition de l’héritage : L’héritage permet à une classe (appelée sous-classe ou
enfant) de récupérer les attributs et méthodes d’une autre classe (la super-classe
ou parent). Cela évite de dupliquer le code et permet d’étendre ou de spécialiser le
comportement d’une classe existante.
1 class Animal {
2 public void crier () { System . out . println ( " Cri d ’ animal " ) ;
}
3 }
4 class Chien extends Animal {
5 public void crier () { System . out . println ( " Ouaf ! " ) ; }
6 }

Ici, Chien hérite de Animal et peut redéfinir la méthode crier().


3. Surcharge (overloading) des méthodes : La surcharge signifie définir plusieurs
méthodes portant le même nom dans une classe, mais avec des signatures différentes
(différent nombre/type d’arguments). Exemple :
1 public int additionner ( int a , int b ) { return a + b ; }
2 public double additionner ( double a , double b ) { return a + b ;
}

Selon le type d’arguments, la bonne méthode sera utilisée.

4
4. Le mot-clé final :
— final sur une variable : sa valeur ne peut plus changer (constante).
— final sur une méthode : la méthode ne peut pas être redéfinie dans une sous-
classe.
— final sur une classe : la classe ne peut pas être héritée.
Exemple :
1 final class MaClasse {}
2 final int N = 10;
3 final void maMethode () {}

5. Constructeur : Un constructeur est une méthode spéciale d’une classe qui porte
le même nom que la classe. Il sert à initialiser les attributs lors de la création d’un
objet.
1 public class Voiture {
2 private String modele ;
3 public Voiture ( String m ) {
4 this . modele = m ; // initialisation
5 }
6 }

À chaque new Voiture("Clio"), le constructeur initialise modele.

Exercice 2 : Correction d’un code erroné


Erreur 1 : ArrayList<Integer> liste = null; Problème : liste est null, donc
on ne peut pas appeler add dessus. Correction : il faut initialiser la liste :
1 ArrayList < Integer > liste = new ArrayList < >() ;

Erreur 2 : Boucle for(int i=0; i<=[Link](); i++)


Problème : On utilise i <= [Link](), donc à la dernière itération, i == [Link]() ;
or, l’index maximum dans une liste est [Link]() - 1.
Correction : Il faut mettre i < [Link]() :
1 for ( int i =0; i < liste . size () ; i ++)

Erreur 3 : Dans le constructeur de Fichier, public Fichier(String nom) { nom


= nom; } Ici, on affecte le paramètre à lui-même (cela ne fait rien).
Correction : Il faut stocker le paramètre dans l’attribut :
1 public Fichier ( String nom ) { this . nom = nom ; }

Erreur 4 : lireContenu() déclare throws IOException mais la méthode main ne


le gère pas (et FileReader doit être importé).
Correction : Gérer l’exception dans main ou dans lireContenu avec try/catch.
Erreur 5 : Manque l’import de [Link].*; pour FileReader.

5
Code corrigé :
1 import java . util .*;
2 import java . io .*;
3

4 public class Main {


5 public static void main ( String [] args ) {
6 ArrayList < Integer > liste = new ArrayList < >() ;
7 liste . add (10) ;
8 liste . add (15) ;
9 for ( int i =0; i < liste . size () ; i ++) {
10 System . out . println ( liste . get ( i ) ) ;
11 }
12 Fichier f = new Fichier ( " notes . txt " ) ;
13 try {
14 System . out . println ( f . lireContenu () ) ;
15 } catch ( IOException e ) {
16 System . out . println ( " Erreur de lecture fichier " ) ;
17 }
18 }
19 }
20

21 class Fichier {
22 private String nom ;
23 public Fichier ( String nom ) { this . nom = nom ; }
24 public String lireContenu () throws IOException {
25 FileReader fr = new FileReader ( nom ) ;
26 // ... lecture reelle du fichier ici
27 fr . close () ;
28 return " contenu " ;
29 }
30 }

Exercice 3 : Exécution d’un code


Code :
1 ArrayList < String > noms = new ArrayList < >() ;
2 noms . add ( " Ali " ) ;
3 noms . add ( " Samir " ) ;
4 noms . add ( " Anas " ) ;
5 for ( int i = 0; i < noms . size () ; i ++) {
6 if ( noms . get ( i ) . startsWith ( " A " ) ) {
7 noms . remove ( i ) ;
8 }
9 }
10 System . out . println ( noms ) ;

6
Explication ligne par ligne :
— On crée une ArrayList de chaînes.
— On ajoute 3 éléments : "Ali", "Samir", "Anas".
— On parcourt la liste avec i de 0 à [Link]()-1.
— Si l’élément courant commence par « A », on le retire.
Attention : Lorsqu’on enlève un élément de la liste pendant qu’on la parcourt avec
un index qui augmente, tous les éléments après sont décalés à gauche.
Déroulement :
— i = 0 : [Link](0) == "Ali" (commence par "A"), donc on enlève "Ali" (la liste
devient ["Samir", "Anas"]), i=0.
— i = 1 : (après l’enlèvement) [Link](1) == "Anas" (car "Samir" est à l’index 0),
commence par "A", donc on enlève "Anas".
— La liste devient ["Samir"].
La boucle s’arrête car [Link]() == 1.
Affichage final :
1 [ Samir ]

Remarque : Ce code supprime les éléments à partir du début, mais à cause du


décalage des indices, certains éléments peuvent être ignorés.
Si on remplace ArrayList par LinkedList ? Même comportement, car la méthode
remove(i) existe dans LinkedList. Mais en général, il vaut mieux éviter de supprimer
pendant l’itération.
Version correcte : On parcourt la liste à l’envers (des grands indices vers les petits)
ou on utilise un Iterator :
1 for ( int i = noms . size () - 1; i >= 0; i - -) {
2 if ( noms . get ( i ) . startsWith ( " A " ) ) {
3 noms . remove ( i ) ;
4 }
5 }

Ou bien :
1 Iterator < String > it = noms . iterator () ;
2 while ( it . hasNext () ) {
3 if ( it . next () . startsWith ( " A " ) ) {
4 it . remove () ;
5 }
6 }

7
Exercice 4 : Collections (ArrayList ou LinkedList)
a) ArrayList d’entiers :
1 ArrayList < Integer > liste = new ArrayList < >() ;
2 liste . add (5) ;
3 liste . add (8) ;
4 liste . add (12) ;
5 liste . add (16) ;
6 liste . add (20) ;
7

8 // Remplacer 12 par 24
9 int index = liste . indexOf (12) ;
10 if ( index != -1) liste . set ( index , 24) ;
11

12 // Supprimer 8
13 liste . remove ( Integer . valueOf (8) ) ;
14

15 // Afficher tous les elements


16 for ( Integer val : liste )
17 System . out . println ( val ) ;

Explications : add ajoute à la fin. set permet de modifier une valeur à un index.
remove([Link](8)) supprime la valeur 8 (sinon, remove(8) supprime à l’index
8).
b) LinkedList de chaînes :
1 LinkedList < String > liste = new LinkedList < >() ;
2 liste . add ( " orange " ) ;
3 liste . add ( " banana " ) ;
4 liste . add ( " apple " ) ;
5

6 // Ajouter " lemon " au debut


7 liste . addFirst ( " lemon " ) ;
8

9 // Ajouter " peach " a la fin


10 liste . addLast ( " peach " ) ;
11

12 // Supprimer le premier element


13 liste . removeFirst () ;
14

15 // Afficher chaque element


16 for ( String fruit : liste )
17 System . out . println ( fruit ) ;

Explications : Les méthodes addFirst, addLast, removeFirst sont spécifiques à Lin-


kedList. for-each permet d’afficher tous les éléments.

8
Exercice 5 : Lambda
a) Calculer le carré d’un entier avec une expression lambda :
1 interface Calcul {
2 int op ( int x ) ;
3 }
4 Calcul carre = x -> x * x ;
5 System . out . println ( carre . op (7) ) ; // Affiche 49

Explications : Une interface fonctionnelle a une seule méthode abstraite. Ici, on déclare
Calcul avec une méthode op. L’expression x -> x * x signifie « prends x, retourne x*x ».
b) Utiliser un Predicate pour vérifier si un nombre est pair :
1 import java . util . function . Predicate ;
2 Predicate < Integer > estPair = n -> n % 2 == 0;
3 System . out . println ( estPair . test (10) ) ; // Affiche true
4 System . out . println ( estPair . test (11) ) ; // Affiche false

Explications : Predicate<Integer> représente une fonction qui prend un entier et re-


tourne un booléen. Ici, elle teste si le nombre est pair.

Exercice 6 : Swing
Fenêtre de connexion simple (explications détaillées) :
1. Créer une fenêtre JFrame
2. Ajouter deux champs de texte pour login et mot de passe (JTextField et
JPasswordField)
3. Ajouter un bouton JButton
4. Ajouter un gestionnaire d’événement (addActionListener) qui récupère les
valeurs des champs
5. Afficher un message avec JOptionPane selon le résultat

9
Exemple de code complet :
1 import javax . swing .*;
2 import java . awt .*;
3 import java . awt . event .*;
4

5 public class LoginSwing {


6 public static void main ( String [] args ) {
7 JFrame fen = new JFrame ( " Connexion " ) ;
8 fen . setSize (300 , 150) ;
9 fen . s etDe faul tClo seO pera tion ( JFrame . EXIT_ON_CLOSE ) ;
10 fen . setLocationRelativeTo ( null ) ;
11

12 JPanel panel = new JPanel () ;


13 panel . setLayout ( new GridLayout (3 ,2) ) ;
14

15 JLabel lblLogin = new JLabel ( " Login : " ) ;


16 JTextField txtLogin = new JTextField () ;
17 JLabel lblPwd = new JLabel ( " Mot de passe : " ) ;
18 JPasswordField txtPwd = new JPasswordField () ;
19 JButton btn = new JButton ( " Connexion " ) ;
20

21 panel . add ( lblLogin ) ; panel . add ( txtLogin ) ;


22 panel . add ( lblPwd ) ; panel . add ( txtPwd ) ;
23 panel . add ( new JLabel () ) ; panel . add ( btn ) ;
24

25 fen . add ( panel ) ;


26

27 btn . addActionListener ( new ActionListener () {


28 public void actionPerformed ( ActionEvent e ) {
29 String login = txtLogin . getText () ;
30 String pwd = new String ( txtPwd . getPassword () ) ;
31 if ( login . equals ( " admin " ) && pwd . equals ( " 1234 " ) ) {
32 JOptionPane . showMessageDialog ( fen , " Bienvenue !
");
33 } else {
34 JOptionPane . showMessageDialog ( fen , " chec de
connexion " ) ;
35 }
36 }
37 }) ;
38

39 fen . setVisible ( true ) ;


40 }
41 }

Explications :
— On utilise un JPanel avec un GridLayout pour bien aligner les champs.
— Les textes sont récupérés via getText() pour le login et getPassword() pour le
mot de passe.
— [Link] affiche une boîte de dialogue.

10

Vous aimerez peut-être aussi