会调用String那个参数的函数
null 可以赋值给Object 和 String
但是编译器会预先赋值给子类 即String
如果你再加一个Integer为参数的函数
编译器就会报错 因为编译器不知道赋值给Integer 还是String好
null 是一个模棱两可的类型
关于重载函数 其实都是编译器的功能
编译器在编译期间会把命名重复 参数不同的函数 重新起名
所以在字节码中不存在重载函数
会调public static void fun(Object a)
很负责的告诉你,是
public static void fun(String a)
会调用fun(String a)
如果没有存在null的类型object才会被调用
如果做继承关系条线
Object ------A---------B(null)
A继承Object,B继承A,如果fun的参数为Object或其他类(非A非B),则调用参数Object那个fun
如果是A和A的子类但不是B的子类,就调用A的fun
如果是B和B的子类就调用参数为B的fun
null即使都能匹配,但按最小匹配原则
好比B的子类也是A的子类,但是实际肯定是调用B的fun
如果你是Object跟String 那null就该调用参数为String的fun了
如果你做两条线
Object ------A---------B(null)
------C---------D(null)
null可以被看做B的也可以被看做D的,这是编译器会报错的,null模棱两可