To make things clear, I have elaborated my question in
more detail.
Я маю цей код, який розробляє динамічну прив'язку,
використовуючи концепцію перевизначення.
Ось код:
class Test {
public static void main(String [] args)
{
B b = new A();
b.p(10); // 10.0
b.p(10.0); //10.0
}
}
class B
{
public void p(double i)
{
print(i*2);
}
}
class A extends B
{
public void p(double i)
{
print(i);
}
}
Тепер, пояснення говорить, що компілятор не може визначити, який
метод викликати під час "часу компіляції". Саме під час
«виконання», коли компілятор знає, що метод, який потрібно
викликати, є методом підкласу, тому що коли ми перекриваємо, ми
розглядаємо фактичний тип.
Контраст із цим кодом:
class Test {
public static void main(String [] args)
{
B b = new A();
b.p(10); // 10.0
b.p(10.0); //10.0
}
}
class B
{
public void p(double i)()
{
print(i*2);
}
}
class A extends B
{
public void p(int i)
{
print(i);
}
}
У цьому прикладі компілятор може розпізнати, який метод
викликати під час компіляції. Як можна розпізнати компіляцію в
цьому прикладі, поки не розпізнає попередній приклад? Питання:
Що саме означає термін "час компіляції" і "час виконання"? Як
компілятор не розпізнає під час компіляції, що функція, яку
потрібно викликати, є функцією підкласу?