Función virtual en Java

Mohammad Irfan 12 octubre 2023
  1. Función virtual en Java
  2. Funciones virtuales en Java Bean
  3. Funciones no virtuales en Java
  4. Funciones virtuales en la interfaz Java
Función virtual en Java

Este tutorial presenta qué es una función / método virtual en Java y cómo usar la función virtual en Java.

Una función que se define en una clase base y se puede reemplazar en una clase derivada se conoce como función virtual. El concepto de función virtual se utilizó en C++ y en Java por defecto; todos los métodos no privados y no finales son métodos virtuales.

En C++, usamos una palabra clave virtual para hacer funciones virtuales, pero Java no tiene esa palabra clave. Y además de eso, todos los métodos no privados y no finales son virtuales.

El concepto de función virtual es útil en términos de polimorfismo y conceptos de programación orientada a objetos. Entendamos por algunos ejemplos.

Función virtual en Java

En este ejemplo, creamos una clase Human que contiene un método virtual eat(). Dado que es un método virtual, se puede anular en la clase derivada / secundaria, como hicimos en el ejemplo siguiente. Ambos métodos tienen la misma firma, y ​​cuando llamamos a la función, solo se ejecuta el método de la clase secundaria. Vea el ejemplo a continuación.

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");
  }
}

Producción :

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

Funciones virtuales en Java Bean

Las funciones getter de una clase bean / POJO también son virtuales y pueden ser anuladas por la clase hija. Vea el ejemplo a continuación.

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

Producción :

Id : 101
Name : Rohan
Age : 50

Funciones no virtuales en Java

Las funciones que son privadas o finales no son virtuales, por lo que no pueden ser anuladas por la clase secundaria. En este ejemplo, creamos dos funciones, una es final y la segunda es privada. Intentamos anularlos en la clase secundaria, pero el compilador de Java generó un error debido a la función no virtual. Vea el ejemplo y el resultado a continuación.

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");
  }
}

Producción :

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

Funciones virtuales en la interfaz Java

Las funciones / métodos de una interfaz son virtuales por defecto porque son públicos por defecto y se supone que deben ser anulados por la clase secundaria. En el siguiente ejemplo, creamos un método en la interfaz, lo reemplazamos en una clase y lo llamamos exitosamente. Vea el ejemplo a continuación.

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");
  }
}

Producción :

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

Artículo relacionado - Java Function