2010-03-21 19 views

Respuesta

12

Sí, los métodos virtuales son tratados de manera diferente por el compilador y el tiempo de ejecución. La JVM utiliza específicamente un virtual method table para el envío método virtual:

tabla de despacho de un objeto se contener las direcciones de métodos dinámicamente con destino del objeto. Las llamadas a método se realizan obteniendo la dirección del método de la tabla de envío del objeto. La tabla de envío es lo mismo para todos los objetos que pertenecen a de la misma clase, y por lo tanto es típicamente compartida entre ellos. clases compatibles con objetos de tipo perteneciente a (por ejemplo hermanos en una jerarquía herencia) tendrán mesas de despacho con el mismo diseño: la dirección de un método dado se aparecer al mismo desplazamiento para todas clases compatibles de tipo . Por lo tanto, obteniendo la dirección del método de un dado el desplazamiento de la tabla de envío obtendrá el método correspondiente a la clase real del objeto .

35

Todos los métodos en java son virtuales por defecto. Eso significa que cualquier método puede ser anulado cuando se usa en herencia, a menos que ese método se declare como final o estático.

+2

Los métodos no estáticos (instancia) son siempre virtuales. Los métodos estáticos (clase) nunca son virtuales. Tiene razón en que un método virtual que se declara final no puede anularse en una clase derivada. –

+0

no te olvides de Constructor. –

+0

@JerryLiu Eso depende de si considera el constructor como un método o no. Creo que la comunidad aún no está de acuerdo con ese tema. –

13

'Virtual' es un término de C++. No hay métodos virtuales en Java. Hay métodos ordinarios, que son en tiempo de ejecución polimórficos y métodos estáticos o finales, que no lo son.

+0

¿Algún error aquí? Digas. – EJP

+12

No he votado sin embargo, creo que la frase "todos los métodos en Java son virtuales por defecto" es mejor. Si bien no existe un modificador "virtual" específico en Java, el concepto subyacente sigue siendo el mismo. Afirmar que no hay métodos virtuales es un poco engañoso IMHO – ChrisWue

+2

@ChrisWue Pero su versión no es verdadera. Los métodos estáticos no son virtuales en ningún sentido, ni tampoco son polimórficos en tiempo de ejecución. Mi versión capta eso: el tuyo no. Y la navaja de Ockham dicta que no se multiplican los conceptos innecesariamente. No es necesario utilizar la palabra "virtual" cuando se habla de Java, al igual que en el idioma en sí. – EJP

Cuestiones relacionadas