Como um método sobrecarregado é escolhido quando um parâmetro é o valor nulo literal?

Eu me deparei com essa pergunta em um teste

public class MoneyCalc {

   public void method(Object o) {
      System.out.println("Object Verion");
   }

   public void method(String s) {
      System.out.println("String Version");
   }

   public static void main(String args[]) {
      MoneyCalc question = new MoneyCalc();
      question.method(null);
   }
}

A saída deste programa é "String Version". Mas eu não era capaz de entender por que passar um nulo para um método sobrecarregado escolheu a versão da string. É nula uma variável String apontando para nada?

No entanto, quando o código é alterado para,

public class MoneyCalc {

   public void method(StringBuffer sb) {
      System.out.println("StringBuffer Verion");
   }

   public void method(String s) {
      System.out.println("String Version");
   }

   public static void main(String args[]) {
      MoneyCalc question = new MoneyCalc();
      question.method(null);
   }
}

ele dá um erro de compilação dizendo "O método method (StringBuffer) é ambíguo para o tipo MoneyCalc"

questionAnswers(8)

yourAnswerToTheQuestion