Добрый день! <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. Стоит различать статические / виртуальные вызовы и связывание (линковку). <br/> В жаве вызовы все по-умолчанию виртуальные. <br/> <br/> 2. Тут не "объект вызывает метод", а программа обращается к методу объекта. <br/> <br/> <b>Дальше я могу очень сильно наврать</b> , так как в недрах жавы совсем не шарю. <br/> В жаве вроде как связывание идёт позднее, так как тот же classpath становится известен только в рантайме. <br/> <br/> По идее, если всё происходит в пределах одного class-файла, то тут линковки в принципе и не будет, так как модуль только один. <br/> <br/> + машинный код JIT тоже производит только в рантайме. <br/> <br/> + JIT может виртуальный вызов на статический заменить <br/> <br/> Но тут ещё появляется graalvm, который даёт aot. <br/> <br/> Так что в итоге ответ - тут может быть как статическое связывание, так и динамическое в зависимости от компилятора и рантайма.
Статическое. <br/> Тут понятно какой конкретно метод какого конкретно класса будет вызван.