java 的前期繫結和後期繫結
阿新 • • 發佈:2018-10-31
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() */