В Java функции / процедуры называются методами. Разница лишь в том, что функция возвращает значение. Нет, там нет подъема, как у JS (слава богу). Единственным требованием к переменным является то, что вы должны создать их, прежде чем использовать их. Так же, как С.
Но методы являются частью объекта. Таким образом, они привязаны к объекту, и вы можете вызывать их выше их объявления (виртуальный метод, все виртуально :)).
Потому что вызов их на самом деле включает в себя <Class>.method()
И класс уже скомпилирован и загружен до того, как время его выполнит. (некоторые отражения могут обойти или изменить это поведение, хотя).
Компилятор относительно свободен для изменения порядка вещей, но, например, volatile может запретить такое поведение.
Кстати: Поднимает и переупорядочивает одно и то же?