動態綁定和靜態綁定


動態綁定

動態綁定是指編譯器在編譯階段不知道要調用哪個方法

Parent父類,父類有兩個方法一個是類方法shout,一個是實例方法say

public class Parent {
    String name;
    public static void shout(){
        System.out.println("我是父類shout靜態方法");
    }

    public void say(){
        System.out.println("我是父類say方法");
    }
}
   
   
  
  
          

Son子類繼承父類,並重寫了say實例方法

public class Son extends Parent {
    String name;
    @Override
    public void say() {
        System.out.println("我是子類say");
    }
}
   
   
  
  
          

測試函數

public class MainTest {
    public static void main(String[] args) {
        Parent parent = new Parent();
        Parent son = new Son();
        parent.say();
        son.say();
    }
}
   
   
  
  
          

聲明的兩個對象都是parent類型,但運行時他們指向的都是不同的對象類型

雖然調用的是say方法但是編譯器在編譯階段不能確定調用的是子類還是父類的方法,方法的動態綁定是基於實際的對象類型,而不是它們聲明的對象引用類型

靜態綁定

我們知道靜態方法不能被重寫,為什么呢,其實這就和靜態綁定有關.編譯器在編譯期間就能完成綁定的叫做靜態綁定也叫前期綁定,基本上實例方法都在運行時綁定,靜態方法是靜態綁定在編譯期間就已經決定的

給父類和子類同時加上靜態方法

public static void shout(){
        System.out.println("我是父類shout靜態方法");
}
   
   
  
  
          
public static void shout(){
        System.out.println("我是子類shout靜態方法");
}
   
   
  
  
          

測試

public static void main(String[] args) {
        Parent parent = new Parent();
        Parent son = new Son();
        parent.shout();
        son.shout();
    }
   
   
  
  
          

運行結果

我是父類shout靜態方法
我是父類shout靜態方法
   
   
  
  
          

雖然java允許重寫靜態方法但是無效,調用的靜態方法是父類的靜態方法

成員變量的靜態綁定

父類添加屬性

String name="parent";
   
   
  
  
          

子類添加屬性

String name="son";
   
   
  
  
          

測試

public static void main(String[] args) {
        Parent parent = new Parent();
        Parent son = new Son();
        System.out.println(son.name);
        System.out.println(parent.name);
    }
   
   
  
  
          

運行結果

parent
parent
   
   
  
  
          

總結一下靜態綁定存在於以下幾種情況
1. 類方法
2. 私有方法(不會被繼承)
3. 訪問成員變量


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM