En cada idioma, hay dos etapas para crear el código binario final: compilar y vincular (por supuesto, hay carga, pero eso no tiene mucho impacto aquí). En el momento de la compilación, solo es necesario colocar los ganchos (la especificación de las funciones que se llamarán) en el lugar apropiado. Linker realmente se une a ellos cuando ambos códigos reales están disponibles. Hasta ahora no hay diferencia entre C ++ y Java.
Sin embargo, existe la necesidad de que C ++ tenga declaración y definición separadas. Si mantiene la implementación en el encabezado, y si el archivo del encabezado cambia, el código que está vinculado debe volver a compilarse. Donde, como si la definición estuviera en un archivo separado, el código solo necesita volver a vincularse.
Comprenda que C ++ tiene la opción de tener enlaces estáticos, lo que implica que el código objeto se arregla junto con la aplicación que realiza la llamada. Tenga en cuenta que tanto en C como en C ++, no es inválido tener programación en el archivo de encabezado o incluso hacer #include. solo significa que debe preocuparse acerca de cómo ocurre la vinculación con estos archivos de objetos.
La situación en Java es muy diferente. Cada archivo de clase se compila con el archivo .class. De hecho, la necesidad de la compilación de la función de clase de llamador que se sirve como una sección de encabezado en el archivo .class. Sin embargo, en Java el enlace final se realiza solo dentro del Runtime (la máquina virtual) solo con esa especificación del código de bytes del archivo de clase.
Mira esto y esto