Java snippet output not understood, probably related to polymorphism

java, polymorphism

Solution

The compile-time type of `ab` is just `A`. Therefore, when the compiler sees this expression:

ab.f(b)

... it only considers method signatures declared on `A` and its superclasses (just `Object` in this case).

So, the compiler makes the decision to call the method with the signature `f(A a)`.

Now at execution time, the VM chooses which implementation of that signature to execute based on the execution-time type of the target of the method call, which is `B`.

`B` overrides `f(A a)`, so that overriding implementation is called - and returns 2.

Basically, overloading is determined at compile-time to work out what method signature to call based on the compile-time types of both the target of the call and the arguments, and overriding is determined at execution-time to work out the exact implementation to execute based on the execution-time type of the target object.

Problem

I was wondering why this bit of Java yields 2, and not 3 : ``` public class Test { private static class A { int f(A a) { return 1; } } private static class B extends A { int f(A a) { return 2; } int f(B b) { return 3; } } public static void main(String[] astrArgs) { A ab = new B(); B b = new B(); System.out.println( ab.f(b) ); } } ``` I came across this in a test question, and couldn't get the logic behind it.

Original source