Java Flashcards

1
Q

Décomposez l’instruction public static void main(String args[]) ?

A

publicest un modificateur d’accès. Nous l’utilisons pour spécifier l’accès à cette méthode. Ici, le modificateur est « public », ainsi n’importe quelle classe peut accéder à cette méthode.

static. Ce mot-clé Java signifie que nous utilisons cette méthode sans créer d’objet de la classe.

Voidest le type de retour de la méthode. Cela signifie que la méthode ne renvoie aucune valeur.

mainest le nom de la méthode. La machine virtuelle Java (JVM) traite ce nom comme le point d’entrée de l’application (il doit avoir une signature spécifique).Mainest la méthode où l’exécution principale se produit.

String args[]. Il s’agit du paramètre passé à la méthode main. Ici, nous avons des arguments du type String que notre application Java accepte lorsque nous l’exécutons. Tu peux les saisir dans la console.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Quelle est la différence entre equals(). et ==?

A

Tout d’abord, == est un opérateur, tandis qu’equals() est une méthode. Nous utilisons l’opérateur == pour la comparaison de références (ou d’adresses), et la méthode equals() pour la comparaison de contenu. Cela signifie que == vérifie si les deux objets pointent vers le même emplacement de mémoire, tandis qu’equals() compare les valeurs contenues dans les objets.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Peut-on exécuter un programme sans la méthode main() ?

A

Tu peux utiliser un bloc static pour initialiser un membre de données static. Il est exécuté avant la méthode main, lorsque les classes sont chargées.

class Example{
Static{
System.out.println(“static block is invoked”);
}
public static void main(String args[]){
System.out.println(“Now main method”);
}
}
Ce qui est affiché :

static block is invoked
Now main method
Et si la méthode main est complètement absente ? Si tu essaies d’exécuter une classe ordinaire sans méthode main du tout, tu obtiendras l’erreur suivante : Main method not found in class Test, please define the main method as: public static void main (String [] args) or a JavaFX application class must extend javafx.application.Application. L’erreur elle-même indique que s’il s’agit d’une application JavaFX et que la classe est héritée de javafx.application.Application, alors c’est possible.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Qu’est-ce qu’un objet immutable ? Peut-on modifier un objet immutable ?

A

Tu ne peux pas modifier les objets d’une classe immutable une fois qu’ils sont créés. En d’autres termes, une fois que tu les crées, tu ne peux pas les modifier. Si tu essaies de modifier un objet Immutable, tu obtiendras un nouvel objet (clone) et tu modifieras ce clone pendant sa création.

String en est un bon exemple. Cette classe est immutable en Java. Cela signifie que tu ne peux pas modifier l’objet String lui-même ; mais tu peux modifier la référence à un objet.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Combien d’objets sont créés dans le code suivant ?

Il s’agit d’une question technique d’entretien Java qui peut remplacer la n°4 ci-dessus.

String s1=”Hello”;
String s2=”Hello”;
String s3=”Hello”;

A

La réponse est « un seul », car Java a un pool de String. Lorsque nous créons un objet String à l’aide de l’opérateur new(), Java crée un nouvel objet dans la mémoire du tas. Si nous utilisons la syntaxe littérale de String, comme dans notre exemple ci-dessus, la classe peut renvoyer un objet du pool de String, si celui-ci existe déjà.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Combien d’objets sont créés dans le code suivant ?

String s = new String(“Hello”);

A

Il y a 2 objets créés ici. Un dans le pool de constantes String et l’autre dans le tas.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Quelle est la différence entre les classes String, StringBuilder et StringBuffer en Java ?

A

Tout d’abord, String est une classe immuable. Cela signifie que tu ne peux pas modifier son contenu après création. Mais StringBuffer et StringBuilder sont des classes mutables, et tu peux donc les modifier plus tard. Si nous essayons de modifier le contenu d’un objet String la JVM crée une nouvelle chaîne, laissant celle d’origine non modifiée.
StringBuilder plus performant que StringBuffer, StringBuffer plus pertinent dans un contexte multi thread car gère la synchro

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Y a-t-il une différence entre un objet String créé sous forme littérale et un créé avec l’opérateur new() ?

A

Il y en a une. Si nous créons un objet String avec l’opérateur new(), il apparaît dans le tas et n’est pas ajouté au pool de String. Si nous créons un objet String sous forme littérale, il est créé dans le pool de string, qui existe dans la zone PermGen du tas.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Peut-on remplacer une méthodeprivateoustaticen Java ?

A

Tu ne peux pas réellement remplacer une méthode private ou static en Java.

