首先我們先看一道測試題目,源代碼如下所示,你覺得程序能否通過編譯呢,假如可以通過編譯輸出的結(jié)果會是什么呢?
//TestOverLoad.java
public class TestOverLoad
{
public static void main(String[] args)
{
Test test = new Test();
test.PRint(null);
}
}
class Test
{
public void print(String some)
{
System.out.println("String version print");
}
public void print(Object some)
{
System.out.println("Object version print");
}
}
答案是可以通過編譯,輸出的結(jié)果是String version print。不知道你猜測的是否準(zhǔn)確是否知道其中的原理,這個題目明顯是考察方法重載的,重載使得java的類可以有具有多個相同方法名的方法。編譯器可以通過方法的參數(shù)的類型和個數(shù)來區(qū)分他們。而返回值和異常是不能作為區(qū)別標(biāo)志的。上面的程序輸出了String version print是遵循了方法重載中準(zhǔn)確性的原則,null是作為一個很非凡的參數(shù)傳給了方法print(),因為你可以認(rèn)為null是String,也可以認(rèn)為null是Object。但是從層次上看Object處在更上層,String是從Object繼續(xù)過來的,調(diào)用print(String some)將更準(zhǔn)確。
假如在TestOverLoad類中再添加一個方法如下所示,這樣會如何呢?
public class TestOverLoad
{
public static void main(String[] args)
{
Test test = new Test();
test.print(null);
}
}
class Test
{
public void print(String some)
{
System.out.println("String version print");
}
public void print(Object some)
{
System.out.println("Object version print");
}
public void print(StringBuffer some)
{
System.out.println("StringBuffer version print");
}
}
答案是不能通過編譯,為什么呢?由于StringBuffer和String并沒有繼續(xù)上的關(guān)系,因此編譯器感覺StringBuffer和String作為參數(shù)的方法都很準(zhǔn)確,它就不知道到時候會運行哪個方法了,因此會出現(xiàn)編譯錯誤,這是方法重載中唯一性的原則。假如我們把參數(shù)null修改為"hello world",那么就可以通過編譯并運行輸出String version print了。
曾經(jīng)在java.sun.com上讀文章看到一篇文章說方法的返回值也是區(qū)別方法的標(biāo)志,其實這是錯誤的。看看下面的程序
public class A
{
public int aMethod(String s)
{
System.out.println(s);
return 1;
}
public void aMethod(String s)
{
System.out.println(s);
}
}
編譯的時候會提示aMethod(String s)方法已經(jīng)定義過的錯誤。實踐證實一切!
新聞熱點
疑難解答