JAVA方法重载优先级

JAVA方法重载优先级

String的valueOf方法,图一
该方法正常执行,没有报空指针异常,是因为调用了,String类中的如下方法:
图二
由于图一valueOf方法中传入的参数为Object类型,所以调用了该方法。
在这里插入图片描述
接下来看上面的方法执行结果,报了空指针异常。它调用的方法为
在这里插入图片描述
那么为什么图三中没有调用图二中的方法哩,却调用了图四中的方法。

我们知道Java有八大基本类型和引用类型,还有一个特殊的null类型。null类型不能转换为八大基本类型,但是可以转换为任意引用类型,任意引用类型又都默认继承Object类。那么null这个特殊类型是可以用Object接受的。如下
在这里插入图片描述
由此可见,java 方法的重载是有优先级的。String类中valueOf()方法单个入参的总共有如下几种:
String valueOf(Object obj);
String valueOf(char data[]);
String valueOf(boolean b);
String valueOf(char c);
String valueOf(int i);
String valueOf(long l);
String valueOf(float f);
String valueOf(double d);
String类中提供的valueOf(数据类型)方法的参数类型为什么不能是byte类型?
入参为null类型时是可以调用 String valueOf(Object obj);String valueOf(char data[]);这两个方法的。但是由于JLS 中规定:
Java的重载解析过程是以两阶段运行的。第一阶段 选取所有可获得并且可应用的方法或构造器。第二阶段在第一阶段选取的方法或构造器中选取最精确的一个。如果一个方法或构造器可以接受传递给另一个方法或构 造器的任何参数,那么我们就说第一个方法比第二个方法缺乏精确性[JLS 15.12.2.5]。
由于Stirng valueOf(char data[])中的参数类型是可以传入String valueOf(Object obj)中的。但是反过来,就不一定行了。所以,这就是为什么图三中没有调用图二中的方法哩,却调用了图四中的方法。

猜你喜欢

转载自blog.csdn.net/qq_41921994/article/details/108459752