2011-04-01 12 views
16

? Estoy confundido sobre qué es exactamente el envío. Especialmente cuando se trata de doble envío. ¿Hay alguna manera simple de captar este concepto?¿Qué está enviando en java

+0

jaja sí ... pensé que si entendía despachar, obtendría una mejor comprensión del patrón de visitante – thunderousNinja

+0

Ah sí. Lo siento, eliminaré la etiqueta. Esto no tiene nada que ver con los patrones de diseño :) – BalusC

+1

Solo para observar que el término "despachar" está algo sobrecargado. También puede significar la operación de poner tareas programadas en un procesador. En algunos programadores en tiempo real, el concepto de un planificador y un despachador son ideas distintas y componentes de software. – andersoj

Respuesta

29

Despacho es la forma en que un lenguaje vincula las llamadas a las definiciones de función/método.

En Java, una clase puede tener múltiples métodos con el mismo nombre pero diferentes tipos de parámetros, y el lenguaje especifica que las llamadas al método se envían al método con el número correcto de parámetros que tiene los tipos más específicos que los parámetros reales podría coincidir. Eso es un despacho estático.

Por ejemplo,

void foo(String s) { ... } 
void foo(Object o) { ... } 
{ foo("");   } // statically dispatched to foo(String) 
{ foo(new Object()); } // statically dispatched to foo(Object) 
{ foo((Object) ""); } // statically dispatched to foo(Object) 

Java también tiene método virtual de despacho. Una subclase puede anular un método declarado en una superclase. Por lo tanto, en tiempo de ejecución, la JVM debe enviar la llamada a método a la versión del método que sea apropiada para el tipo de tiempo de ejecución this.

Por ejemplo,

class Base { void foo() { ... } } 
class Derived extends Base { @Override void foo() { ... } } 


{ new Derived().foo(); } // Dynamically dispatched to Derived.foo. 
{ 
    Base x = new Base(); 
    x.foo();    // Dynamically dispatched to Base.foo. 
    x = new Derived();  // x's static type is still Base. 
    x.foo();    // Dynamically dispatched to Derived.foo. 
} 

doble despacho es la combinación de estática y tiempo de ejecución (también llamado dinámicos) distribuye.

+0

¡gracias! eso ayudó mucho. – thunderousNinja

+0

Esta es una respuesta muy bien diseñada. Sé que Java no es un lenguaje de doble despacho, pero ¿podría agregar un ejemplo de cómo sería el doble despacho en el contexto de sus ejemplos actuales? Supongo que sería algo como 'x.foo (" ")' pero creo que sería muy útil verlo. – Ogen

+0

@Ogen, esto se trata de despacho doble en Java. ¿Podrías haber querido decir JavaScript? –

Cuestiones relacionadas