Maison  >  Article  >  Java  >  Cracker la POO en Java : un TARTE dont vous voudrez une part

Cracker la POO en Java : un TARTE dont vous voudrez une part

Susan Sarandon
Susan Sarandonoriginal
2024-10-28 11:38:02977parcourir

Cracking OOP in Java: A PIE You’ll Want a Slice Of

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.


Que signifie être orienté objet ?

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.


1. Abstraction : masquer les détails inutiles

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.

Exemple:

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.
    }
}

Explication:

  • Où se cache la complexité ?

    • La méthode Authenticate() représente la logique interne (par exemple, validation utilisateur, cryptage) qui est privée et cachée à la fois pour la classe enfant et pour l'utilisateur.
    • La méthode makePayment() est la seule méthode publique disponible pour l'utilisateur, offrant un moyen simple d'interagir avec le système de paiement.
  • En quoi la classe abstraite aide-t-elle ?

    • Il force les classes enfants (comme CreditCardPayment) à implémenter la logique de base (processPayment()), mais la classe enfant n'a pas besoin de connaître la logique d'authentification —c'est géré dans la classe parent.
  • Que voit l'utilisateur ?

    • Du point de vue de l'utilisateur, ils n'interagissent qu'avec makePayment() : ils ne se soucient pas de l'authentification ou du comment fonctionne le paiement par carte de crédit en interne.

2. Polymorphisme : même action, formes différentes

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.

Exemple:

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.

Exemple:

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
    }
}

Explication:

Le

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.


3. Héritage : réutilisabilité du code grâce à la relation parent-enfant

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.

Exemple:

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
    }
}

Explication:

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.


4. Encapsulation : protection des données avec contrôle d'accès

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.

Exemple:

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.
    }
}

Explication:

  • 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.


Conclusion

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!


Articles connexes

  • 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn