靜態綁定和動態綁定

一.定義: 

1.方法綁定:一個方法被調用時該方法關聯其方法體的過程。 
2.靜態綁定:在面向過程的中又稱爲前期綁定在程序編譯時進行了綁定,即在還沒運行時,就已經加載到內存。 
3.動態綁定:在面向過程中稱爲後期綁定(運行時綁定)在運行時就進行綁定,根據實際情況有選擇的進行綁定。 


二.優越性: 

         動態綁定靈活性相對靜態綁定來說要高,因爲它在運行之前可以進行選擇性的綁定,很多時候優點就是缺點,正是因爲選擇性的綁定,所以動態綁定的執行效率要低些(因爲,綁定對象,還要進行編譯)。 

三.靜態綁定實例: 

Java代碼 複製代碼
  1. //父類   
  2. public class Person {   
  3.        
  4.     protected String attribute="人的特性";   
  5.   
  6. }   
  7.   
  8. //子類   
  9. public class Male extends Person {   
  10.   
  11.     protected String attribute = "男人的特性";   
  12.   
  13.        
  14. }   
  15. //測試   
  16.   
  17. public class Tester {   
  18.   
  19. public static void main(String[] args) {   
  20.   
  21.         Person p = new Male();   
  22.   
  23.         System.out.println("" + p.attribute);   
  24.     }   
  25.   
  26.   
  27. }  
[java] view plain copy
  1. <span style="font-size: medium;"><span style="font-family: comic sans ms,sans-serif;">//父類  
  2. public class Person {  
  3.       
  4.     protected String attribute="人的特性";  
  5.   
  6. }  
  7.   
  8. //子類  
  9. public class Male extends Person {  
  10.   
  11.     protected String attribute = "男人的特性";  
  12.   
  13.       
  14. }  
  15. //測試  
  16.   
  17. public class Tester {  
  18.   
  19. public static void main(String[] args) {  
  20.   
  21.         Person p = new Male();  
  22.   
  23.         System.out.println("" + p.attribute);  
  24.     }  
  25.   
  26.   
  27. }  
  28.   
  29.   
  30. </span></span>  




輸出結果:人的屬性 

可以看出子類的對象調用到的是父類的成員變量。所以必須明確,動態綁定針對的範疇只是對象的方法。 


static 塊靜態加載: 

Java代碼 複製代碼
  1. public class StaticTest {   
  2.   
  3.     static {   
  4.   
  5.         System.out.println("沒有主方法我照樣執行");   
  6.     }   
  7. }  
[java] view plain copy
  1. <span style="font-size: medium;"><span style="font-family: comic sans ms,sans-serif;">public class StaticTest {  
  2.   
  3.     static {  
  4.   
  5.         System.out.println("沒有主方法我照樣執行");  
  6.     }  
  7. }</span></span>  



運行結果: 
沒有主方法我照樣執行
Java.lang.NoSuchMethodError: main 
Exception in thread "main"  


java中的變量都是靜態綁定的; 
構造方法 以及private,static,final類方法的調用都是靜態綁定的。 

四.動態綁定實例: 

Java代碼 複製代碼
  1. //父類   
  2. public class Person {   
  3.      
  4.   public void  show(){   
  5.      System.out.println("人的特性");   
  6.   }   
  7. }   
  8. //子類   
  9. public class Male extends Person{   
  10.   
  11.    public void show(){   
  12.   
  13.     System.out.println("男人的特性");   
  14. }   
  15. }   
  16. //測試   
  17. public  class Tester{   
  18.   
  19. public static void main(String [] args){   
  20.                
  21.         Person p = new Male();   
  22.         p.show();   
  23.     }   
  24. }  
[java] view plain copy
  1. <span style="font-size: medium;"><span style="font-family: comic sans ms,sans-serif;">//父類  
  2. public class Person {  
  3.     
  4.   public void  show(){  
  5.      System.out.println("人的特性");  
  6.   }  
  7. }  
  8. //子類  
  9. public class Male extends Person{  
  10.   
  11.    public void show(){  
  12.   
  13.     System.out.println("男人的特性");  
  14. }  
  15. }  
  16. //測試  
  17. public  class Tester{  
  18.   
  19. public static void main(String [] args){  
  20.               
  21.         Person p = new Male();  
  22.         p.show();  
  23.     }  
  24. }  
  25. </span></span>  



運行結果:男人的特性 

上面當創建一個Male類對象,通過繼承的關係向上轉型立即賦值給Person類的對象,貌似調用的是Person中的show();,然而從輸出的結果看調用的卻是Male類中的show();這就是動態綁定的結果,它能在運行時找到實際最適合類型的方法進行調用 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章