Tu ne peux pas remplacer les méthodes private, car l’étendue du spécificateur d’accès private est limitée à l’intérieur de la classe. Pour remplacer quelque chose, nous avons besoin d’avoir une classe parent et une classe enfant. Si la méthode d’une superclasse est private, alors une classe d’enfant ne peut pas l’utiliser, et les méthodes de la classe enfant seront traitées comme de nouvelles méthodes (et non comme des remplacements).

Les méthodes Static ne peuvent pas non plus être remplacées, car les méthodes static font partie de la classe elle-même. Elles ne font partie d’aucun objet de la classe. Bien sûr, tu peux déclarer la même méthode static avec la même signature dans les classes enfant, mais encore une fois, elles seront traitées comme de nouvelles méthodes.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Quelle est la différence entre une classe Abstract Class et une Interface ?

A

En Java, une interface définit un comportement tandis qu’une abstract class crée une hiérarchie.

Classe abstraite Interface
Il est possible d’avoir un corps de méthode (méthodes non abstraites) dans une classe abstraite.
Une interface peut seulement avoir des méthodes abstraites.
Dans Java 8 et les versions ultérieures, il est devenu possible de définir des méthodes par défaut et de les implémenter directement dans une interface.
les interfaces peuvent avoir des méthodes static depuis Java 8.
Des variables d’instance peuvent se trouver dans une classe abstraite .
Une interface ne peut pas avoir de variables d’instance.
Les constructeurs sont autorisés dans une classe abstraite. Une interface ne peut pas avoir de constructeur.
Une classe ne peut avoir qu’un seul parent abstrait. Une classe peut implémenter plusieurs interfaces.
Une classe abstraite peut fournir l’implémentation de l’interface.
Une interface ne peut pas fournir l’implémentation d’une classe abstraite.
Une classe abstraite peut étendre une autre classe Java et implémenter plusieurs interfaces Java.
Une interface est uniquement autorisée à étendre une autre interface Java.
Une classe Java abstraite peut avoir des membres de classe private et protected.
Les membres d’une interface Java sont public par défaut

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Quels types de zones de mémoire sont alloués par la JVM ?

A

Le stockage des données dans la JVM est opéré dans différentes zones réparties en deux grandes catégories :

Les zones de mémoire dont la durée de vie est égale à celle de la JVM : elles sont créées au lancement de la JVM et sont détruites à son arrêt
Les zones de mémoire liées à un thread dont la durée de vie est égale à celle du thread concerné
Plusieurs zones de mémoire sont utilisées par la JVM :

les registres (register) : ces zones de mémoires sont utilisées par la JVM exclusivement lors de l’exécution des instructions du byte code.
une ou plusieurs piles (stack)
un tas (heap)
une zone de méthodes (method area)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Pourquoi l’héritage multiple n’est-il pas autorisé en Java ?

A

Ce serait vraiment compliqué. Imagine trois classesA,BetC, oùChériterait deAet deB. Supposons maintenant que les classesAetBont la même méthode et que tu l’appelles à partir d’un objet de la classe enfant… Quelle méthode sera appelée ? Celle de la classeAou celle de la classeB? Nous avons ici une ambiguïté.

Si tu essaies d’hériter de deux classes, Java générera une erreur au moment de la compilation.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Peut-on surcharger la méthode main() ?

A

Bien sûr, nous pouvons avoir de nombreuses méthodes main dans un programme Java en utilisant la surcharge de méthode.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Peut-on déclarer un constructeur comme final ?

A

Non. Un constructeur ne peut pas être déclaré comme final, car il ne peut pas être hérité. Il ne serait donc pas logique de déclarer un constructeur comme final. Toutefois, si tu essaies quand même, le compilateur Java te renverra une erreur.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Peut-on déclarer une interface commefinal?

A

Non, nous ne pouvons pas faire ça. Une interface ne peut pas être final, car elle doit être implémentée par une certaine classe sur la base de sa définition. Par conséquent, il ne serait pas logique de déclarer une interface comme final. Toutefois, si tu essaies de le faire, le compilateur Java te renverra une erreur.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Quelle est la différence entre lastatic bindinget ladynamic binding?

A

Une binding qui peut être résolue au moment de la compilation par le compilateur est appelée liaison static ou préalable. La Binding de toutes les méthodes static, private et final se fait au moment de la compilation.

Avec la Dynamic binding, le compilateur ne peut pas déterminer la méthode à appeler. Le remplacement de méthode est un exemple parfait de dynamic binding. Avec le remplacement de méthode, les classes parent et enfant ont la même méthode.

17
Q

Comment créer une classe en lecture seule en Java ?

A

