java動態 靜態繫結以及雙分派

2021-08-07 09:19:36 字數 1982 閱讀 1893

動態繫結:程式在執行期間而不是在編譯期間,根據所引用物件的實際型別呼叫對應的方法,重寫以及介面的實現都屬於該範疇,

使用實際的物件資訊來完成api的呼叫

public class dynamicbind 

}class father

}class son extends father

}class daughter extends father

}

output

father.method

son.method

daughter.method

儘管引用的型別都是father,但是在執行時卻呼叫的是實際型別的方法,也就是說父類引用指向子類例項時,會根據實際例項型別呼叫對應的方法

靜態繫結:在編譯期間已經確定執行的方法,api的過載屬於該範疇,也就是說需要執行的方法在編譯期間已經確定。凡是使用static/private/final修飾的方法或者屬性也屬於該範疇,static修飾的方法或者屬性屬於類,不能被繼承也就是說無法重寫。private只有該類的物件能夠訪問,不能被繼承也就是說無法重寫,final修改的屬性不允許重新複製,可以理解為常量,final修飾的方法不允許被重寫。

使用類資訊完成api的呼叫

public class staticbind 

}class mother{}

class tom extends mother{}

class mark extends mother{}

class ext

public void method(tom tom)

public void method(mark mark)

}

output

mother.method

mother.method

mother.method

編譯時通過方法簽名已經確定呼叫的方法,也就是說在實際呼叫中傳入了不同的物件資訊,但是實際的類資訊只有乙個就是mather。

偽動態實現(instanceof)採用型別判斷的方式實現過載的動態效果

class ext  else if (mother instanceof mark)  else if (mother instanceof mother) 

}public void method(tom tom)

public void method(mark mark)

}

父類的判斷必須要寫在最後,這個後和異常捕獲的道理時一致的,如果將父類寫在最前邊,那麼和之前的執行效果時一致的,因為自類和父類是is-a的關係。雙分派實現動態繫結

public class dispatchbind 

}class mom

}class jack extends mom

}class licy extends mom

}class execute

public void method(jack jack)

public void method(licy licy)

}

output

mom.method

jack.method

licy.method

雙分派實現動態繫結的本質,就是在過載方法委派的前面加上了繼承體系中重寫的環節,由於重寫是動態的,所以過載就是動態的了

第一次分派:mom = new jack();mom.accpet(ext);父類引用指向自類例項,並且自類重寫了父類方法所有會呼叫自類jack的accpet()方法

第二次分派:發生在jack類中的accpet中,關鍵子為this。該處的this可以理解為jack.this.此時會呼叫execute中的method(jack jack)

雙分派意味著請求的操作取決於請求的種類和接受者的型別

靜態分派與動態分派

1.靜態分派就是按引數的靜態型別而不是實際型別定位方法呼叫版本的過程,發生在編譯期間。過載的本質就是靜態分派,在編譯期間根據引數的靜態型別決定要呼叫的方法。過載demo public class staticdispatch static class man extends human static...

靜態分派和動態分派

靜態分派 所有依賴靜態型別來定位方法執行版本的分派成為靜態分派,發生在編譯時期,典型 應用為方法過載。靜態分派發生在編譯階段,因此確定靜態分派的動作實際上不是由虛擬機器來執行的。動態分派 典型應用為重寫,是一種動態的概念。向上轉型後呼叫子類覆寫的方法便是乙個很好地說明動態分派的例子。就是說,我們在判...

動態分派與靜態分派

包括靜態分派和動態分配。靜態分派 所有依賴今天型別來定位方法執行版本的分派稱為靜態分派,發生那邊應階段典型應用為方法過載靜態分派發生在編譯階段,因此靜態分派的動作實際上並不是虛擬機器來完成的。動態分派 典型應用為重寫,是一種動態的概念。向上轉型後呼叫子類覆寫的方法便是乙個很好的說明動態分配的例子。很...