Answer 1 will not compile. The compiler checks that the method exist in the reference type, not the object type. At runtime, the JVM will dynamically bind the method that executes based on object type.
In this case, at compile time the compiler will confirm that every method called against variable 'a' is defined (at least abstract) in class Base. Attempting to call a.getFields() generates a compile error because getFields() is not defined in class Base.
It's easy in this case to see that variable 'a' will always contain an object of type Agg, but in more complex examples the compiler may not be able to confirm at compile-time the exact object type that the reference will contain...Hence, for safety sake, the compiler must complain.