2015-06-25 142 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)將優秀。