Я изо всех сил пытался понять часть кода Java, которая использует наследование для вычисления результата. Код состоит в следующем:Четыре уровня наследования в Java
class A
{
public int calc(double num) {
System.out.println("calc de A");
return (int)(num+1);
}
}
class B extends A
{
public int calc(long num) {
System.out.println("calc de B");
return (int)(num+2);
}
}
class C extends B
{
public int calc(int num) {
System.out.println("calc de C");
return num+3;
}
}
class D extends C
{
public int calc(float num) {
System.out.println("calc de D");
return (int)(num+4);
}
}
class Main
{
public static void main(String[] args)
{
int num1 = 10;
long num2 = num1;
A a1 = new D();
A a2 = new D();
int result = a1.calc(num1) + a2.calc(num2);
System.out.println("Numero: "+ result);
}
}
Я и мои друзья думают, что выход консоли должен быть:
calc de C
calc de B
Numero: 25
Но запустить его в Eclipse, и в Ideone (ссылка: http://ideone.com/CTdklv), чтобы проверить его и полученный ответ является
calc de A
calc de A
Numero: 22
Может кто-то объяснить, почему выход 22, если сигнатуры методов различны.
Мы верим, что если вы вызовете метод calc и используя в качестве параметра, вы должны перейти к методу calc класса B вместо класса A.
Прилагаю вашу помощь! Спасибо.
Ваши объекты объявлены как 'A'. Ваш метод 'calc' имеет несовместимую подпись и, следовательно, не перекрывает друг друга. Следовательно, в этой точке можно вызвать только «A.calc». – njzk2
Точно как @ njzk2 сказал. Вы не получаете полиморфизм, если вы не переопределяете метод должным образом. И без полиморфизма вы не можете получить динамическую отправку из базового класса. – jepio
Я знаю, что они не переопределяют друг друга, но вы называете их различными типами числовых значений. Должен ли calc (int) вызывать метод, соответствующий методу B calc, и метод calc (float) вызывать метод D calc? – mfsierpe