1. 程式人生 > >java中的動態繫結

java中的動態繫結

上程式碼:

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。