2015-06-25 144 views
3

以下方法返回的输出:在原始INT ARG方法爪哇方法重载

public class TestMethodOverloading { 
      private void show(int a){ 
       System.out.println("in primitive int arg method"); 
      } 
     private void show(float a){ 
      System.out.println("in primitive float arg method"); 
      } 
     public static void main(String[] args) { 
     TestMethodOverloading tmo = new TestMethodOverloading(); 
     tmo.show(4); 
     } 
    } 

然而,如果我改变显示方法的arguement类型从int到整型然后输出返回:在基本float ARG方法

 public class TestMethodOverloading { 
      private void show(Integer a){ 
       System.out.println("in Integer arg method"); 
      } 
     private void show(float a){ 
      System.out.println("in primitive float arg method"); 
      } 
     public static void main(String[] args) { 
     TestMethodOverloading tmo = new TestMethodOverloading(); 
     tmo.show(4); 
     } 
    } 

但现在如果我改变从浮法第二方法的arguement类型为Float然后输出再次改变到:在整数ARG方法

 public class TestMethodOverloading { 
      private void show(Integer a){ 
       System.out.println("in Integer arg method"); 
      } 
     private void show(Float a){ 
      System.out.println("in primitive float arg method"); 
      } 
     public static void main(String[] args) { 
     TestMethodOverloading tmo = new TestMethodOverloading(); 
     tmo.show(4); 
     } 
    } 

谁能帮助我理解这种行为

+0

忽略副本的标题,看看答案。 –

回答

6

这是因为试图找到匹配的方法来调用,Java将考虑方法,其中装箱或拆箱转换是不必要的时候,才考虑方法时,其中一个拳击或取消装箱转换是必要的。

Section 15.12.2 of the JLS状态:

  1. 第一阶段(§15.12.2.2)执行重载而不允许拳击或取消装箱转换,或使用可变元数的方法调用的。如果在此阶段没有找到适用的方法,则处理继续到第二阶段

这保证了该是有效的Java编程语言的Java SE 5.0之前的任何调用并不认为是不明确引进的变量元数法,隐式装箱和/或拆箱的结果。然而,变量arity方法(第8.4.1节)的声明可以改变为给定方法方法调用表达式选择的方法,因为变量arity方法在第一阶段被视为一个固定的arity方法。例如,在已声明m(Object)的类中声明m(Object ...)将导致m(Object)不再为某些调用表达式(如m(null))选择,如m(Object []) )更具体。

  • 第二阶段(§15.12.2.3)执行重载解析而允许装箱和拆箱,但仍排除使用可变元数的方法调用的。如果在此阶段没有找到适用的方法,则处理继续到第三阶段。
  • 这确保如果通过固定的arity方法调用适用方法,则通过变量arity方法调用决不会选择方法。

    1. 第三阶段(§15.12.2.4)允许将重载与变量arity方法,装箱和拆箱相结合。

    (粗体重点煤矿)

    在第一个例子中,int方法是完全匹配,并接管了float方法,即使它是适用无装箱/拆箱。

    在第二个示例中,float方法适用于不装箱/拆箱,但Integer方法需要装箱,因此选择了float方法。

    在第三个示例中,两种方法都需要装箱,因此现在选择Integer方法。

    +0

    感谢您的解释.. :) – user3403462

    0

    在java方法调用中,加宽转换(int - > float)优先于装箱转换(int - > Integer)。所以在片段2 private void show(float a)将得到执行,并在片段2 private void show(Integer a)将优秀。