2012-07-11 16 views
10

Entiendo lo que es la invocación al método java y he practicado muchos ejemplos al usarlo.¿Para qué sirve la invocación de un método virtual Java?

Quiero saber cuál es la situación práctica o la necesidad de este concepto. Sería de gran ayuda si alguien pudiera dar un escenario del mundo real donde se usa y ¿qué pasaría si este concepto no hubiera estado allí?

+3

"escenario en tiempo real" no * significa * lo que usted piensa que significa. Lo que le interesa es un "escenario del mundo real". –

+2

Sin este concepto, no tendría la única característica que hace que el modelo OOP de Java valga la pena: polimorfismo. –

+1

vea aquí: http://stackoverflow.com/questions/2486160/java-virtual-methods – Tomer

Respuesta

12

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.

+0

Si quisiéramos imprimir 'B', habríamos llamado B object = new B(); object.getName(); - ¿Qué hace que la referencia de un objeto de clase para un objeto de clase diferente sea especial? – Meenakshi

+0

@Keppil ¿Puedes dar un ejemplo (escenario en tiempo real) para mostrar la situación explicada anteriormente? Me complacerá tener una situación práctica donde los usemos. He entendido tu explicación – Meenakshi

+0

@Meenakshi: Esto es muy útil si tenemos un método de una API externa que exige un objeto 'A' y que llamará a getName(). Entonces puedes alimentarlo con una 'B' y así cambiar la forma en que funciona. Esto es, como lo expresa @Vash, llamado polimorfismo, y es extremadamente útil. – Keppil

0

Bien, intentaré dar un ejemplo simple. Está escribiendo un método que completará una lista proporcionada por el que llama:

public void fill(List l) { 
    list.add("I just filled the list!"); 
} 

Ahora, una persona que llama desea usar una lista vinculada; otro prefiere una implementación de lista basada en una matriz. Habrá otras personas que llamen con incluso más implementaciones de listas de las que nunca has oído hablar. Estos son objetos totalmente diferentes. Proponga una solución que logre este sin depender de los métodos virtuales.

Sin métodos virtuales, esto significaría que el tipo List ya debería tener implementado el método add. Incluso si tuviera un subtipo ArrayList que tenía un método reemplazado, el compilador (y el tiempo de ejecución!) Simplemente ignoraría ese método y usaría el que está en List. Sería imposible para usar diferentes implementaciones List que se ajusten a la misma interfaz; sería imposible reutilizar esa línea de código en el método fill ya que solo funcionaría con el método en el tipo List.

Como ve, la idea de la jerarquía de tipos no tendría mucho sentido; interface sy abstract class es ni siquiera pueden existir. La totalidad de Java se descompondría en fragmentos sin esa característica de los métodos virtuales.

+0

me puede ayudar más explicando con un fragmento de código sobre la pregunta que ha hecho sin depender de métodos virtuales. o ¿crees que es posible ...? Si No ... podrías ser un pequeño detalle sobre eso. – Meenakshi