Función virtual en Java
- Función virtual en Java
- Funciones virtuales en Java Bean
- Funciones no virtuales en Java
- Funciones virtuales en la interfaz 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