Fonction virtuelle en Java

Mohammad Irfan 12 octobre 2023
  1. Fonction virtuelle en Java
  2. Fonctions virtuelles dans Java Bean
  3. Fonctions non virtuelles en Java
  4. Fonctions virtuelles dans l’interface Java
Fonction virtuelle en Java

Ce didacticiel présente ce qu’est une fonction/méthode virtuelle en Java et comment utiliser la fonction virtuelle en Java.

Une fonction définie dans une classe de base et pouvant être remplacée dans une classe dérivée est appelée fonction virtuelle. Le concept de fonction virtuelle était utilisé en C++ et en Java par défaut ; toutes les méthodes non privées et non finales sont des méthodes virtuelles.

En C++, nous utilisons un mot-clé virtual pour créer des fonctions virtuelles, mais Java n’a pas ce mot-clé. Et en plus de cela, toutes les méthodes non privées et non finales sont virtuelles.

Le concept de fonction virtuelle est utile en termes de concepts de programmation orientée objet et de polymorphisme. Comprenons par quelques exemples.

Fonction virtuelle en Java

Dans cet exemple, nous avons créé une classe Human qui contient une méthode virtuelle eat(). Comme il s’agit d’une méthode virtuelle, elle peut être redéfinie dans la classe dérivée/enfant, comme nous l’avons fait dans l’exemple ci-dessous. Les deux méthodes ont la même signature, et lorsque nous appelons la fonction, seule la méthode de la classe enfant s’exécute. Voir l’exemple ci-dessous.

class Human {
  void eat(String choice) {
    System.out.println("I would like to eat - " + choice + " now");
  }
}

public class SimpleTesting extends Human {
  void eat(String choice) {
    System.out.println("I would like to eat - " + choice);
  }
  public static void main(String[] args) {
    SimpleTesting simpleTesting = new SimpleTesting();
    simpleTesting.eat("Pizza");
    simpleTesting.eat("Chicken");
  }
}

Production :

I would like to eat - Pizza
I would like to eat - Chicken

Fonctions virtuelles dans Java Bean

Les fonctions getter d’une classe bean/POJO sont également virtuelles et peuvent être remplacées par la classe enfant. Voir l’exemple ci-dessous.

public class SimpleTesting extends Student {
  public int getId() {
    System.out.println("Id : " + id);
    return id;
  }
  public String getName() {
    System.out.println("Name : " + name);
    return name;
  }
  public int getAge() {
    System.out.println("Age : " + age);
    return age;
  }

  public static void main(String[] args) {
    SimpleTesting student = new SimpleTesting();
    student.setId(101);
    student.setName("Rohan");
    student.setAge(50);
    student.getId();
    student.getName();
    student.getAge();
  }
}
class Student {
  int id;
  String name;
  int age;

  public int getId() {
    return id;
  }
  public void setId(int id) {
    this.id = id;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public int getAge() {
    return age;
  }
  public void setAge(int age) {
    this.age = age;
  }
}

Production :

Id : 101
Name : Rohan
Age : 50

Fonctions non virtuelles en Java

Les fonctions privées ou finales ne sont pas virtuelles, elles ne peuvent donc pas être remplacées par la classe enfant. Dans cet exemple, nous avons créé deux fonctions, l’une est finale et la seconde est privée. Nous avons essayé de les remplacer dans la classe enfant, mais le compilateur Java a généré une erreur en raison de la fonction non virtuelle. Voir l’exemple et la sortie ci-dessous.

class Human {
  // non-virtual method
  final void eat(String choice) {
    System.out.println("I would like to eat - " + choice);
  }
  // non-virtual method
  private void buy(String item) {
    System.out.println("Buy me a " + item);
  }
}
public class SimpleTesting extends Human {
  // non-virtual method
  void eat(String choice) {
    System.out.println("I would like to eat - " + choice);
  }
  // non-virtual method
  void buy(String item) {
    System.out.println("Buy me a " + item);
  }
  public static void main(String[] args) {
    SimpleTesting simpleTesting = new SimpleTesting();
    simpleTesting.eat("Pizza");
    simpleTesting.buy("Pizza");
    simpleTesting.eat("Chicken");
    simpleTesting.buy("Chicken");
  }
}

Production :

java.lang.IncompatibleClassChangeError: class SimpleTesting overrides final method Human.eat(Ljava/lang/String;)
---Cannot override the final method from Human---

Fonctions virtuelles dans l’interface Java

Les fonctions/méthodes d’une interface sont virtuelles par défaut car elles sont publiques par défaut et sont censées être remplacées par la classe enfant. Dans l’exemple ci-dessous, nous avons créé une méthode dans l’interface, l’avons remplacée dans une classe et l’avons appelée avec succès. Voir l’exemple ci-dessous.

interface Eatable {
  void eat(String choice);
}
public class SimpleTesting implements Eatable {
  public void eat(String choice) {
    System.out.println("I would like to eat - " + choice);
  }
  void buy(String item) {
    System.out.println("Buy me a " + item);
  }
  public static void main(String[] args) {
    SimpleTesting simpleTesting = new SimpleTesting();
    simpleTesting.eat("Pizza");
    simpleTesting.buy("Pizza");
    simpleTesting.eat("Chicken");
    simpleTesting.buy("Chicken");
  }
}

Production :

I would like to eat - Pizza
Buy me a Pizza
I would like to eat - Chicken
Buy me a Chicken

Article connexe - Java Function