動態綁定
動態綁定是指編譯器在編譯階段不知道要調用哪個方法
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. 訪問成員變量