我写了这个测试代码
public class ConstructorTestApplication {
private static String result;
public static void main(String[] args) {
ConstructorTest test1 = new ConstructorTest(0);
System.out.println(result);
}
private static class ConstructorTest {
public ConstructorTest(double param){
result = "double constructor called!";
}
public ConstructorTest(float param) {
result = "float constructor called!";
}
}
}
结果是
float constructor called!
为什么调用float构造函数而不是双构造函数?这是动态方法查找的一部分吗?
答案 0 :(得分:19)
ConstructorTest(float param)
是两个构造函数中最具体的方法,因为具有double
参数的方法可以接受任何float
值,但反之则不然。
15.12.2.5。选择最具体的方法
如果多个成员方法都可访问且适用于a 方法调用,有必要选择一个提供 运行时方法调度的描述符。 Java编程 语言使用选择最具体的方法的规则。
非正式的直觉是,一种方法更具体 如果可以传递第一个方法处理的任何调用,则为另一个 没有编译时类型错误的另一个。
答案 1 :(得分:3)
我提出JLS 5.3. Method Invocation Conversion和5.1.2. Widening Primitive Conversion
对原始类型的19个特定转换称为扩展 原始转换:
byte to short,int,long,float或double
短,int,long,float或double
char to int,long,float或double
int to long,float或double
长期漂浮或加倍
浮动加倍
在完成转换时,基本上浮点数优先于方法重载的双精度数。