簡體   English   中英

Java的。重載方法

[英]Java. Overloading method

例如,我有這個類:

public class Col {

static void test(int a)
    {
        System.out.println("int");
    }
    public static void main(String args[])
    {
        Col.test(12);  //1

        Col.test((byte)12); //2

        Col.test((long)100); //3

    }
}

現在我有興趣了解algoritm如何使用這段代碼。 我想,這個步驟:

1行 - 所有正確的調用方法與int param,完美。

2行 - 帶字節參數的調用方法... oooops。 做什么? Java嘗試將byte擴展為int? 這是真的?

3線呼叫方法與長參數...再次ooops。 做什么? 轉換long到int java不行,因為精度損失。 它的嘗試? 結果 - 例外。

比我添加這個:

 public static void test(Object a)
    {
        System.out.println("Object");
    }

如果是電話:

Col.test((long)100);

所有正確,沒有異常所以,原始類型long和Object之間的關系是什么?

是的,有一個從byteint的隱式轉換,但沒有從longint隱式轉換(因為丟失信息的可能性)。

在第三種情況下,你使用的自動裝箱 ,這將轉換為long (基本型)到Long (類類型)。

您可以通過將test主體更改為:

public static void test(Object a)
{
    System.out.println(a.getClass());
}

然后它將打印出class java.lang.Long

您的第一個示例顯示了基元類型的轉換。 第二個顯示裝箱和拆箱,簡而言之 - 原始類型(如long )和它們的包裝類(在本例中為java.lang.Long )之間的方便轉換。

重載是實現具有相同名稱但不同參數的方法 這里我們有兩種方法

static void test(int a){}
static void test(Object a){}

並用test((long) 100)調用它。 無法調用第一個方法,因為如果沒有顯式轉換,JVM不會將long縮小到int 但是JVM(版本1.5+)可以將long值轉換為Long (自動裝箱)並且test(Long.valueOf((long) 100))是第二種方法的良好匹配。

這是因為自動裝箱功能。 實際上你已經將原語提升為long並且在自動調用test方法時它正在為其等效類型進行搜索,因此它調用test(Object a)。你可以看到這樣的Col.test(new Integer(12));這也是調用測試(對象a)。也可以參考此鏈接確定對象是否是基本類型

public static void test(Object obj) {
      if (obj instanceof Integer) {
          System.out.println("Integer");
      } else if (obj instanceof Double) {
          System.out.println("Double");
      } else if (obj instanceof Float) {
          System.out.println("Float");
      } else if (obj instanceof Long) {
          System.out.println("Long");
      } 
  }

所有java原語都有相應的盒裝“類型”,它們是實際的類。 在你的例子中,long有一個對應的類Long。 此類從Object擴展。

你經歷的是拳擊和拆箱。

它是Java 5中引入的一個功能。它稱為Autoboxing。 在這種情況下,基本類型將轉換為Object(在您的情況下為long to Long)。 有關Autoboxing的詳細信息,請參閱此鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM