Java SE Flashcards
Quand a été élaboré Java?
Première version au début des années 90
Quelle est la différence entre un langage compilé et un langage interprété?
Dans quelle catégorie se situe JAVA?
La différence porte sur la manière dont on va passer du code source (écrit par le développeur) à un code machine qui seul sera compris du processeur.
Avec un langage interprété, il faut un interpréteur qui va traduire en temps réel et en même temps que l’exécution le code source en code machine.
Le langage compilé lui est traduit une fois pour toute par le compilateur en un fichier autonome exécutable.
En JAVA, les choses se passent en 2 temps:
1/ Le code source est d’abord compilé par le compilateur en byte code. Même si ce bytecode est proche du code machine, il n’est pas exécutable directement.
2/ Il faut le traduire en code machine. C’est la Java Virtual Machine (JVM) qui s’en charge. Elle peut le faire soit par interprétation, soit par compilation (avec le compiler Just in Time)
Comment s’appele le compilateur Java?
javac
Quel est le format d’un fichier Java compilé et quelle est son extension?
Le code source (extension .java) est compilé en byte code (extension .class)
En Java, les affectations de données à une variable on-t-elle lieu par valeur ou par référence?
Valeur pour les variable de type primitifs, référence pour les objets. Mais attention: Java doesn’t pass method arguments by reference; it passes them by value.
Les arguments sont-ils passés à une méthode par valeur ou référence?
La règle générale de Java est que les arguments sont passés par valeur. Cela signifie que l’appel de méthode se fait par copie des valeurs passées en argument et que chaque appel de méthode dispose de sa propre version des paramètres. Cela vaut de la même manière pour un argument de type primitif ou un objet.
Si une méthode f possède un argument int x, alors l’appel f(2) revient à créer, pour la durée de l’exécution de cet appel une nouvelle variable (de nom x) qui est initialisée à 2.
Si une méthode g possède un argument MyObject x, alors l’appel g(instanceDeMyObject) revient à créer, pour la durée de l’exécution de cet appel une nouvelle variable qui a pour valeur la référence de l’objet vers lequel pointe instanceDeMyObject. La méthode va donc manipuler une copie de la référence.
https://www.javaworld.com/article/2077424/learn-java-does-java-pass-by-reference-or-pass-by-value.html
Les variables locales peuvent-elle être initialisées par défaut?
Non, ce n’est le cas que pour les champs d’un objet.
Que fait la méthode equal()?
Cette méthode de la classe objet se contente de comparer les adresses de 2 objets. Elle renvoie donc “true” si les 2 objets ont la même adresse. Bien sûr on peut redéfinir cette méthode pour que soient comparés les valeurs des objets (en général, c’est ce qui nous intéresse). La classe String a ainsi redéfini equal().
Une classe dérivée a-t-elle accès aux membres privés de la sa classe de base?
Non. Pour cela il faudrait que les membres soient définis comme public ou protected.
Une classe dérivée hérite-telle des constructeurs de la classe de base?
Non, mais le constructeur de la classe dérivée peut appeler le constructeur de la classe de base grâce au mot clé super.
Une classe dérivée doit-elle avoir un constructeur?
Non, un constructeur sans argument de la classe de base sera alors appelé. Si cela n’est pas possible, il y aura une erreur de compilation.
Quelle est la différence entre method overriding et method overloading?
Method overriding, c’est dans un contexte d’héritage, quand la classe dérivé redéfini le contenu de la classe mère.
Method overloading, c’est quand une méthode reprend le nom d’une méthode de sa classe ou de sa classe mère, mais avec d’autres paramètres.
En programmation orientée objet, qu’est-ce que le polymorphisme?
Polymorphism is the ability of an object to take on many forms. The most common use of polymorphism in OOP occurs when a parent class reference is used to refer to a child class object. Exemple: [ClasseParente c = new Classefille( ) ] Ce concept très puissant permet de manipuler des objets dont on ne connait pas le type.
Imaginons la situation suivante: class A { public void f (float x){...} }
class B extends A { public void f (float x){...} // redéfinition de f de A public void f (int x){...} // surdéfinition de f pour A et B }
A a = new A(); B b = new B() int n;
a = b; // maintenant on a une référence de type a qui pointe vers un objet de type B
Question: quelle méthode va être appelée dans l’appel suivant: a.f(n) ?
La méthode public void f (float x) de B va être appelée. En effet, dans ce cas de figure le Java procède ainsi:
1/ A la compilation: recherche au sein de la classe correspondant à la référence de l’objet (ici classe A) de la meilleure méthode compatible .
2/ A l’exécution: recherche d’une redéfinition de cette méthode dans la classe de l’objet référencé (ici classe B). Si rien n’est trouvé, le compilateur poursuit la recherche dans les classes supérieures jusqu’à éventuellement remonter à la classe de la référence de l’objet.
Comment vérifier que l’objet myObject est une instance de la classe C?
Si c’est le cas, l’expression “myObject instanceOf C” retournera true.
A quoi sert un constructeur? Est-il nécessaire d’avoir un constructeur pour chaque classe?
Un constructeur sert à initialiser un objet. Si la classe ne dispose pas de constructeur, alors le constructeur par défaut sera appelé au moment de l’instanciation.
Peut-on toujours recourir au constructeur par défaut pour l’instanciation d’un objet?
Non, c’est possible uniquement si la classe ne contient pas de constructeur ou bien un constructeur sans argument
Qu’est-ce que l’encapsulation des données?
L’encapsulation permet de contrôler l’accès aux données d’un objet. Afin que les champs d’un objet de puisse pas être modifiés depuis l’extérieur, il est fortement recommandé que ces champs soient définis comme “private”.
Lorsqu’un objet est créé, trois processus d’initialisation sont chronologiquement exécutés. Quels sont ces processus?
1: initialisation par défaut, 2: initialisation explicite, 3: appel du constructeur
Quelles sont les valeurs affectées par défaut aux champs d’un objet?
booléen: false
char: ‘0’
entier: 0
flottant: 0.f
objet: null
Quelle sont les différents usages du mot-clé “final”?
Une classe “final”ne peut pas être dérivée, une méthode “final”ne peut pas être redéfinie, une variable ou un champ “final” ne peuvent prendre qu’une valeur qui, après affectation, ne peut plus être modifiée.
Le champ d’un object peut-il être déclaré “final”?
Oui, mais il devra être initialisé; soit explicitement, soit au plus tard par un constructeur.
Quelle est la différence entre une copie superficielle et une copie profonde d’un objet? (shallow vs. deep copy)
Il n’y a une différence que si l’objet copié contient des attributs de type objet.
Dans la copie superficielle, seule la référence à ces attributs de type objet est copiée. Imaginons un objet A qui contient un objet B. Soit A’ une copie superficielle (shallow copy) de A. On a au final 3 objets: A et A’ et B vers lequel poi te A et A’.
Si A’ avait été une deep copy, on aurait eu au final 4 objets A, A’, B et B’. C’est à dire qu’avec une copie profonde, les objets référencés en attributs sont également copiés.
Qu’est-ce que le ramasse-miette (garbage collector) et à quoi sert-il?
Un objet qui n’est plus référencé devient candidat au ramasse-miette, c’est-à-dire que la JVM peut décider de la supprimer de la mémoire.
En Java, qu’est-ce qui peut être static? Et qu’est-ce que cela veut dire?
Un attribut ou une méthode d’une classe peut être déclaré static, cela signifie qu’il est propre à la classe, et non aux objets instanciés.
Qu’est-ce qu’un bloc d’initialisation statique? Quand s’en sert-on?
C’est un bloc, précédé du mot-clé “static”et qui permet d’initialiser un attribut statique dans les cas où cela ne peut pas être simplement fait avec une expression.
Comment appeler un constructeur au sein d’un autre constructeur?
Grâce au mot-clé “this”, exemple:
public class Foo { private int x;
public Foo() { this(1); }
public Foo(int x) { this.x = x; } }
To chain to a particular superclass constructor instead of one in the same class, use super instead of this. Note that you can only chain to one constructor, and it has to be the first statement in your constructor body.
Quel est le sens principal du mot-clé “this”?
Il fait référence à l’instance courante
Qu’est-ce qu’une classe interne et dans quels cas peut-il être intéressant d’y avoir recours?
Une classe est dite interne lorsque ça définition est située à l’intérieur de la définition d’une autre classe.
Le principal intérêt est que l’objet interne a accès aux membres - même privés - de l’objet externe lui ayant donné naissance, et inversement.
Qu’est qu’une classe abstraite?
C’est une classe qui ne peut pas être instanciée.
Quelles sont les différences entre une classe abstraite et une interface?
Une interface ne peut avoir que des méthodes abstraites.
Une interface ne peut avoir que des variables final et static.
Une classe ne peut hériter que d’une classe de base, en revance elle peut implémenter plusieurs interfaces.
Quelle est la différence entre l’instruction “while”et “do…while”?
Avec “do…while” l’instruction est exécutée au moins une fois. Au niveau de la syntaxe: présence d’un point virgule après la condition.
Quelle est la syntaxe de l’instruction for?
for (initialisation; condition; incrémentation) {
instructions
}
A quoi servent les mots-clés “break”et “continue”?
Ils sont principalement utilisés dans des boucles. “Break” permet de sortir de la boucle, “continue” permet de passer à l’itération suivante.
Quand plusieurs boucles sont imbriquées les uns dans les autres. Comment peut-on sortir d’une boucle de niveau supérieur?
Grâce au mot clé “break” associé à une étiquette (label) (voir page 98)
Quel est le mot clé utilisé pour indiquer qu’une méthode ne retourne rien?
void
Dans une méthode, que sont les arguments muets? Et les arguments effectifs?
Les arguments muets ne sont que identificateurs utilisés dans l’en-tête de la méthode. Les arguments effectifs sont ceux effectivement passés à la méthode.
Est-il nécessaire que le type de l’argument effectif soit le même que celui de l’argument muet?
Non, on peut utiliser un autre type si celui peut faire l’objet d’une conversion légale
Qu’est que la surdéfinition de méthode (method overloading)?
Method Overloading is a feature that allows a class to have more than one method having the same name, if their argument lists are different. It is similar to constructor overloading in Java, that allows a class to have more than one constructor having different argument lists.
Peut-on avoir dans une classe deux méthodes dont l’en-tête respective ne differerait que par le type de retour attendu?
non
Lors de l’appel d’une méthode surdéfinie, comment le compilateur choisit-il la méthode à utiliser?
Recherche de la meilleure des méthodes acceptables. (voir p.139)