¿Cómo funcionan las funciones virtuales detrás de escena en Herencia? ¿El compilador trata las funciones virtuales especialmente?Java - Métodos virtuales
Respuesta
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 .
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.
'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.
¿Algún error aquí? Digas. – EJP
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
@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
- 1. Métodos no virtuales en Java
- 2. métodos no virtuales Sustitución
- 3. Tablas de métodos virtuales
- 4. métodos virtuales puros C++
- 5. ¿Métodos virtuales puros en C#?
- 6. Anulación de métodos virtuales calificados
- 7. ¿Qué son los métodos virtuales?
- 8. ¿Los métodos abstractos son virtuales?
- 9. ¿Todos los métodos en Java son implícitamente virtuales?
- 10. ¿Cómo implementar métodos virtuales en Python?
- 11. Comparación: métodos de interfaz vs métodos virtuales vs métodos abstractos
- 12. ¿Los métodos que implementan métodos virtuales puros de una clase de interfaz deben declararse también virtuales?
- 13. falso/simulacro de métodos no virtuales C++
- 14. Impacto del rendimiento de los métodos virtuales
- 15. C# métodos estáticos virtuales (o abstractos)
- 16. Métodos o eventos virtuales en C#
- 17. Interfaz, Resumen o solo métodos virtuales?
- 18. métodos virtuales y clases de plantilla
- 19. ¿Cuándo es apropiado usar métodos virtuales?
- 20. C++ - ¿Uso excesivo de métodos virtuales?
- 21. ¿Cómo funcionan los métodos virtuales en C#?
- 22. Clonación clase C++ con métodos virtuales puros
- 23. ¿Cómo burlarse de métodos no virtuales?
- 24. Mocking métodos no virtuales en C#
- 25. resolución de sobrecarga de métodos virtuales
- 26. Alternativa a C++ estática métodos virtuales
- 27. ¿Simula objetos en C++ siempre requiere métodos o plantillas virtuales?
- 28. ¿Está bien lanzar una excepción NotImplemented en métodos virtuales?
- 29. Rhino: clases de imitación y métodos virtuales no predeterminados
- 30. convención de nombres para los métodos no virtuales y abstractas
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. –
no te olvides de Constructor. –
@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. –