работа null в Java

Расскажите почему при вызове строчки m(null); в консоль выводится "String", получается null является string - объектом ?

public class Main {
  static void m( Object i) {System.out.print("Object");  }
  static  void m (String i) {System.out.print("String"); }
 public static void main(String[] args) {
  Object i = null;
  m(i);
  m(null);
 }}

Ответы (1 шт):

Автор решения: user7860670

Выражение null имеет тип интерфейса javax.lang.model.type.NullType. Этот тип расширяет ReferenceType и может быть использовать для любых ссылок. При выборе перегруженной функции компилятор отдает предпочтение варианту, использующему наиболее частный тип. А так как String является подтипом Object, то тут вызывается вариант функции, принимающий ссылку на String.

Можно привести пример посложнее. Здесь Number будет предпочтительней Object, а Integer предпочтительей Number:

public class HelloWorld
{
    public static void test(Object str)
    {
        System.out.println("Object");

    }

    public static void test(Number str)
    {
        System.out.println("Number");

    }

    public static void test(Integer str)
    {
        System.out.println("Integer");

    }

    public static void main(String []args)
    {
        test(null);
    }
}
→ Ссылка