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.
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; } }
extends. Cela favorise la réutilisation du code.public class Animal {} public class Dog extends Animal {}
Animal animal = new Dog(); animal.makeSound(); // appelle l’implémentation dans Dog
public interface Drawable { void draw(); }
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"
Histoire
Dans un projet pour une banque, un développeur a rendu tous les champs
publicet 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.