Java работает с загрузчиками классов . Классы необходимы для компиляции, поскольку она будет выполнять статическую проверку типов, чтобы убедиться, что вы используете правильные сигнатуры каждого метода.
Однако после их компиляции они не связаны, как у вас в компиляторе C / C ++, так что в основном каждый файл .class является автономным. Конечно, это означает, что вы должны будете предоставить скомпилированный класс, используемый вашей программой, когда вы собираетесь ее выполнить. Так что это немного отличается от того, как C и C ++ готовят исполняемые файлы. У вас вообще нет фазы связывания, она не нужна.
Загрузчик классов динамически загружает их, добавляя их в базу времени выполнения, используемую JVM.
На самом деле есть много загрузчиков классов, которые используются JVM с различными разрешениями и свойствами, вы также можете явно вызвать его, чтобы запросить загрузку класса. То, что происходит, также может быть своего рода «ленивой» загрузкой, при которой скомпилированный код .class загружается именно тогда, когда это необходимо (и этот процесс загрузки может выдать ClassNotFoundException
, если запрашиваемый класс не находится внутри пути к классам)