В Java, если вызывается метод, НЕ унаследованный каким-либо подклассом, используется ли динамическое или статическое связывание?
В Java, если вызывается метод, НЕ унаследованный каким-либо подклассом, используется ли динамическое или статическое связывание?
Я знаю, что это не будет иметь никакого значения для вывода в данном конкретном случае, но просто хотел знать это.
3 ответа
Вызовы методов экземпляра в Java всегда используют динамическое связывание. Статические методы и прямой доступ к закрытым членам используют статическую привязку.
Подробно: http://geekexplains.blogspot.com/2008/06/dynamic-binding-vs-static-binding-in.html
Эта статья объясняет это довольно хорошо.
Если класс или метод не помечен final
, это может быть переопределено новыми типами, введенными во время выполнения загрузчиком классов. В этом смысле они все еще "динамичны".
Во время выполнения JVM знает все загруженные классы и переопределен ли метод; final
модификатор методов не имеет значения для JVM.
Обладая этими знаниями, JVM оптимизирует вызовы методов, которые не переопределяются; в этом смысле привязка является "статической".