Какие методы динамически связаны в Java?

Что говорит вопрос, какие методы динамически связаны в Java?

Исходя из C++, если я не ошибаюсь, большинство методов статически связаны с несколькими исключениями.

3 ответа

Теоретически, все методы динамически связаны, за исключением

  • Статические методы
  • Конструкторы
  • Частные методы
  • Окончательные методы

На практике во время выполнения JVM может выбрать JIT-компиляцию некоторых вызовов методов для статического разрешения, например, если нет загруженных классов, содержащих переопределяющий метод.

Вызовы методов экземпляра разрешаются во время выполнения, статические вызовы метода разрешаются во время компиляции.

В общем, вы можете думать об этом так: во время компиляции компилятор проверяет статическую привязку. Во время выполнения проверяется динамический тип.

например:

Class A{
  public void function x(){ print("x"); }
}
Class B extends A{
  public void function x(){ print("y"); }
  public void function m(){ print("m"); }
}

public static void main(){
   A a = new B();
   a.x();        //1
   a.m();        //2
   ((B)a).m();   //3
}
  • в 1 скомпилируется, потому что статический тип a - это A, а A имеет функцию с именем X, но во время выполнения будет распознан объект B и напечатано 'y'
  • в 2 произойдет ошибка компиляции, потому что a имеет тип A, а класс A не имеет функции с именем m.
  • в 3 будет проверено, является ли это наследование B->A допустимым, а затем, если класс B имеет функцию с именем m.

* обратите внимание, что в последнем случае приведения компилятор проверяет только возможность наследования, а не то, что будет объект B. например:

A a = new A();
((B)a).m();

скомпилирует, но сгенерирует исключение runntime.

Другие вопросы по тегам