can you please explain the first line last false output, why it is not true?
The compile-time type of ab
is A
, so the compiler – which is what performs overload resolution – determines that the only valid method signature is f(A a)
, so it calls that.
At execution time, that method signature is executed as B.f(A a)
because B
overrides it.
Always remember that the signature is chosen at compile time (overloading) but the implementation is chosen at execution time (overriding).