这个Java代码如何工作?

时间:2012-07-24 10:47:29

标签: 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))
       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"); 
  } 
} 

为什么结果是“等于双倍”但没有“等于浮动”?

3 个答案:

答案 0 :(得分:11)

要确定应调用哪个方法,编译器将按照JLS #5.3JLS #15.12.2中的详细说明执行以下列表:

  • 身份转换(第5.1.1节)
  • 拓宽原始转换(第5.1.2节) ==> printIt(double)在这里工作
  • 扩大参考转换(第5.1.5节)
  • 拳击转换(§5.1.7),可选地后跟加宽参考转换 ==>如果没有printIt(Float)
  • ,则会在此处调用printIt(double)
  • 一个拆箱转换(第5.1.8节),可选地后跟一个加宽的基元转换。

答案 1 :(得分:2)

因为widening(浮动到双倍)击败boxing

答案 2 :(得分:0)

printIt(Float f)接受Float对象,但printIt(double d)接受基本类型double。

因此,第二个printIt函数被调用,浮动转换为double。

请参阅http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Float.html

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

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