Есть два класса:
public class A
{
private int _a;
public A()
{
_a=1;
}
public void f1(A a)
{
if(a instanceof B)
{
f1((B) a);
}
else
System.out.println("Nothing");
}
//...
}
public class B extends A
{
private int _a;
private int _b;
public B()
{
_b=100;
}
public void f1(B b)
{
System.out.println("B::f1(B)");
}
public void f1(Object o)
{
System.out.println("B::f1(Object)");
}
//...
}
И блок кода в main ():
B b = new B();
A a = b;
b.f1(a);
Когда я пытаюсь запустить программу, выходит:
runtime error
Я не могу понять по какой причине это происходит, а именно почему в блоке кода
if(a instanceof B)
{
f1((B) a);
}
Продолжает вызываться метод f1 () в классе А, а не в классе B?
Буду благодарен если мне кто-нибудь объяснит логику происходящего.
В классе A происходит рекурсивный вызов функции f1():
public void f1(A a) {
if (a instanceof B) {
f1((B) a);
}
else {
System.out.println("Nothing");
}
}
Для того, чтобы дать компилятору понять, что ему нужно искать не метод текущего класса, а метод объекта, нужно сделать что-то вроде ((B) a).f1(a);
В случае если не планируется переопределять метод в классе-потомке, подойдет:
B bFromA = (B) a;
bFromA.f1(bFromA);
В данном случае наверное лучше выбрать что-то одно - переопределение (override) или перегрузку (overload), а то выглядит слишком громоздко.
Строго говоря в текущей конфигурации решение не являет перегрузкой, т.к. у класса A только один метод f1(), хотя судя по тегам именно она задумывалась при описании.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости