[英]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之間的關系是什么?
是的,有一個從byte
到int
的隱式轉換,但沒有從long
到int
隱式轉換(因為丟失信息的可能性)。
在第三種情況下,你使用的自動裝箱 ,這將轉換為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.