Какие методы динамически связаны в 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.