2025-05-24

 最近在使用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開發團隊來說很容易做到。
本文出自 “春華秋實” 博客

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *