JAVA – QCM & EXERCICES (INTRODUCTION / ÉLÉMENTS DE BASE)
Java – QCM & Exercices (Introduction / Éléments de base)
Basé sur le cours « Java / Introduction » (Sun/Oracle, JVM/JRE, applets & Web Start, différences C/C++, commentaires, identificateurs & mots réservés, types primitifs & littéraux, conversions & casting, chaînes & wrappers, affichage console).
QCM (30 questions)
Chaque question a une seule bonne réponse. Solutions masquées Cliquez sur « Afficher la solution » pour révéler.
Q1. Origine de Java
Java’s origin
A. Netscape, dirigé par Brendan Eich
B. Sun Microsystems, dirigé par James Gosling
C. Microsoft, dirigé par Anders Hejlsberg
D. IBM, dirigé par Bjarne Stroustrup
✅ Réponse : B. Sun Microsystems, James Gosling. Explication : Java a été conçu chez Sun par une équipe dirigée par James Gosling, officiellement lancé en 1995.
Q2. « Write Once, Run Anywhere » signifie…
What does WORA imply?
A. Code source unique mais bytecode spécifique à chaque OS
B. Bytecode unique exécuté par des JVM multiplateformes
C. Compilation native pour chaque plateforme
D. Exécution uniquement dans un navigateur
✅ Réponse : B. Explication : Le bytecode est indépendant de la plateforme et s’exécute via une JVM adaptée à l’OS.
Q3. Lancement d’une application Java en ligne de commande
How to launch a Java application
A. javac MonApp
B. java MonApp
C. java MonApp.java
D. jre MonApp.class
✅ Réponse : B. Explication : On compile avec javac pour obtenir des .class, puis on exécute la classe principale avec java (sans extension).
Q4. Quelle affirmation est vraie à propos des Applets ?
Truth about Applets
A. Accès illimité au système de fichiers local
B. Exécutées dans le navigateur et soumises au sandboxing
C. Remplacées par Java Web Start puis massivement adoptées
D. Toujours la méthode recommandée en 2025
✅ Réponse : B. Explication : Les Applets s’exécutaient dans le navigateur, avec des restrictions de sécurité (sandbox). Elles sont désormais obsolètes.
Q5. Différences Java vs C/C++ : laquelle est exacte ?
Difference Java vs C/C++
A. Java autorise l’héritage multiple de classes
B. Java supprime goto, pointeurs explicites et #include
C. Java utilise des fichiers headers (.h)
D. Java autorise la surcharge d’opérateurs
✅ Réponse : B. Explication : Java retire les pointeurs explicites, le préprocesseur, les headers, goto, l’héritage multiple de classes et la surcharge d’opérateurs.
Q6. Méthode main valide
Valid main signature
A. public void main(String[] args)
B. public static void main(String[] args)
C. static public int main(String args)
D. public static void main(String args)
✅ Réponse : B. Explication : La signature standard est public static void main(String[] args).
Q7. Commentaire de documentation
Javadoc comment
A. // ...
B. /* ... */
C. /** ... */
D. /// ...
✅ Réponse : C. Explication : Les blocs /** ... */ sont interprétés par javadoc.
Q8. Règles d’identificateurs
Identifier rules
A. Doivent commencer par une lettre, _, ou un symbole monétaire (déconseillé)
B. Peuvent commencer par un chiffre
C. Indifférence à la casse
D. Peuvent utiliser des mots réservés si suffixés
✅ Réponse : A. Explication : Sensibles à la casse, ne commencent pas par chiffre, mots-clés interdits.
Q9. Mots réservés : lequel n’est pas un mot-clé Java ?
Which is not a Java keyword?
A. strictfp
B. volatile
C. foreach
D. transient
✅ Réponse : C. Explication : Il n’existe pas de mot-clé foreach en Java (la boucle « enhanced for » utilise for(Type x : xs)).
Q10. Type boolean
Boolean type
A. Peut être converti implicitement en int (0/1)
B. Valeurs littérales true/false uniquement
C. Est signé et occupe 8 bits
D. Peut être additionné
✅ Réponse : B. Explication : Pas de conversion implicite en 0/1 en Java.
Q11. char en Java
char in Java
A. Entier signé 8 bits (Latin-1)
B. Unicode 16 bits, non signé
C. UTF-8 variable
D. ASCII 7 bits
✅ Réponse : B. Explication :char représente un code Unicode 16 bits.
Q12. Littéraux entiers
Integer literals
A. 0377 est décimal
B. 0xFF est binaire
C. 0b1011 est binaire
D. 433L est un int
✅ Réponse : C. Explication :0b indique le binaire (Java 7+). 0377 est octal, 0xFF hexadécimal, 433L un long.
A. Autorisés n’importe où, y compris au début et à la fin
B. Autorisés entre chiffres (Java 7+), pas aux extrémités ni près du préfixe
C. Interdits
D. Réservés aux flottants uniquement
✅ Réponse : B. Explication : Ex. 10_000_000 valide ; _100 ou 100_ invalides.
Q15. Flottants et égalité
Floating-point equality
A. Les doubles représentent exactement tous les réels
B. Comparer avec un epsilon toléré
C. NaN == NaN est vrai
D. Pas d’infinis en Java
✅ Réponse : B. Explication : IEEE 754 : approximations, NaN != NaN, infinis existent.
Q16. Affichage console : quelle chaîne s’affiche ?
Console output
int size = 123; char unit = 'm';
System.out.println("Longueur : " + size + " " + unit);
A. Longueur : size unit
B. Longueur : 123 m
C. Longueur : 123 'm'
D. Longueur : 123 (sans unité)
✅ Réponse : B.
Q17. Promotion et conversion
Widening vs narrowing
A. int → long est restrictive
B. long → double est élargissante
C. double → float est élargissante
D. char → short est élargissante
✅ Réponse : B. Explication :int→long élargissante, double→float restrictive, char↔short attention au signe.
Q18. Casting explicite requis
When is explicit cast required?
A. int i = 17; byte b = (byte)i;
B. long L = 25; double d = L;
C. float f = 3.4f; double d = f;
D. int i = 5; long L = i;
✅ Réponse : A. Explication :int→byte est restrictive → cast obligatoire.
Q19. Chaînes vs char
String vs char literal
A. 'A' est un String
B. "A" est un char
C. 'A' est un char, "A" est un String
D. Les deux sont des char
✅ Réponse : C.
Q20. Wrappers : conversion String → int
String to int
A. Integer.valueOf(s).intValue()
B. Integer.parseInt(s)
C. new Integer(s)
D. String.toInt(s)
✅ Réponse : B. (A. est aussi possible en deux étapes, mais la méthode canonique est parseInt.)
Q21. Sortie console : quelle(s) méthode(s) ?
Console printing
A. System.out.print affiche sans retour ligne
B. System.out.println ajoute un retour ligne
C. A et B
D. Ni A ni B
✅ Réponse : C.
Q22. Java Web Start
Java Web Start
A. Déploiement par le Web, cache local, remplaçant des Applets
B. Un compilateur JIT
C. Un serveur d’applications
D. Un framework de tests
✅ Réponse : A.
Q23. Robustesse Java
Java robustness
A. Gestion mémoire manuelle
B. Garbage Collector
C. Pointeurs arithmétiques
D. Goto pour gérer erreurs
✅ Réponse : B.
Q24. Multitâche en Java
Multithreading in Java
A. Non supporté par le langage
B. Support intégré (threads)
C. Réservé aux serveurs
D. Extension optionnelle
✅ Réponse : B.
Q25. null est :
About null
A. Un mot-clé et un littéral prédéfini
B. Une instance de Object
C. Une chaîne vide
D. Zéro
✅ Réponse : A. (Littéral prédéfini non typé représentant l’absence de référence.)
Q26. Quelle ligne provoque une erreur de compilation ?
Which line won’t compile?
int i = 17;
byte b = 4;
b = i; // (1)
b = (byte)i; // (2)
long L = i; // (3)
double d = L; // (4)
A. (1)
B. (2)
C. (3)
D. (4)
✅ Réponse : A. int→byte nécessite un cast explicite.
Q27. Types référence
Reference types
A. Stockent la valeur directement dans la variable
B. Stockent une référence vers l’objet en mémoire
C. S’appliquent uniquement aux tableaux
D. N’existent pas en Java
✅ Réponse : B.
Q28. Littéraux flottants
Floating literals
A. 17d est un float
B. -4.032F est un float
C. 6.02e23f est un double
D. 1.0 est un float par défaut
✅ Réponse : B. (Sans suffixe : double par défaut ; suffixe f/F → float.)
Q29. Quelle chaîne est correcte pour afficher un guillemet ?
How to print a quote?
A. "Le caractère " se nomme 'guillemet'"
B. "Le caractère \\" se nomme 'guillemet'"
C. "Le caractère \\"" se nomme 'guillemet'"
D. 'Le caractère \" se nomme "guillemet"'
✅ Réponse : C. (\\" insère un " dans la chaîne.)
Q30. Nom de classe et fichier source
Class name vs file name
A. Peuvent être différents sans impact
B. Doivent correspondre (classe publique → fichier NomClasse.java)
C. Se terminent toujours par .class
D. Dépendent du package uniquement
✅ Réponse : B. En Java, une classe public doit être dans un fichier du même nom.
Exercices EN JAVA (3 études de cas)
Énoncé FR + bref résumé EN. Solutions masquées
Exercice 1 — GeniusNetworkSarl Location de voitures
Car rental domain model & basic operations
Contexte (FR) : GeniusNetworkSarl gère une flotte de véhicules multi-marques (électrique/thermique/hybride). Chaque véhicule possède : immatriculation unique, marque, modèle, catégorie (citadine, berline, SUV), énergie, kilométrage, état (DISPONIBLE, LOUE, MAINTENANCE). Les contrats de location incluent : client (nom, email, permis), dates de début/fin, kilométrage inclus, tarif/jour, caution, options (GPS, siège enfant), et surcoût au km supplémentaire. Il faut : (1) modéliser les classes ; (2) implémenter l’ouverture/fermeture d’un contrat ; (3) calculer le montant dû à la restitution (jours facturés, options, km sup., pénalités retard).
Context (EN): Model vehicles and rentals, open/close contracts, compute final bill with options and extra km/late penalties.
Pistes de solution :
• Modèle (UML simplifié) : Vehicule{immatriculation, marque, modele, categorie, energie, km, etat} ; Client{id, nom, email, permis} ; OptionLocation{code, libelle, prixJour} ; ContratLocation{id, vehicule, client, debut, finPrevue, finReelle?, kmDepart, kmRetour?, tarifJour, caution, options[], etatContrat}.
• Règles : ouverture = vérifier disponibilité véhicule & validité permis ; passage état véhicule → LOUE. Fermeture = saisir finReelle, kmRetour, repasser véhicule → DISPONIBLE ou MAINTENANCE selon check.
• Calcul : jours = max(1, daysBetween(debut, finReelle)) (arrondi supérieur si facturation par jour entamé) ; totalJours = jours * tarifJour ; totalOptions = somme prixJour * jours ; kmSupp = max(0, (kmRetour - kmDepart) - kmInclus) ; surcout = kmSupp * prixKm ; retardJours = max(0, daysBetween(finPrevue, finReelle)) ; penaliteRetard = retardJours * coefRetard * tarifJour ; montant = somme + éventuelles remises/dépôt.
• Esquisse Java : classes Vehicule, Client, ContratLocation, OptionLocation, Enum EtatVehicule, Categorie, Energie. Méthodes ouvrir(), fermer(), calculerMontant(). Utiliser BigDecimal pour les montants ; validations via exceptions.
• Tests : cas de dépassement km, retour anticipé, retour en retard, véhicule en maintenance.
Exercice 2 — Nkilitech Gestion des salaires & primes
Payroll with base pay, bonuses, taxes
Contexte (FR) : Nkilitech doit calculer les fiches de paie mensuelles. Un employé possède : matricule, nom, catégorie (Ingénieur, Technicien, Admin), baseSalaire, tauxImposition, nbEnfants. Les éléments variables : heuresSup (x1.25/x1.5), primePerformance (A/B/C → pourcentages), primeAnciennete (par palier), retenues sociales. Exigences : (1) modéliser les classes ; (2) écrire une méthode calculerSalaireNet() ; (3) générer un récapitulatif texte formaté (console) avec détails ligne à ligne.
Context (EN): Compute net salary with overtime, performance/tenure bonuses, taxes, and social deductions; print a readable payslip.
Pistes de solution :
• Modèle : Employe{matricule, nom, categorie, baseSalaire, tauxImposition, nbEnfants, anciennete} ; BulletinPaie{employe, mois, heuresSup25, heuresSup50, primePerf, primeAnciennete, retenuesSoc} ; Enums Categorie, Perf.
• Formules : brut = base + (hSup25 * tauxHoraire * 1.25) + (hSup50 * tauxHoraire * 1.5) + primePerf% * base + primeAnciennete% * base ; imposable = brut − retenuesSoc ; impots = imposable * tauxImposition * (facteur quotient familial basé sur nbEnfants) ; net = brut − retenuesSoc − impots.
• Java : méthodes pures dans BulletinPaie, constantes pour pourcentages ; BigDecimal pour éviter les erreurs de flottants ; String.format/System.out.printf pour l’édition console.
• Tests : perf A vs C, sans enfants vs 3 enfants, heures sup nulles vs élevées.
Contexte (FR) : GeniusClassrooms gère des Formations (intitulé, code, ECTS, capacité), des Étudiants (matricule, nom, email), et des Inscriptions (date, statut : PREREGISTRE, VALIDE, ANNULE). Règles : capacité maximale par formation ; prérequis (liste de codes) ; calcul de la charge ECTS par étudiant ; export d’un récapitulatif sur la console (par formation et par étudiant).
Pistes de solution :
• Modèle : Formation{code, titre, ects, capacite, prerequis:List<String>, inscrits:Set<Etudiant>} ; Etudiant{matricule, nom, email} ; Inscription{etudiant, formation, date, statut}.
• Règles : lors d’une inscription, vérifier capacité et que l’étudiant possède les codes des prérequis (simuler l’historique validé).
• Fonctions : inscrire(), annuler(), valider() ; calculer totalECTS(Etudiant) ; générer un listing : par formation (occup./capacité) et par étudiant (liste formations, ECTS).
• Java : utiliser Map<Etudiant, Set<Formation>> pour l’ECTS cumulé, Enum StatutInscription. Sortie via System.out.println.
RAPPELS
Utiliser Integer.parseInt() pour convertir une chaîne en entier.
Multiplier deux entiers pour obtenir le total des ventes.
Utiliser String.valueOf() ou Double.toString() pour convertir un double en chaîne de caractères.
Additionner un entier et un long.
Effectuer un casting explicite d'un long en int.
Utiliser une conversion automatique d'un float en double.
Afficher une combinaison d'une chaîne et d'un entier dans System.out.println.
Convertir un long en String pour affichage.
Utiliser (int) pour convertir un double en entier.
Additionner un bonus à un total de ventes en long.
Convertir une chaîne en double en utilisant Double.parseDouble().
Utiliser String.valueOf() pour convertir un float en chaîne.
Ajouter une commande au total d'exemplaires.
Utiliser une conversion automatique d'un int en double.
Effectuer un casting explicite d'un double en int.
Utiliser une conversion automatique pour calculer le prix réduit en double.
Convertir un double en chaîne avec String.valueOf().
Effectuer une conversion explicite d'un long en int.
Utiliser Float.parseFloat() pour convertir une chaîne en float.
Afficher le taux de réduction sous forme de chaîne.
Calculer le prix total en soustrayant une réduction.
Additionner deux valeurs après conversion en long.
Utiliser String.valueOf() pour convertir un int en chaîne.
Afficher un double dans System.out.println.
Utiliser une conversion automatique pour combiner un int et un double.
Calculer le total après réduction avec un double.
Afficher le total en combinant une chaîne et un double.
Additionner une commande au total des ventes avec un long.
Utiliser Double.toString() pour convertir un double en chaîne.
Utiliser (long) pour convertir un int en long.
Si vous avez trouvé les exercices corrigés en Java de Mr JoëlYk intéressants et utiles, pourquoi ne pas les partager avec d'autres personnes qui pourraient également en bénéficier ? Partagez ce lien sur les réseaux sociaux ou envoyez-le à vos amis et collègues. Vous pourriez aider quelqu'un à améliorer ses compétences en programmation ou à trouver des solutions à des problèmes complexes. N'oubliez pas que la connaissance doit être partagée pour grandir. Merci pour votre soutien et votre partage !
Contact WhatsApp : +237 652027193 | Réaliser Par Joël_Yk