最近在使用Eclipse閱讀一些優秀的開源項目源碼,其間發現一個初學者很容易進入的陷阱。現敘述如下:
假設有兩個類,子類Sub繼承自父類Base,代碼如下:
//Base類
public class Base {
public void say(){
sayHello();
}
public void sayHello(){
System.out.println("Base say Hello!");
}
}
//Sub類
public class Sub extends Base {
@Override
public void sayHello() {
System.out.println("Sub say Hello!");
}
public void test(){
super.say();
}
}
//測試類TestCase
public class TestCase {
public static void main(String[] args) {
Sub sub=new Sub();
sub.test(); //結果是"Sub say Hello!"還是"Base say Hello!"?
}
}
如果你已經看出結果是"Sub say Hello!",那麼恭喜你,你的Java基本功很紮實。在Sub類的test()方法中調用super.say(),可以簡單的理解成普通的函數調用 ,將super.say()調用替換成實現代碼後,Sub的實現代碼如下:
public class Sub extends Base {
@Override
public void sayHello() {
System.out.println("Sub say Hello!");
}
public void test(){
sayHello(); //super.say()調用的實現代碼
}
}
到這,結果應該顯而易見瞭,此處sayHello()指向Sub.sayHello()方法,所以輸出結果為"Sub say Hello!"。
背景知識講完瞭,下面看一下Eclipse中的代碼跟蹤功能:
按住Ctrl鍵,鼠標單擊super.say(),Eclipse中跳轉結果如下:
按住Ctrl鍵,單擊第3行代碼sayHello(),跳轉結果如下:
看到這樣的跳轉結果會讓很多初學者摸不著頭腦。希望在今後的Eclipse版本中能夠盡快的修正這個功能,畢竟這對Eclipse開發團隊來說很容易做到。
本文出自 “春華秋實” 博客