作者:
liuwei1981
鏈接:
http://liuwei1981.javaeye.com/blog/226647
發表時間: 2008年08月11日
聲明:本文系JavaEye網站發布的原創博客文章,未經作者書面許可,嚴禁任何網站轉載本文,否則必將追究法律責任!
下面的這個類呈現了兩個令人混淆的構造器。 main方法調用了一個構造器,但它調用的究竟是哪一個?該程序的輸出取決于這個問題的答案。它會打印什么?甚至它是否合法?
public class Confusing {
private Confusing(Object o){
System.out.println("Object!");
}
private Confusing(double[] fArray){
System.out.println("double array!");
}
public static void main(String[] args){
new confusing(null);
}
}
傳遞給構造器的是一個空的對象引用,因此,初看起來,改程序好像應該調用參數類型為Object的重載版本,并且打印Object。另一方面,數組也是引用類型,因此null也可以應用于類型為double[]的重載版本。看起來這個調用是模棱兩可的,改程序不能編譯,但如果試著運行改程序,就會發現它打印的是double array。
java的重載解析過程是分兩階段運行的,第一階段選取所有可獲得并且可應用的方法或構造器;第二階段在第一階段選取的方法或構造器中選取最精確的一個。如果一個方法或構造器可以接受傳遞給另一個方法或構造器的任何參數,那么我們就說第一個方法比第二個方法缺乏精確性。
在我們的程序中,兩個構造器都可以獲得并且可應用的,構造器Confusing(Object)可以接受任何傳遞給Confusing(double【】)的參數,因此Confusing(double【】)相對更精確,因此,最終選擇該方法。
一般來說,要想強制要求編譯器選擇一個精確的重載版本,需要將實參轉型為形參所聲明的類型。
本文的討論也很精彩,瀏覽討論>>
JavaEye推薦
文章來源:
http://liuwei1981.javaeye.com/blog/226647