Я изучал полиморфизм и столкнулся с проблемой незнания, когда программа находится на этапе компиляции или на этапе выполнения.
Я знаю, что компилятор просматривает код во время компиляции и превращает его в байт-кодвыполняется во время выполнения, но при инициализации объекта посредством ссылки суперкласса на объект подкласса во время компиляции компилятор знает только, что это ссылка на суперкласс, например:
public class SuperClass extends Object {
public void method1()
System.out.printlin("executed from the superClass");
}
public class SubClass extends superClass {
public void method1()
System.out.printlin("executed from the subClass");
}
...
и в основномclass:
SuperClass sup = new subClass();
sup.method1;
...
Теперь моя проблема в том, что если компилятор (во время компиляции) знает только, что sup является ссылкой на суперкласс, тогда когда sup.method1;вызывается во время компиляции, он смотрит в суперкласс и выполняет оригинальный метод1, но во время выполнения компилятор знает, что sup является объектом типа SubClass, поэтому он ищет метод1 внутри суперкласса и выполняет переопределенную версию метода method1, но моя проблема заключается в том, чточто я не понимаю, на каком этапе находится метод sup.method1;исполняется во время выполнения или во время компиляции?
И я знаю, что если вы находитесь во время компиляции, вы можете выполнить приведение, чтобы компилятор выполнял method1 из надкласса, но если sup.method1 выполняется во время выполнения, тогдав чем смысл в любом случае?
Примечание: извините за мою плохую терминологию. Я все еще новичок во всех концепциях наследования / полиморфизма.