2010-12-06 14 views
7

Entiendo a un nivel bajo qué enlaces estáticos (tiempo de compilación) y dinámicos (tiempo de ejecución) son.¿Cómo entender si un comportamiento usará enlace estático o dinámico en Java?

Entiendo en cierta medida por qué es importante saberlo (por ejemplo, el hecho de que los genéricos se resuelvan estáticamente ayuda a explicar lo que puede y no puede hacer, etc.).

Lo que no entiendo es por qué las elecciones se hicieron de una forma u otra; por ejemplo, Java usa enlace estático para métodos sobrecargados y enlace dinámico para los reemplazados. ¿Porqué es eso? ¿Es una elección de diseño, es algo que es obvio e inevitable para las personas que entienden el funcionamiento profundo de Java, o es algo que uno debe aprender (en lugar de comprender)?

Respuesta

3

La pregunta es, ¿cómo puede el compilador saber qué método llamar durante el tiempo de compilación, en el caso de anulación. Debe entender esto,

List list = list.getAList(); 
list.add(whatever); 

Ahora, supongamos getAList() método puede devolver cualquiera de los varios List implementaciones basadas en algunos criterios. De este modo, ¿cómo puede saber un compilador qué implementación se devuelve? y qué método add() llamar. Como puede ver, esto solo se puede decidir en tiempo de ejecución. Mientras que sobrecargar no es el caso y todo está claro en tiempo de compilación. Espero que entiendas la cosa ahora.

[Editado]

Llevar la discusión pasando en los comentarios a la respuesta real.

No se puede conocer hasta el tiempo de ejecución. Comprenda de esta manera, la creación de instancias de una clase en particular depende del argumento proporcionado por el usuario. Ahora dígame cómo el compilador sabrá qué argumento pasará el usuario y, al parecer, qué clase crear. O, lo que es más fácil aún, responda esta pregunta sobre cómo el compilador sabrá si el flujo pasará al bloque if o al bloque else. ¿O por qué crees que hemos verificado y excepciones de tiempo de ejecución? Tome el caso de divide-by-zero; por ejemplo n/m, donde m se convierte en 0 como resultado de algún cálculo. En este caso, es obvio que el compilador no podría decir que habría un ArithmeticException porque m no se conoce de inmediato. Como toda esta información no está disponible en tiempo de compilación, el compilador, por lo tanto, no sabe qué método anulará cuál.

+0

Bien, pero ¿por qué la JVM puede saberlo, pero no el compilador? – JDelage

+0

@JDelage: Porque no se puede conocer hasta el tiempo de ejecución. Supongamos que de esta manera, la creación de instancias de una clase en particular depende del argumento proporcionado por el usuario.Ahora dígame cómo el compilador sabrá qué argumento pasará el usuario y, al parecer, qué clase crear. O aún más fácil, responda esta pregunta de cómo el compilador sabrá si el flujo se pasará al bloque 'if' o al bloque' else'. ¿O por qué crees que hemos verificado y excepciones de tiempo de ejecución? Del mismo modo, esto no se conocerá en tiempo de compilación. Por lo tanto, lo llamamos vinculante tarde. –

+0

@JDelage: de manera más general, el [problema de detención] (http://en.wikipedia.org/wiki/Halting_problem) nos dice que no hay una forma general de predecir qué código va a hacer simplemente analizando el código (y no lo ejecuta). Todo lo que el compilador puede hacer es analizar el código; la JVM es responsable de ejecutarlo. Por lo tanto, el compilador no sabe qué ruta de código tomará a través de 'list.getAList()', y no puede, en general, saber hasta que se está ejecutando. Una vez que se ejecuta el código, por supuesto, la JVM puede intervenir y realizar un enlace dinámico. –

1

La vinculación dinámica es para cuando anula los métodos, ya que tendrá que decidir en tiempo de ejecución qué método (código) ejecutar en función del tipo de tiempo de ejecución del objeto. Con un método sobrecargado no necesita decidir en tiempo de ejecución, puede averiguar en tiempo de compilación cuál es el método que será llamado. Esto dará como resultado una ejecución más rápida.

+0

Lo que no entiendo es que, si extiendo un objeto y anulo sus métodos, ¿por qué el compilador no puede saberlo (el tipo exacto del objeto y, por lo tanto, la definición de sus métodos)? – JDelage

0

Según yo supongo que es la razón obious ... La sobrecarga es algo que complilor durante el tiempo de entender complile y primordial es el enlace en tiempo de ejecución o .... concepto de programación orientada a objetos entendimiento podrá ayudarle ..

Cuestiones relacionadas