Как узнать, когда программа находится на этапе компиляции и на этапе выполнения? - PullRequest
0 голосов
/ 21 апреля 2019

Я изучал полиморфизм и столкнулся с проблемой незнания, когда программа находится на этапе компиляции или на этапе выполнения.

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

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 выполняется во время выполнения, тогдав чем смысл в любом случае?

Примечание: извините за мою плохую терминологию. Я все еще новичок во всех концепциях наследования / полиморфизма.

1 Ответ

0 голосов
/ 21 апреля 2019

Компилятор не выполняет код во время компиляции;метод выполняется во время выполнения.
Фактическим типом объектов sup всегда будет SubClass, но его можно назвать его супертипом, как в вашем примере.

Невозможно привести объект sup, чтобы он вызывал method1 из SuperClass.Приведение приводит только к изменению типа, который вы используете для ссылки на объект, а не к фактическому типу самого объекта.
Одно из применений приведения может быть, если у SubClass есть другой метод, method2, которого нет в SuperClass.Если бы тогда у вас была ссылка на экземпляр SubClass, через ссылку SuperClass вы не смогли бы вызвать method2 без предварительной (понижающей) ссылки на SubClass.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...