我有一个问题为什么这段代码打印的是YYZ10.0而不是XXZ10.0?第一个构造函数是A(int),然后内部语句返回false,所以9+1f应该跳转到A(float)构造函数,而不是跳转到A(double)。
public class Main {
public static void main(String[] args) {
System.out.print(new A(011).fun()[1]);
}
}
class A{
double value;
public A(int value){
this(value >> 2 == 1 ? value+1.0 : value+1f);
}
public A(float value){
System.out.print("XX");
this.value = value;
}
public A(double value){
System.out.print("YY");
this.value = value;
}
public Object[] fun(){
return new Object[]{new Object(), this};
}
public String toString(){
return "Z"+value;
}
}
如果一个方法有多个重载,Java会在编译时选择调用哪一个,而不是在运行时。在本例中,您通过this
调用构造函数。在编译时,Java决定调用三个构造函数中的哪一个,您可以看到它必须是接受double
的构造函数。
Java必须选择接受double
的构造函数,不仅因为它可以处理double
和float
的情况,还因为没有float
的情况。三元表达式只能有一种类型。有时不是double
有时不是float
;总是double
。
考虑这个语句:
____ result = value >> 2 == 1 ? value+1.0 : value+1f;
你会在空格中输入什么类型?没有办法写"有时double
,有时float
"。必须是double
修改这一行(在A(int)
构造函数中):
this(value >> 2 == 1 ? value+1.0 : value+1f);
:
this(value >> 2 == 1 ? value+1f : value+1f);
它应该这样调用正确的构造函数。