Posted on 2007-02-16 20:15
冰浪 閱讀(437)
評論(1) 編輯 收藏 所屬分類:
Java
????????? 在java的繼承中,我們可以在子類中定義一方法去覆蓋父類中定義的同名同參方法,這叫方法覆蓋。其中有一點讓我幾經思考:父類的私有方法不能被子類覆蓋。
??? 我們先來看一個例程(引用孫MM的,呵呵):
//Sub.java? ,例程1?
class Base
{
?private String showMe()
?{
??return "Base";
?}
?public void print()
?{
??System.out.print(showMe());//調用誰的showMe()方法呢?
?}
}
class Sub extends Base
{
?public String showMe()
?{
??return "Sub";
?}
?public static void main(String[] args)
?{
??Sub sub=new Sub();
??sub.print();
?}
}
從例程中我們可以看到,在父類Base中定義了一private訪問權限的showMe()方法,在子類Sub中又定義了public訪問權限的showMe()方法。
運行這個例程,得到的打印結果是“Base”。
同樣,我們將例程做些修改:將Base類的showMe()方法的訪問權限改為public,即:
//Sub.java? ,例程2
class Base
{
?public String showMe()
?{
??return "Base";
?}
?public void print()
?{
??System.out.print(showMe());
?}
}
class Sub extends Base
{
?public String showMe()
?{
??return "Sub";
?}
?public static void main(String[] args)
?{
??Sub sub=new Sub();
??sub.print();
?}
}
再次運行例程,得到的打印結果是“Sub”。
兩次結果不一致,很顯然是private在作怪,對!一開始我就提到了這點:父類的私有方法不能被子類覆蓋。
在例程2中,sub.print()所調用的是自己的showMe()方法,此時,Sub類的showMe()方法已覆蓋了父類的方法,所以在Sub類中繼承Base類的print()方法所調用的就是自己的showMe()方法。
而在例程1中,Sub類的showMe()方法并不能覆蓋父類Base的showMe()方法,這兩個showMe()方法之間并不存在覆蓋關系。此時先要明白一點:print()方法是在Base類中定義的,所以當執行sub.print()這句代碼時,JVM首先在sub實例對象時無法找到匹配的showMe()方法,所以就直接調用其父類的showMe()方法。然而在例程2中,Sub類的showMe()方法已覆蓋其父類的相應方法,所以JVM在sub實例對象里找到了相匹配的自己的showMe()方法,所以調用其來執行,不再調用父類的方法。