1. 程式人生 > >java 的前期繫結和後期繫結

java 的前期繫結和後期繫結

           java的前期繫結在程式執行前根據編譯時型別繫結,呼叫開銷較小,如C語言只有前期繫結這種方法呼叫

後期繫結,是指在執行時根據物件的型別進行繫結,又叫動態繫結或執行時繫結。實現後期繫結,需要某種機制支援,以便在執行時能判斷物件的型別,呼叫開銷比前期繫結大。
Java中的static方法和final方法屬於前期繫結,子類無法重寫final方法,成員變數(包括靜態及非靜態)也屬於前期繫結。除了static方法和final方法(private屬於final方法)之外的其他方法屬於後期繫結,執行時能判斷物件的型別進行繫結。

          驗證程式如下:

    

class Base
{
    //成員變數,子類也有同樣的成員變數名
    public String test="Base Field";
    //靜態方法,子類也有同樣簽名的靜態方法
    public static void staticMethod()
    {
        System.out.println("Base staticMethod()");
    }
    //子類將對此方法進行覆蓋
    public void notStaticMethod()
    {
        System.out.println("Base notStaticMethod()");
    }

}
public class Derive extends Base
{
    public String test="Derive Field";
    public static void staticMethod()
    {
        System.out.println("Derive staticMethod()");
    }
    @Override
    public void notStaticMethod()
    {
        System.out.println("Derive notStaticMethod()");
    }
    //輸出成員變數的值,驗證其為前期繫結。
    public static void testFieldBind(Base base)
    {
        System.out.println(base.test);
    }
    //靜態方法,驗證其為前期繫結。
    public static void testStaticMethodBind(Base base)
    {
        //The static method test() from the type Base should be accessed in a static way
        //使用Base.test()更加合理,這裡為了更為直觀的展示前期繫結才使用這種表示。
        base.staticMethod();
    }
    //呼叫非靜態方法,驗證其為後期繫結。
    public static void testNotStaticMethodBind(Base base)
    {
        base.notStaticMethod();
    }
    public static void main(String[] args)
    {
        Derive d=new Derive();
        testFieldBind(d);
        testStaticMethodBind(d);
        testNotStaticMethodBind(d);
    }
}
/*程式輸出:
Base Field
Base staticMethod()
Derive notStaticMethod()
 */