作者: liuwei1981 鏈接:http://liuwei1981.javaeye.com/blog/226647 發(fā)表時(shí)間: 2008年08月11日
聲明:本文系JavaEye網(wǎng)站發(fā)布的原創(chuàng)博客文章,未經(jīng)作者書面許可,嚴(yán)禁任何網(wǎng)站轉(zhuǎn)載本文,否則必將追究法律責(zé)任!
下面的這個(gè)類呈現(xiàn)了兩個(gè)令人混淆的構(gòu)造器。 main方法調(diào)用了一個(gè)構(gòu)造器,但它調(diào)用的究竟是哪一個(gè)?該程序的輸出取決于這個(gè)問(wèn)題的答案。它會(huì)打印什么?甚至它是否合法?
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); } }
傳遞給構(gòu)造器的是一個(gè)空的對(duì)象引用,因此,初看起來(lái),改程序好像應(yīng)該調(diào)用參數(shù)類型為Object的重載版本,并且打印Object。另一方面,數(shù)組也是引用類型,因此null也可以應(yīng)用于類型為double[]的重載版本。看起來(lái)這個(gè)調(diào)用是模棱兩可的,改程序不能編譯,但如果試著運(yùn)行改程序,就會(huì)發(fā)現(xiàn)它打印的是double array。
java的重載解析過(guò)程是分兩階段運(yùn)行的,第一階段選取所有可獲得并且可應(yīng)用的方法或構(gòu)造器;第二階段在第一階段選取的方法或構(gòu)造器中選取最精確的一個(gè)。如果一個(gè)方法或構(gòu)造器可以接受傳遞給另一個(gè)方法或構(gòu)造器的任何參數(shù),那么我們就說(shuō)第一個(gè)方法比第二個(gè)方法缺乏精確性。
在我們的程序中,兩個(gè)構(gòu)造器都可以獲得并且可應(yīng)用的,構(gòu)造器Confusing(Object)可以接受任何傳遞給Confusing(double【】)的參數(shù),因此Confusing(double【】)相對(duì)更精確,因此,最終選擇該方法。
一般來(lái)說(shuō),要想強(qiáng)制要求編譯器選擇一個(gè)精確的重載版本,需要將實(shí)參轉(zhuǎn)型為形參所聲明的類型。
本文的討論也很精彩,瀏覽討論>>
JavaEye推薦
文章來(lái)源:http://liuwei1981.javaeye.com/blog/226647