Tu peux le faire en rendant tous les champs de la classe private. Une classe en lecture seule n’a que des méthodes getter, qui renvoient les propriétés private de la classe à la méthodemain. Tu ne peux pas modifier ces propriétés en raison de l’absence de setters.

public class HockeyPlayer{ private String team =”Maple leaf”; public String getTeam(){ return team; } }

18
Q

Comment créer une classe en écriture seule en Java ?

A

Encore une fois, tu dois rendre tous les champs de la classe private. Cette fois, ta classe en écriture seule doit avoir seulement des setters et aucun getter. Ainsi, nous ne pouvons pas lire les propriétés de la classe.

public class HockeyPlayer{
private String team;
public void setTeam(String college){
this.team = team;
}
}

19
Q

Chaque bloctrydoit être suivi d’un bloccatch. Vrai ou faux ?

A

Faux. Ce n’est pas une obligation. Un bloc try ne doit pas nécessairement avoir un bloc catch. Il peut être suivi par un bloc catch, un bloc finally ou aucun des deux.

public class Main{
public static void main(String []args){
try{
int variable = 1;
System.out.println(variable/0);
}
finally
{
System.out.println(“the other part of the program…”);
}
}
}
Sortie :

Exception in thread main java.lang.ArithmeticException:/ by zero
the other part of the program…

Voici un autre exemple :
class Main {
public static void main(String[] args) throws IOException {
try(InputStreamReader inputStreamReader = new InputStreamReader(System.in);
BufferedReader reader = new BufferedReader(inputStreamReader)){
System.out.println(“test”);
}
}
}
Sortie :

test

P.S. : Avant Java 8, les méthodes des interfaces pouvaient seulement être abstraites. Dans Java 8 et les versions ultérieures, il est devenu possible de définir des méthodes par défaut et de les implémenter directement dans une interface.

20
Q

Quelle est la différence entre les mots-clésthrowetthrows?

A

Throwssert à déclarer une exception, et fonctionne donc comme un bloctry-catch. Le mot-cléThrowest utilisé pour lever une exception explicitement à partir d’une méthode ou de tout autre bloc de code.

Throwest suivi d’une instance de la classeException, mais throws est suivi par des noms de classe d’exception.

Throwest utilisé dans un corps de méthode pour lever une exception.Throwsest utilisé dans une signature de méthode pour déclarer les exceptions qui peuvent se produire dans les instructions présentes dans la méthode.

Tu peux lever une seule exception à la fois, mais tu peux gérer plusieurs exceptions en les déclarant à l’aide du mot-cléthrow. Tu peux déclarer plusieurs exceptions, p. ex.public void method()throws IOException,SQLException.

21
Q

Qu’est-ce que la programmation orientée objet et comment Java la prend en charge ?

A

La programmation orientée objet (POO) est un paradigme où le code est structuré autour d’objets. Java prend en charge la POO avec des classes et des objets.

22
Q

Explique la différence entre une classe abstraite et une interface en Java.

A

Une classe abstraite peut avoir des méthodes abstraites et non abstraites, tandis qu’une interface ne peut avoir que des méthodes abstraites. Les classes peuvent implémenter plusieurs interfaces, mais hériter d’une seule classe abstraite.

23
Q

Comment fonctionne la gestion de la mémoire dans Java ?

A

La gestion de la mémoire en Java est effectuée par le ramasse-miettes (garbage collector), qui libère automatiquement la mémoire des objets non référencés.

24
Q

Décris le concept de surcharge et de redéfinition dans Java.

A

La surcharge (overloading) se produit lorsqu’une classe a plusieurs méthodes avec le même nom mais des signatures différentes. La redéfinition (overriding) se produit lorsqu’une sous-classe fournit une implémentation spécifique d’une méthode héritée.

25
Q

Qu’est-ce que le polymorphisme en Java et comment peut-il être mis en œuvre ?

A

