Допустим, у нас есть эти два класса и один основной метод:Путаница и перегружен приведение к базовому типу методов
public class Super {
public void f(double d){
System.out.println("Super: f(double d)");
}
public void f(int i){
System.out.println("Super: f(int i)");
}
}
public class Sub extends Super {
public void f(double d){
System.out.println("Sub: f(double d)");
}
public void f(float f){
System.out.println("Sub: f(float f)");
}
}
public class M {
public static void main(String[] args){
Sub a = new Sub();
a.f(1.5f); //output: "Sub: f(float f)"
Super b = new Sub();
b.f(1.5f); //output: "Sub: f(double d)"
}
}
Почему второй результат вызова в Sub: f(double d)
и не в Sub: f(float f)
как первый?
Когда я добавляю
public void f(float f) {
System.out.println("Super: f(float f)");
}
к Super
класса выходных изменений Sub: f(float f)
.
Учитывая такое поведение, я ожидаю, что рабочий процесс выглядит следующим образом:
- Как
a
является upcasted кSuper
, классSuper
проверяется методом сопоставления - только
public void f(double d)
найден, так что поплавок отлиты в двойной - Теперь метод
public void f(double d)
в более конкретном классеSub
рассматривается и выполняется
Это правильно?
Потому что нет метода 'f (float)', доступного через ссылку типа 'Super'. –