Aquí hay un ejemplo. Supongamos que tenemos 2 clases:
class A {
public String getName() {
return "A";
}
}
class B extends A {
public String getName() {
return "B";
}
}
Si ahora hacemos lo siguiente:
public static void main(String[] args) {
A myA = new B();
System.out.println(myA.getName());
}
obtenemos el resultado
B
Si Java no tenía virtual method invocation
, se determinaría en Tiempo de compilación que el getName()
que se llamará es el que pertenece a la clase A
. Como no lo hace, pero lo determina en tiempo de ejecución según la clase real a la que apunta myA
, obtenemos el resultado anterior.
[EDITAR para añadir (un poco artificial) ejemplo]
Se puede usar esta función para escribir un método que toma cualquier número de Object
s como argumento y los imprime así:
public void printObjects(Object... objects) {
for (Object o: objects) {
System.out.println(o.toString());
}
}
Este funcionará para cualquier combinación de Objetos. Si Java no tiene virtual method invocation
, todos los Objetos se imprimirían utilizando Object toString()
que no es muy legible. Ahora, en su lugar, se usará el toString()
de cada clase real, lo que significa que la impresión generalmente será mucho más legible.
"escenario en tiempo real" no * significa * lo que usted piensa que significa. Lo que le interesa es un "escenario del mundo real". –
Sin este concepto, no tendría la única característica que hace que el modelo OOP de Java valga la pena: polimorfismo. –
vea aquí: http://stackoverflow.com/questions/2486160/java-virtual-methods – Tomer