java中的動態繫結
阿新 • • 發佈:2018-12-09
上程式碼:
class A { int i = 1; A(){ } A(int x) { i=x; } public void show() { System.out.println("A::show "+i); } } class B extends A { int i = 5; int j = 6; B(){ } B(int x,int y) { i=y; } public void show() { System.out.println("B::show "+i); } public void sonfun() { System.out.println("子類方法"); } } public class JTest { public static void main(String[] args) { B b = new B(); b.show(); System.out.println(b.i); A a = new A(); a.show(); System.out.println(a.i); A c = new B(); c.show(); System.out.println(c.i); //c.sonfun(); //System.out.println(c.j); A d = new B(1,2); //A e = new B(1); //B f = new B(1); } }
執行結果:
B::show 5
5
A::show 1
1
B::show 5
1
java中的動態繫結,具體表現在以父類引用指向子類物件,在以上程式碼中,c指向的是一個A類,呼叫的屬性和方法也都是A類中的屬性和方法,由於方法show()在子類中被重寫(overwrite),所以在執行時判斷當前物件為子類A,所以呼叫時指向了子類;而方法sonfun()只是子類的方法,所以父類無法訪問到。
建構函式當然只能使用B的建構函式,並且建構函式無法繼承。
靜態繫結:在程式編譯的過程中,就可以判斷當前呼叫哪個方法,或者說這個方法屬於哪個類。(以static、private等修飾)
動態繫結:在程式執行的時候判斷呼叫哪個類的方法。
this指標:方法內部所用屬性為當前物件的屬性。即c.getI()會返回子類的i,而c.i會返回父類的i。