一.定義:
1.方法綁定:一個方法被調用時該方法關聯其方法體的過程。
2.靜態綁定:在面向過程的中又稱爲前期綁定在程序編譯時進行了綁定,即在還沒運行時,就已經加載到內存。
3.動態綁定:在面向過程中稱爲後期綁定(運行時綁定)在運行時就進行綁定,根據實際情況有選擇的進行綁定。
二.優越性:
動態綁定靈活性相對靜態綁定來說要高,因爲它在運行之前可以進行選擇性的綁定,很多時候優點就是缺點,正是因爲選擇性的綁定,所以動態綁定的執行效率要低些(因爲,綁定對象,還要進行編譯)。
三.靜態綁定實例:
- //父類
- public class Person {
- protected String attribute="人的特性";
- }
- //子類
- public class Male extends Person {
- protected String attribute = "男人的特性";
- }
- //測試
- public class Tester {
- public static void main(String[] args) {
- Person p = new Male();
- System.out.println("" + p.attribute);
- }
- }
- <span style="font-size: medium;"><span style="font-family: comic sans ms,sans-serif;">//父類
- public class Person {
- protected String attribute="人的特性";
- }
- //子類
- public class Male extends Person {
- protected String attribute = "男人的特性";
- }
- //測試
- public class Tester {
- public static void main(String[] args) {
- Person p = new Male();
- System.out.println("" + p.attribute);
- }
- }
- </span></span>
輸出結果:人的屬性
可以看出子類的對象調用到的是父類的成員變量。所以必須明確,動態綁定針對的範疇只是對象的方法。
static 塊靜態加載:
- public class StaticTest {
- static {
- System.out.println("沒有主方法我照樣執行");
- }
- }
- <span style="font-size: medium;"><span style="font-family: comic sans ms,sans-serif;">public class StaticTest {
- static {
- System.out.println("沒有主方法我照樣執行");
- }
- }</span></span>
運行結果:
沒有主方法我照樣執行Java.lang.NoSuchMethodError:
main
Exception in thread "main"
java中的變量都是靜態綁定的;
構造方法 以及private,static,final類方法的調用都是靜態綁定的。
四.動態綁定實例:
- //父類
- public class Person {
- public void show(){
- System.out.println("人的特性");
- }
- }
- //子類
- public class Male extends Person{
- public void show(){
- System.out.println("男人的特性");
- }
- }
- //測試
- public class Tester{
- public static void main(String [] args){
- Person p = new Male();
- p.show();
- }
- }
- <span style="font-size: medium;"><span style="font-family: comic sans ms,sans-serif;">//父類
- public class Person {
- public void show(){
- System.out.println("人的特性");
- }
- }
- //子類
- public class Male extends Person{
- public void show(){
- System.out.println("男人的特性");
- }
- }
- //測試
- public class Tester{
- public static void main(String [] args){
- Person p = new Male();
- p.show();
- }
- }
- </span></span>
運行結果:男人的特性
上面當創建一個Male類對象,通過繼承的關係向上轉型立即賦值給Person類的對象,貌似調用的是Person中的show();,然而從輸出的結果看調用的卻是Male類中的show();這就是動態綁定的結果,它能在運行時找到實際最適合類型的方法進行調用