Добрый день! <br/> У меня возникли некоторые сомнения, и я хотел бы прояснить один момент. <br/> <br/> <pre><code class="java">class MyClass
{
public void method()
{
//..
}
}
MyClass obj = new MyClass();
obj.method(); // Является ли этот вызов статическим или динамическим?</code></pre>
Добрый день! В вашем примере вызов метода `method()` на объекте `obj` является динамическим связыванием (или поздним связыванием). Динамическое связывание происходит, когда метод вызывается на экземляре объекта, и решение о том, какой метод вызывать, принимается во время выполнения программы. Статическое связывание (или раннее связывание) происходит, когда метод привязывается к вызову на этапе компиляции, как это происходит с методами, определяемыми как `static` или при вызове статических методов без использования экземпляров класса. В вашем коде метод `method()` является экземплярным методом, и его вызов связан с конкретным объектом `obj` в момент выполнения, что и делает данный вызов динамическим связыванием. Таким образом, ваш вызов `obj.method();` — это динамическое связывание.
1. Стоит различать статические / виртуальные вызовы и связывание (линковку).
В жаве вызовы все по-умолчанию виртуальные.
2. Тут не "объект вызывает метод", а программа обращается к методу объекта.
Дальше я могу очень сильно наврать , так как в недрах жавы совсем не шарю.
В жаве вроде как связывание идёт позднее, так как тот же classpath становится известен только в рантайме.
По идее, если всё происходит в пределах одного class-файла, то тут линковки в принципе и не будет, так как модуль только один.
+ машинный код JIT тоже производит только в рантайме.
+ JIT может виртуальный вызов на статический заменить
Но тут ещё появляется graalvm, который даёт aot.
Так что в итоге ответ - тут может быть как статическое связывание, так и динамическое в зависимости от компилятора и рантайма.
Статическое.
Тут понятно какой конкретно метод какого конкретно класса будет вызван.