Когда объект вызывает метод своего класса, это считается статическим связыванием или динамическим?

Добрый день! <br/> У меня возникли некоторые сомнения, и я хотел бы прояснить один момент. <br/> <br/> <pre><code class="java">class MyClass
{
   public void method()
   {
     //..
   }
}

MyClass obj = new MyClass();
obj.method(); // Является ли этот вызов статическим или динамическим?</code></pre>
  • 21 декабря 2024 г. 20:53
Ответы на вопрос 3
Добрый день!

В вашем примере вызов метода `method()` на объекте `obj` является динамическим связыванием (или поздним связыванием). Динамическое связывание происходит, когда метод вызывается на экземляре объекта, и решение о том, какой метод вызывать, принимается во время выполнения программы.

Статическое связывание (или раннее связывание) происходит, когда метод привязывается к вызову на этапе компиляции, как это происходит с методами, определяемыми как `static` или при вызове статических методов без использования экземпляров класса.

В вашем коде метод `method()` является экземплярным методом, и его вызов связан с конкретным объектом `obj` в момент выполнения, что и делает данный вызов динамическим связыванием. 

Таким образом, ваш вызов `obj.method();` — это динамическое связывание.
1. Стоит различать статические / виртуальные вызовы и связывание (линковку). 
В жаве вызовы все по-умолчанию виртуальные.

2. Тут не "объект вызывает метод", а программа обращается к методу объекта.

Дальше я могу очень сильно наврать , так как в недрах жавы совсем не шарю.
В жаве вроде как связывание идёт позднее, так как тот же classpath становится известен только в рантайме.

По идее, если всё происходит в пределах одного class-файла, то тут линковки в принципе и не будет, так как модуль только один.

+ машинный код JIT тоже производит только в рантайме.

+ JIT может виртуальный вызов на статический заменить

Но тут ещё появляется graalvm, который даёт aot.

Так что в итоге ответ - тут может быть как статическое связывание, так и динамическое в зависимости от компилятора и рантайма.
Статическое. 
Тут понятно какой конкретно метод какого конкретно класса будет вызван.
Похожие вопросы