why the program calls foo(String x) instead of foo(Object x)
That is because String class extends from Object and hence is more specific to Object. So, compiler decides to invoke that method. Remember, Compiler always chooses the most specific method to invoke. See Section 15.12.5 of JLS
If more than one member method is both accessible and applicable to a
  method invocation, it is necessary to choose one to provide the
  descriptor for the run-time method dispatch. The Java programming
  language uses the rule that the most specific method is chosen.
The informal intuition is that one method is more specific than
  another if any invocation handled by the first method could be passed
  on to the other one without a compile-time type error.
However, if you have two methods with parameter - String, and Integer, then you would get ambiguity error for null, as compiler cannot decide which one is more specific, as they are non-covariant types.