Dans cet article, nous explorerons les quatre piliers fondamentaux de la programmation orientée objet (POO) en Java. Ces principes fondamentaux aident à structurer le code pour qu'il soit modulaire, réutilisable et maintenable. Cet article sert d'introduction, avec des entrées à venir approfondissant chaque concept avec des discussions et des exemples nuancés.
Pour faciliter la mémorisation, utilisez l'acronyme « A PIE » : Abstraction, Polymorphisme, Ihéritage , et Encapsulation.
Java est souvent décrit comme un langage orienté objet, mais il n'est pas 100 % orienté objet. Pourquoi ? Alors que la plupart des éléments en Java tournent autour d'objets (comme les classes, les objets et les méthodes), il utilise également des types primitifs (comme int, boolean et double), qui sont pas des objets.
Conserver les types primitifs en Java était un choix de conception délibéré. Voici pourquoi :
Efficacité de la mémoire : Les types primitifs prennent moins de mémoire par rapport à leurs homologues objets (comme Integer ou Boolean).
Augmentation des performances : Les opérations sur les primitives sont plus rapides car elles évitent la surcharge de création d'objets et de gestion des références.
Commodité : Les types primitifs rendent le code plus propre dans les cas simples, en particulier lorsqu'il s'agit d'opérations arithmétiques et logiques.
En bref, Java trouve un équilibre en fournissant des primitives pour les performances et l'efficacité de la mémoire tout en proposant également des Classes Wrapper (comme Integer) lorsque vous devez traiter ces valeurs comme des objets.
L'abstraction signifie cacher la logique interne et exposer uniquement les fonctionnalités essentielles à l'utilisateur. Il permet à l'utilisateur d'interagir avec un objet à un niveau élevé sans se soucier de la complexité sous-jacente. Considérez-le comme si vous utilisiez un DAB : il vous suffit de saisir le montant à retirer, sans savoir comment le guichet automatique interagit avec votre banque pour traiter la transaction.
En Java, les classes abstraites et les interfaces aident à réaliser l'abstraction en définissant des méthodes essentielles et en laissant les détails internes soit aux classes enfants, soit au sein de la classe parent. mais caché à l'utilisateur.
abstract class Payment { // A method with concrete logic, hidden from the user. private void authenticate() { System.out.println("Authenticating payment..."); } // Abstract method that child classes must implement. abstract void processPayment(double amount); // Public method exposing only the necessary details. public void makePayment(double amount) { authenticate(); // Hidden complexity processPayment(amount); // Exposed to child classes System.out.println("Payment completed."); } } // Concrete class implementing the abstract method. class CreditCardPayment extends Payment { @Override void processPayment(double amount) { System.out.println("Processing credit card payment of ₹" + amount); } } public class TestAbstraction { public static void main(String[] args) { Payment payment = new CreditCardPayment(); // Polymorphism in action. payment.makePayment(1000.00); // Only high-level interaction. } }
Où se cache la complexité ?
En quoi la classe abstraite aide-t-elle ?
Que voit l'utilisateur ?
Le polymorphisme permet à un objet de se comporter différemment dans différentes situations. Java prend en charge deux types de polymorphisme :
1. Polymorphisme au moment de la compilation (surcharge de méthode) : Obtenu en définissant plusieurs méthodes avec le même nom mais des paramètres différents.
abstract class Payment { // A method with concrete logic, hidden from the user. private void authenticate() { System.out.println("Authenticating payment..."); } // Abstract method that child classes must implement. abstract void processPayment(double amount); // Public method exposing only the necessary details. public void makePayment(double amount) { authenticate(); // Hidden complexity processPayment(amount); // Exposed to child classes System.out.println("Payment completed."); } } // Concrete class implementing the abstract method. class CreditCardPayment extends Payment { @Override void processPayment(double amount) { System.out.println("Processing credit card payment of ₹" + amount); } } public class TestAbstraction { public static void main(String[] args) { Payment payment = new CreditCardPayment(); // Polymorphism in action. payment.makePayment(1000.00); // Only high-level interaction. } }
2. Polymorphisme d'exécution (remplacement de méthode) : Atteint lorsqu'une sous-classe fournit son implémentation spécifique d'une méthode déclarée dans la classe parent.
class Calculator { // Compile-time polymorphism (Overloading) int add(int a, int b) { return a + b; } int add(int a, int b, int c) { return a + b + c; } public static void main(String[] args) { Calculator calc = new Calculator(); System.out.println(calc.add(2, 3)); // Output: 5 System.out.println(calc.add(2, 3, 4)); // Output: 9 } }
Polymorphisme au moment de la compilation est démontré en surchargeant la méthode add(), tandis que le Polymorphisme au moment de la compilation est démontré en remplaçant la méthode sound().
La méthode sound() se comporte différemment en fonction du type d'objet. Bien que animal soit de type Animal, au runtime, la méthode remplacée dans Dog est exécutée.
L'héritage permet à une classe (enfant) de réutiliser les propriétés et le comportement d'une autre classe (parent). Cela favorise la réutilisabilité du code et établit une relation IS-A entre les classes. Java ne prend pas en charge l'héritage multiple via les classes pour éviter toute ambiguïté, mais le permet via les interfaces.
class Animal { void sound() { System.out.println("Animals make sounds."); } } class Dog extends Animal { @Override void sound() { System.out.println("Dog barks."); } } public class TestPolymorphism { public static void main(String[] args) { Animal animal = new Dog(); // Runtime polymorphism animal.sound(); // Output: Dog barks } }
Dans cet exemple :
Le chien hérite d'Animal, ce qui signifie que le chien peut à la fois manger et aboyer.
Cela démontre la réutilisation du code : nous n'avons pas eu besoin de réécrire la méthode eat() pour la classe Dog.
L'encapsulation signifie regrouper les données (champs) et les méthodes qui les manipulent en une seule unité (classe). Elle assure également le masquage des données en rendant les champs privés et en les exposant grâce aux getters et setters.
abstract class Payment { // A method with concrete logic, hidden from the user. private void authenticate() { System.out.println("Authenticating payment..."); } // Abstract method that child classes must implement. abstract void processPayment(double amount); // Public method exposing only the necessary details. public void makePayment(double amount) { authenticate(); // Hidden complexity processPayment(amount); // Exposed to child classes System.out.println("Payment completed."); } } // Concrete class implementing the abstract method. class CreditCardPayment extends Payment { @Override void processPayment(double amount) { System.out.println("Processing credit card payment of ₹" + amount); } } public class TestAbstraction { public static void main(String[] args) { Payment payment = new CreditCardPayment(); // Polymorphism in action. payment.makePayment(1000.00); // Only high-level interaction. } }
Le champ nom est privé, ce qui signifie qu'il n'est pas accessible directement depuis l'extérieur de la classe.
L'accès est fourni via des getters et setters publics, appliquant le masquage des données.
Les Principes POO de Java—Abstraction, polymorphisme, héritage et encapsulation—constituent la base de l'écriture de code modulaire, maintenable et efficace. Avec ces concepts en main, vous serez mieux préparé à concevoir et à comprendre des systèmes complexes.
Dans les prochains articles, nous approfondirons chacun de ces principes avec des exemples plus nuancés, des bonnes pratiques et des conseils axés sur les entretiens. Restez à l'écoute!
Principes fondamentaux de Java
Les essentiels de l'entretien avec Array
L'essentiel de la mémoire Java
L'essentiel des mots-clés Java
L'essentiel du cadre de collections
Bon codage !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!