Questions/Réponses #
Veuillez répondre mentalement ou sur papier à ces questions avant de regarder la réponse.
Certains étudiants aiment utiliser une Java Fundamentals Cheat Sheet (anglais) pour garder à l'esprit la syntaxe.
Comment faire ces exercices ? #
N'allez pas trop vite. Il ne sert à rien de lire la question et d'immédiatement lire la réponse. Le but des exercices est de vous amener à travailler la matière. Si vous ne faites que regarder les solutions, vous n'apprenez pas grand chose.
Réponses uniques? #
Les exercices comportent une solution vous permettant de comparer votre approche avec la nôtre. Il n'y a pas de solution unique aux problèmes en général. Vous pouvez arriver avec une solution qui est préférable ou moins bonne que celle que nous offrons. Pour faire ces questions, vous devez avoir fait toutes les lectures préalables. Vous disposez alors toujours des fondements nécessaires pour faire les exercices. Nous vous encourageons tout de même à faire vos propres recherches en complément de vos lectures. Dans certains cas, au sein de la solution que nous offrons, nous pouvons utiliser des notions techniques qui n'ont pas été vues directement dans le cours, mais qui devraient vous être facilement accessibles.
Question 1 #
Proposez une classe Etudiant dont le constructeur prend en paramètre un identifiant (sous la forme d'un entier) et qui comprend une méthode monIdentifiant retournant l'identifiant en question.
Réponse
Question 2 #
Combien de constructeurs est-ce qu'une classe peut avoir en Java?
Réponse
Une classe Java peut avoir autant de constructeurs qu'on le souhaite.
Question 3 #
Soit la classe suivante:
public class Patate {
static int y;
public Patate(int x) {
y = x;
}
public int nombre() {
return y;
}
}
Que va afficher le code suivant:
Patate z1 = new Patate(1);
Patate z2 = new Patate(2);
System.out.println(z1.nombre());
Réponse
La valeur 2. Le mot-clef static indique que la classe Patate n'a qu'une variable y partagée par toutes les instances de la classe.
Question 4 #
Écrivez une classe nommée Somme comprenant une méthode nommée additionne qui additionne deux nombres et retourne le résultat.
Réponse
public class Somme {
public int additionne(int a, int b) {
return a + b;
}
}
Question 5 #
Expliquez pourquoi la méthode donne de cette classe va toujours retourner la valeur 2.
public class Somme {
public void ajoute(int a) {
a = a + 1;
}
public int donne() {
int a = 2;
ajoute(a);
return a;
}
}
Réponse
Question 6 #
Expliquez pourquoi la méthode donne de cette classe va toujours retourner la valeur 3.
public class Variable {
public int a = 2;
public static void ajoute(Variable x) {
x.a = x.a + 1;
}
public int donne() {
Variable x = new Variable();
ajoute(x);
return x.a;
}
}
Réponse
Question 7 #
Écrivez une classe Puissance qui comprend une méthode nommée deux qui prend un entier et retourne l'entier mis au carré.
Réponse
public class Puissance {
public int deux(int a) {
return a * a;
}
}
Question 8 #
Expliquez pourquoi la méthode donne de cette classe va toujours retourner la valeur 2.
public class Variable {
public int a = 2;
public static void ajoute(Variable x) {
x = new Variable();
x.a = x.a + 1;
}
public int donne() {
Variable x = new Variable();
ajoute(x);
return x.a;
}
}
Réponse
Question 9 #
Pourquoi le bout de code suivant va générer une erreur à la compilation ?
class T {
private float x ;
private static int n ;
public static float test(){
return x*n;
}
}
Réponse
Une méthode statique ne peut accéder à un champ non statique comme la méthode statique test() tente de le faire avec le champ non statique x.
Question 10 #
On admet que la classe A existe.
Que peut-on en déduire quant au(x)constructeur (s) de la classe A si l’instruction suivante génère une erreur de compilation ayant trait au(x) constructeur(s) de A ?
A a = new A () ;
Réponse
A dispose d’au moins un constructeur (non par défaut) et tous ses constructeurs sont des constructeurs avec un argument.
Question 11 #
Est-ce qu'une méthode peut être à la fois static et private en java?
Réponse
Oui. La méthode ne peut être appelée que par les autres méthodes de la classe (soit les autres méthodes statiques ou les méthodes non-dynamiques).
Question 12 #
Quelle est la visibilité des attributs au sein de cette classe :
public class Joe {
public int x = 0;
protected int y = 0;
private int z = 0;
int t = 0;
}
Réponse
Question 13 #
Écrivez une classe représentant une valeur entière à laquelle je peux ajouter la valeur trois par l'entremise d'une méthode « public » nommée « patate ». La méthode doit retourner la valeur entière modifiée. Le constructeur doit me permettre d'initialiser la valeur entière. La classe doit n'avoir que des attributs « private ».
Réponse
public class Entier {
private int x = 0;
public Entier(int m) {
x = m;
}
public int patate() {
x += 3;
return x;
}
}
Question 14 #
Écrivez une classe représentant une valeur entière. Cette classe doit n'avoir qu'une seule méthode appelée « additionne » qui prend comme paramètre une instance de la classe et qui retourne une nouvelle instance de la classe. L'instance retournée doit comprendre la somme des deux valeurs entières.
Réponse
public class Entier {
private int x = 0;
public Entier(int m) {
x = m;
}
public Entier additionne(Entier z) {
return new Entier(z.x + x);
}
}
Question 15 #
Quelle est la différence entre public, private et protected pour un attribut ou une méthode en Java ?
Réponse
public : accessible partout ; private : accessible uniquement dans la classe ; protected : accessible dans la classe et ses sous-classes (même dans d’autres packages).
Question 16 #
Considérez le code suivant :
void afficher(String message) {}
int afficher(int nombre) { return nombre; }
void afficher(String message, int nombre) {}
Décrivez la signature de la méthode afficher(String message, int nombre)
et expliquez pourquoi ces trois méthodes peuvent coexister dans la même classe.
Réponse
La signature de la méthode afficher(String message, int nombre)
est composée des types et de l’ordre des paramètres, à savoir afficher(String, int)
. Ces trois méthodes peuvent coexister dans la même classe car elles ont des signatures différentes, c’est-à-dire un nombre ou un type de paramètres différent. En Java, la surcharge de méthode est permise tant que les signatures des méthodes sont différentes.
Question 17 #
Pourquoi la signature d’une méthode ne tient-elle pas compte du type de retour ? Donnez un exemple où deux méthodes auraient le même nom et les mêmes paramètres mais des types de retour différents, et expliquez pourquoi cela pose problème.
Réponse
La signature d’une méthode ne tient pas compte du type de retour, car cela rendrait l’appel de la méthode ambigu pour le compilateur. Par exemple, si on écrivait :
int calculer(int x);
double calculer(int x);
Le compilateur ne saurait pas quelle version utiliser lors d’un appel comme calculer(5)
, car le choix ne peut pas se faire uniquement sur le type de retour. C’est pourquoi Java interdit d’avoir deux méthodes avec le même nom et les mêmes paramètres, même si leur type de retour diffère.
Question 18 #
Considérez l’expression suivante en Java :
bool = (1 + 3 == 2) || f(x) || f(x);
Combien de fois la fonction f(x)
est-elle appelée lors de l’évaluation de cette expression ? Expliquez pourquoi.
Réponse
f(x)
n’est appelée qu’une seule fois. En Java, l’opérateur logique ||
(OU logique) est évalué de façon « paresseuse » (short-circuit). Dès qu’une des conditions est vraie, les suivantes ne sont pas évaluées. Ici, (1 + 3 == 2)
est faux, donc on évalue le premier f(x)
. Si ce premier appel retourne vrai, le second f(x)
n’est pas évalué. Si le premier retourne faux, alors le second est évalué. Mais dans tous les cas, au maximum un seul des deux appels à f(x)
sera exécuté.
Question 19 #
Vrai ou Faux : Le mot-clé "static" permet de créer une seule variable en mémoire pour plusieurs instances d'un objet?
Réponse
Vrai: le mot-clé static permet de créer une variable "pointant" vers une seule adresse en mémoire. Donc, si la classe Test possède une variable static, toutes les instances de la classe Test accèderont à la même variable en mémoire. Elles pourraient donc modifier cette valeur à tour de rôle.Question 20 #
Le code suivant est truffé d'erreurs. Veuillez énumérer les erreurs et les corriger.
public clas PleinErreurs {
public int entier = "Entier";
public static String string = new String("string");
public static void main(String[] args) {
entier += 33;
string = entier + string;
System.out.println(string)
}
}
Réponse
- Le mot clas : class
- Il manque le mot static devant la variable int entier
- On ne peut pas initialiser un int avec une chaîne de caractère. Mettre entier = 0;
- Ajouter un point-virgule à la fin du System.out.println
public class PleinErreurs {
public static int entier = 0;
public static String string = new String("string");
public static void main(String[] args) {
entier += 33;
string = entier + string;
System.out.println(string);
}
}
Le fait de faire : “entier + string” n’est pas une erreur. La JVM va convertir automatiquement le int en string suivant l’opération “+”.
Question 21 #
Expliquer pourquoi exercice1.resultat vaut 30 et non 80 à la fin de la méthode main. Que faudrait-il corriger dans le code suivant si on souhaite obtenir 80 ?
public class Exercice {
protected int numeroExercice = 1;
protected boolean reussi = false;
protected static short resultat = 0;
public static void main(String[] args) {
}
}
Réponse
Il faut enlever le qualifiant static à l'attribut result.Question 22 #
Soit les deux codes suivants :
1)
public class Main {
public static void main(String[] args) {
final int NOMBRE;
System.out.println((NOMBRE=10) + " Je suis un nombre final ");
}
}
2)
public class Main {
public static void main(String[] args) {
final int NOMBRE=0;
System.out.println((NOMBRE=10) + " Je suis un nombre final ");
}
}
Lequel renvoie une erreur ? Pourquoi n’y a-t-il pas d’erreur dans celui qui s’execute correctement ?
Réponse
Le code 2) renvoie une erreur. Le code 1) ne renvoie pas d’erreur, puisque nous pouvons fixer la valeur d'une constante déclarée finale après dans la déclaration, mais une seule fois.
Question 23 #
Vous avez à créer une classe qui selon une constante de type nombre entier présente dans la classe, le code doit afficher le bon nombre de mots de la phrase suivante : "Veni vidi vici". Vous ne pouvez qu'utiliser les opérateurs vus dans la leçon précédente (truc: opérateur à trois opérandes).
Réponse
Allez plus loin? #
Plusieurs étudiants apprécient la plateforme Jetbrains Academy pour aller plus loin et se pratiquer (en anglais seulement). Bien que Jetbrains Academy soit un service commercial, ils offrent une période d'essai sans frais. C'est sans aucune doute un excellent complément à notre cours.
Il y a aussi plusieurs manuels (en anglais) dédiés aux exercices que vous pouvez acquérir :
- Java Coding Problems: Improve your Java Programming skills by solving real-world coding challenges
- Java Cookbook: Problems and Solutions for Java Developers
Certains étudiants ne souhaitent pas dépenser davantage d'argent pour l'accès à des ressources supplémentaires. Et absolument rien ne vous y oblige. Nous offrons ces liens parce plusieurs étudiants considèrent que ces ressources supplémentaires sont utiles.