Задать вопрос
@artemfisher

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

Добрый день!
Немного запутался, прошу разъяснить.

class MyClass
{
   public void method()
   {
     //..
   }
}

MyClass obj = new MyClass();
obj.method(); // это статический вызов или динамический?
  • Вопрос задан
  • 100 просмотров
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 3
xez
@xez Куратор тега Java
TL Junior Roo
Статическое.
Тут понятно какой конкретно метод какого конкретно класса будет вызван.
Ответ написан
Комментировать
1. Стоит различать статические / виртуальные вызовы и связывание (линковку).
В жаве вызовы все по-умолчанию виртуальные.

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

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

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

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

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

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

Так что в итоге ответ - тут может быть как статическое связывание, так и динамическое в зависимости от компилятора и рантайма.
Ответ написан
Комментировать
mayton2019
@mayton2019 Куратор тега Java
Bigdata Engineer
Будет использован invokevirtual
class MyClass
{
   public void method()
   {
     System.out.println("OK");
   }


   public static void main(String[] args) {
     MyClass obj = new MyClass();
     obj.method();

   }
}


Compiled from "MyClass.java"
class MyClass {
  MyClass();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public void method();
    Code:
       0: getstatic     #7                  // Field java/lang/System.out:Ljava/io/PrintStream;
       3: ldc           #13                 // String OK
       5: invokevirtual #15                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       8: return

  public static void main(java.lang.String[]);
    Code:
       0: new           #21                 // class MyClass
       3: dup
       4: invokespecial #23                 // Method "<init>":()V
       7: astore_1
       8: aload_1
       9: invokevirtual #24                 // Method method:()V
      12: return
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы