ProgrammationDéveloppeur Java

Parlez-nous des principaux principes de la POO utilisés en Java et de leur mise en pratique ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

En Java, tous les quatre principes clés de la programmation orientée objet (POO) sont mis en œuvre : encapsulation, héritage, polymorphisme et abstraction.

  • Encapsulation permet de cacher l'implémentation interne de la classe et de fournir un accès aux données uniquement par le biais de méthodes. Java utilise des modificateurs d'accès (private, protected, public) ainsi que des getters/setters pour atteindre l'encapsulation.
public class Account { private double balance; public double getBalance() { return balance; } public void deposit(double amount) { this.balance += amount; } }
  • Héritage permet de créer une nouvelle classe sur la base d'une classe existante à l'aide du mot-clé extends. Cela favorise la réutilisation du code.
public class Animal {} public class Dog extends Animal {}
  • Polymorphisme se manifeste par la capacité d'une interface à servir plusieurs types. En Java, cela est réalisé par la surcharge de méthodes et des interfaces.
Animal animal = new Dog(); animal.makeSound(); // appelle l’implémentation dans Dog
  • Abstraction est atteinte par la déclaration de classes et d'interfaces abstraites, simplifiant des systèmes complexes.
public interface Drawable { void draw(); }

Question piège.

Que se passe-t-il si, en Java, une classe hérite à la fois d'une interface et d'une classe abstraite ayant des méthodes avec la même signature ? Quel comportement la classe héritée démontrera-t-elle ?

Réponse : Si la classe abstraite et l'interface définissent une méthode avec la même signature, il suffit d'implémenter cette méthode une fois dans la classe dérivée. Cependant, si la classe abstraite a déjà implémenté cette méthode, Java utilise son implémentation. Les méthodes par défaut des interfaces ne sont redéfinies que si nécessaire.

interface A { default void foo() { System.out.println("A"); }} abstract class B { void foo() { System.out.println("B"); }} class C extends B implements A {} // new C().foo() affichera "B"

Exemples d'erreurs réelles dues à une mauvaise compréhension des subtilités du sujet.


Histoire

Dans un projet pour une banque, un développeur a rendu tous les champs public et y a accédé directement. Cela a entraîné une modification incontrôlée de l'état des objets et une recherche difficile des erreurs. Par la suite, tout le code a dû être réécrit pour utiliser des champs et des méthodes d'accès privés.


Histoire

L'un des nouveaux employés a essayé de redéfinir une méthode privée de la classe de base, pensant que cela soutenait le polymorphisme. Mais en réalité, une nouvelle méthode était créée dans la classe dérivée, et les appels depuis la classe de base appelaient la version originale, ce qui provoquait un comportement inattendu.


Histoire

L'utilisation d'interfaces avec des méthodes par défaut provenant de plusieurs sources a conduit à l'erreur "class X inherits unrelated defaults for Y() from types A and B" — l'employé ne savait pas que de tels conflits devaient être résolus manuellement dans la classe dérivée.