У меня есть большая проблема, понимающая результат некоторого кода.Java - наследование и тип переменных при вызове метода
public class ClassA {
public void stampa(ClassA p) {
System.out.println("AAA");
}
}
public class ClassB extends ClassA {
public void stampa(ClassB p) {
System.out.println("BBB");
}
public void stampa(ClassA p) {
System.out.println("AAA/BBB");
}
}
public class ClassC extends ClassA {
public void stampa(ClassC p) {
System.out.println("CCC");
}
public void stampa(ClassA p) {
System.out.println("AAA/CCC");
}
}
И главное, что выглядит эта
public static void main(String[] args) {
ClassA a1, a2;
ClassB b1;
ClassC c1;
a1 = new ClassB();
b1 = new ClassB();
c1 = new ClassC();
a2 = new ClassC();
b1.stampa(b1);//BBB
a1.stampa(b1);//AAA/BBB
b1.stampa(c1);//AAA/BBB
c1.stampa(c1);//CCC
c1.stampa(a1);//AAA/CCC
a2.stampa(c1);//AAA/CCC
}
У меня трудно понять, почему результат для a1.stampa (b1); «AAA/BBB», а не «BBB». Как я понял из наследования, статическим типом a1 во время компиляции является ClassB, поэтому я искал метод «штамп» в ClassB, а для параметра метода статический тип тоже ClassB, поэтому я выберу первый штамповый метод класса В.
То же самое происходит и при попытке понять результат a2.stampa (c1); который является «AAA/CCC», а не «CCC».
Может кто-нибудь, пожалуйста, помогите мне понять, что я делаю неправильно?