The method name of your example is overloaded. The methods are not overridden.
c2.m1(a1); c2.m1(b1); c2.m1(c1);
The compiler chooses class A, because the compile-time type of c2 is A.
The compiler chooses method A.m1(A a), because the types A, B, C of the arguments a1, b1, c1 can be converted to the parameter type A.
At run-time the virtual machine would override A.m1(A a) based on the actual type C of the object. However, there is no method C.m1(A a) in class C. So overriding does not occur in this example.
----
The method resolution process takes place at compile-time based on the declared types of the object reference and the declared types of the arguments. This process determines which [overloaded] form of a method should be invoked, but not which implementation of that method. At run-time the actual type of the object the method is invoked upon is used to find an implementation of the method that was determined at compile time. The
Java Programming Language 6.9.1