En Java, le polymorphisme fait référence à la capacité d’un objet de prendre différentes formes. Cela peut être réalisé à travers deux mécanismes principaux : le polymorphisme statique (lié à la surcharge de méthode) et le polymorphisme dynamique (lié à l’héritage et à l’implémentation d’interfaces).

  1. Polymorphisme statique (Compile-time) :
    • Il est basé sur la surcharge de méthode, où plusieurs méthodes du même nom sont présentes dans une classe, mais avec des paramètres différents.
    • Exemple :
      ```java
      public class Exemple {
      public int addition(int a, int b) {
      return a + b;
      }
      public double addition(double a, double b) {
          return a + b;
      } } ```
  2. Polymorphisme dynamique (Runtime) :
    • Il est lié à l’héritage et à l’implémentation d’interfaces. Vous pouvez utiliser une référence de la classe parent pour faire référence à un objet de la classe enfant.
    • Exemple :
      ```java
      interface Forme {
      void dessiner();
      }class Cercle implements Forme {
      public void dessiner() {
      System.out.println(“Dessiner un cercle”);
      }
      }class Carre implements Forme {
      public void dessiner() {
      System.out.println(“Dessiner un carré”);
      }
      }// Utilisation du polymorphisme dynamique
      Forme forme1 = new Cercle();
      Forme forme2 = new Carre();forme1.d
26
Q

Explique la différence entre les collections ArrayList et LinkedList.

A

ArrayList est basée sur un tableau dynamique, tandis que LinkedList est basée sur une liste chaînée. La principale différence réside dans les performances d’accès et de manipulation des éléments.

27
Q

Parle du concept de threads en Java et comment gérer la synchronisation.

A

Les threads en Java permettent l’exécution simultanée de tâches. La synchronisation est utilisée pour éviter les problèmes liés à l’accès concurrentiel aux ressources partagées.

28
Q

Qu’est-ce que Java Virtual Machine (JVM) et comment fonctionne-t-elle ?

A

La JVM est une machine virtuelle qui exécute le bytecode Java. Elle assure la portabilité du code en le traduisant en instructions spécifiques à la machine hôte.

29
Q

Comment gérer les exceptions en Java avec les blocs try, catch et finally ?

A

Les blocs try sont utilisés pour encadrer le code susceptible de générer des exceptions. Les blocs catch gèrent ces exceptions, et le bloc finally est exécuté quel que soit le résultat.

30
Q

Explique le fonctionnement des annotations en Java.

A

Les annotations en Java fournissent des métadonnées pour le code source. Elles sont utilisées pour ajouter des informations aux classes, méthodes, champs, etc.

31
Q

Qu’est ce que le bytecode

A

Le bytecode Java est un bytecode destiné à regrouper des instructions exécutables par une machine virtuelle Java. Par extension, il désigne un flux d’octets binaire au format d’une classe Java

32
Q

quelle valeur retourne read() à la fin du flux ?

A

-1

33
Q

En java, que faire pour qu’une méthode supporte l’accès concurrentiel de plusieurs threads ?

A

Pour rendre une méthode en Java thread-safe, c’est-à-dire pour la rendre capable de gérer l’accès concurrent de plusieurs threads, vous pouvez utiliser plusieurs approches. Voici quelques-unes des principales méthodes :

  1. Synchronisation de méthode :

Vous pouvez utiliser le mot-clé synchronized pour déclarer la méthode. Cela garantit que seul un thread peut exécuter cette méthode à la fois.
java
Copy code
public synchronized void maMethode() {
// Code de la méthode
}

  1. Synchronisation de bloc :

Si vous ne souhaitez pas synchroniser toute la méthode, vous pouvez utiliser un bloc synchronized à l’intérieur de la méthode pour entourer la partie critique du code.
java
Copy code
public void maMethode() {
// Code avant la partie critique

synchronized (this) {
    // Partie critique
}

// Code après la partie critique }
  1. Utilisation de classes utilitaires de synchronisation :

Java fournit des classes utilitaires dans le package java.util.concurrent qui facilitent la gestion de la concurrence, telles que ReentrantLock et Semaphore.
java
Copy code
import java.util.concurrent.locks.ReentrantLock;

public class MaClasse {
private final ReentrantLock lock = new ReentrantLock();

public void maMethode() {
    lock.lock();
    try {
        // Code de la méthode
    } finally {
        lock.unlock();
    }
} }
  1. Utilisation de variables atomiques :

Java propose des classes atomiques dans le package java.util.concurrent.atomic qui permettent des opérations atomiques sans nécessiter de blocs synchronisés explicites, comme AtomicInteger, AtomicLong, etc.

  1. Utilisation de collections thread-safe :

Utilisez des collections thread-safe de la bibliothèque java.util.concurrent, telles que ConcurrentHashMap, CopyOnWriteArrayList, etc.

  1. Gestion des états immuables :

En utilisant des objets immuables ou en garantissant que l’état de l’objet n’est pas modifiable après la création, vous pouvez éviter des problèmes de concurrence.
Le choix de la méthode dépend du contexte et des exigences spécifiques de votre application. La synchronisation peut avoir un impact sur les performances, il est donc important de choisir la méthode appropriée en fonction des besoins de votre application.

34
Q

Java 17 ?

A

Classes et interfaces scellées
Blocs de texte
Type record