这个Java代码是如何工作的?

这个Java代码是如何工作的?,java,Java,我有这个密码 class NumberMachine { public static void main(String [] args) { Integer wi1 = new Integer("420"); int i = 101; Integer wi2 = i*420/101; if(wi1 == wi2) System.out.print(" =="); if(wi1.equals(wi2))

我有这个密码

 class NumberMachine { 
   public static void main(String [] args) { 
     Integer wi1 = new Integer("420"); 
     int i = 101; 
     Integer wi2 = i*420/101; 

     if(wi1 == wi2)
       System.out.print(" =="); 
     if(wi1.equals(wi2))
       System.out.print(" equal"); 
     float f = 1.23f; 
     new NumberMachine().printIt(f); 
  } 

  void printIt(Float f) { 
    System.out.println(" Float"); 
  } 

  void printIt(double d) { 
    System.out.println(" double"); 
  } 
} 

为什么结果是“相等双精度”而不是“相等浮点”?

因为
加宽
(浮点到双精度)拍数printIt(Float f)接受浮点对象,但printIt(double d)接受基本类型double

因此,调用第二个printIt函数时,浮点转换为double

您可以这样调用第一个函数:

Float f = new Float(5.0);
printIt(f);

要确定应调用哪个方法,编译器将遍历以下列表,如和中所述:

  • 身份转换(§5.1.1)
  • 扩大原语转换(§5.1.2)==>
    printtit(double)
    在这里起作用
  • 拓宽参考转换(§5.1.5)
  • 如果没有
    printIt(double)
  • 取消装箱转换(§5.1.8)后可选地进行加宽原语转换

“方法解析时…”您是否遗漏了一些单词?请你重新表述一下你答案中的那一部分好吗?其背后的原因是
加宽
的时间比
装箱
的时间要长,因此,如果他们不按此顺序执行,旧代码的行为可能会发生变化。@Keppil绝对-他们实际上在JLS#15.12.2.1中提到了这一点:
,这保证了在Java SE 5.0之前的Java编程语言中有效的任何调用都不会因为引入变量算术方法而被认为是不明确的,隐式装箱和/或取消装箱。
“printIt(Float f)接受Float对象,而不是基本类型Float。”=>这不完全准确-如果没有
printIt(double)
方法,程序将打印
等于Float